From f18fe23ea5d7bafaa01a3be17e0450e694f7b191 Mon Sep 17 00:00:00 2001 From: Tero Kivinen Date: Thu, 12 Nov 2020 22:15:23 +0000 Subject: [PATCH] New version of the timezone support for agenda. Now the ongoing bars work. This also moves the javascript from the agenda.html to separate timezone.js file. This commit does not include the moment and moment-timezone javascript libraries that are needed to get this working, they need to be added to ietf/externals/static separately. - Legacy-Id: 18689 --- ietf/meeting/helpers.py | 3 + ietf/meeting/views.py | 11 + ietf/static/ietf/css/ietf.css | 60 +++++ ietf/static/ietf/js/agenda/timezone.js | 255 ++++++++++++++++++ ietf/templates/meeting/agenda.html | 90 +++++-- .../templates/meeting/timeslot_start_end.html | 6 +- 6 files changed, 407 insertions(+), 18 deletions(-) create mode 100644 ietf/static/ietf/js/agenda/timezone.js diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index db766c5ab..cdc19f781 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -238,6 +238,9 @@ def preprocess_assignments_for_agenda(assignments_queryset, meeting, extra_prefe d.get_href(meeting=meeting) d.get_versionless_href(meeting=meeting) + a.start_timestamp = int(a.timeslot.utc_start_time().timestamp()) + a.end_timestamp = int(a.timeslot.utc_end_time().timestamp()) + return assignments def tag_assignments_with_filter_keywords(assignments): diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 9b67eb2f3..511af1962 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -1459,6 +1459,7 @@ def agenda(request, num=None, name=None, base=None, ext=None, owner=None, utc="" "filter_categories": filter_categories, "non_area_keywords": [label.lower() for label in non_area_labels], "now": datetime.datetime.now(), + "timezone": meeting.time_zone, "is_current_meeting": is_current_meeting, "use_codimd": True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False, "cache_time": 150 if is_current_meeting else 3600, @@ -3350,6 +3351,16 @@ def upcoming(request): entries.extend(list(interim_sessions)) entries.sort(key = lambda o: pytz.utc.localize(datetime.datetime.combine(o.date, datetime.datetime.min.time())) if isinstance(o,Meeting) else o.official_timeslotassignment().timeslot.utc_start_time()) + for o in entries: + if isinstance(o, Meeting): + o.start_timestamp = int(pytz.utc.localize(datetime.datetime.combine(o.date, datetime.datetime.min.time())).timestamp()) + o.end_timestamp = int(pytz.utc.localize(datetime.datetime.combine(o.end, datetime.datetime.max.time())).timestamp()) + else: + o.start_timestamp = int(o.official_timeslotassignment(). + timeslot.utc_start_time().timestamp()); + o.end_timestamp = int(o.official_timeslotassignment(). + timeslot.utc_end_time().timestamp()); + # add menu entries menu_entries = get_interim_menu_entries(request) selected_menu_entry = 'upcoming' diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css index 903ee0180..c1474b23b 100644 --- a/ietf/static/ietf/css/ietf.css +++ b/ietf/static/ietf/css/ietf.css @@ -1460,3 +1460,63 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container { width: 10em; } +.rightmarker, .leftmarker { + width: 3px; + padding-right: 0px !important; + padding-left: 0px !important; +} +.ongoing > td:first-child { + background-color: red !important; +} + +.ongoing > td:last-child { + background-color: red !important; +} + +.timetooltip { + position: relative; +} + +.timetooltip .timetooltiptext { + visibility: hidden; + background-color: #eee; + color: #000; + text-align: left; + border-radius: 6px; + padding: 5px 5px; + position: absolute; + z-index: 110; + bottom: 125%; + left: 50%; + margin-left: -60px; + opacity: 0; + transition: opacity 0.3s; + width: 60em; +} + +.reschedtimetooltip .timetooltiptext { + margin-left: -300px; +} + +.timetooltiptext table tr td { + padding: 1px 5px; +} + +.timetooltiptext table tr th { + text-align: center; +} + +.timehead { + text-align: right; + font-weight: bold; +} + +.timetooltip:hover .timetooltiptext { + visibility: visible; + opacity: 1; +} + +#current-time { + display: inline-block; +} + diff --git a/ietf/static/ietf/js/agenda/timezone.js b/ietf/static/ietf/js/agenda/timezone.js new file mode 100644 index 000000000..914bc8eb8 --- /dev/null +++ b/ietf/static/ietf/js/agenda/timezone.js @@ -0,0 +1,255 @@ +// Initialize moments +function initialize_moments() { + var times=$('span.time') + $.each(times, function(i, item) { + item.start_ts = moment.unix(this.getAttribute("data-start-time")).utc(); + item.end_ts = moment.unix(this.getAttribute("data-end-time")).utc(); + if (this.hasAttribute("weekday")) { + item.format=2; + } else { + item.format=1; + } + if (this.hasAttribute("format")) { + item.format = +this.getAttribute("format"); + } + }); + var times=$('[data-slot-start-ts]') + $.each(times, function(i, item) { + item.slot_start_ts = moment.unix(this.getAttribute("data-slot-start-ts")).utc(); + item.slot_end_ts = moment.unix(this.getAttribute("data-slot-end-ts")).utc(); + }); +} + +// Initialize timezone system +function timezone_init(current) { + var tz_names = moment.tz.names(); + var select = $('#timezone_select'); + + $.each(tz_names, function(i, item) { + if (current == item) { + select.append($('