From 03e284b7dcf9cd2a69720757c396c7196ef4c937 Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Sun, 6 Mar 2022 00:59:11 +0100 Subject: [PATCH] Add location to events --- src/calendar.js | 106 ++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/src/calendar.js b/src/calendar.js index e96de0b..115f0dc 100644 --- a/src/calendar.js +++ b/src/calendar.js @@ -1,110 +1,118 @@ -import ICAL from 'ical.js'; +import ICAL from 'ical.js' const clouds = { - KLUB_RESEAU: "klub-reseau", - ELEVES_ENS: "eleves-ens" -}; + KLUB_RESEAU: 'klub-reseau', + ELEVES_ENS: 'eleves-ens' +} const calendars = { - "5WrcagPPARQ3BD87": { + '5WrcagPPARQ3BD87': { cloud: clouds.KLUB_RESEAU, - name: "Club réseau", + name: 'Club réseau', color: null }, - "TFEAKjAgNFQZpNjo": { + TFEAKjAgNFQZpNjo: { cloud: clouds.KLUB_RESEAU, - name: "hackENS", + name: 'hackENS', color: null }, - "LLWm8qK9iC5YGrrR": { + LLWm8qK9iC5YGrrR: { cloud: clouds.ELEVES_ENS, - name: "Délégation Générale", - short_name: "DG", + name: 'Délégation Générale', + short_name: 'DG', color: null - }, -}; + } +} export const calendarTree = { - "Clubs COF": { - "Club réseau": {}, - "hackENS": {}, + 'Clubs COF': { + 'Club réseau': {}, + hackENS: {} }, - "COF": { - "BDA": { - "Philharmonie": {}, + COF: { + BDA: { + Philharmonie: {} }, - "AG": {}, + AG: {} }, - "BDS": {}, - "Délégation Générale": {}, -}; + BDS: {}, + 'Délégation Générale': {} +} -const calendarIds = Object.keys(calendars); +const calendarIds = Object.keys(calendars) function mkCalendarUrl(id, { cloud }) { - return `/cal/${cloud}/${id}/?export&accept=jcal`; + return `/cal/${cloud}/${id}/?export&accept=jcal` } function fetchCalendar(id, cal) { - return fetch(mkCalendarUrl(id, cal), { credentials: 'omit' }).then(resp => resp.json()).catch(err => console.error(err)); + return fetch(mkCalendarUrl(id, cal), { credentials: 'omit' }) + .then(resp => resp.json()) + .catch(err => console.error(err)) } class Calendar { - constructor (id, calendar) { - const metadata = calendars[id]; - this.name = metadata.name; - this.color = metadata.color || calendar[1][4][3]; - this.events = calendar[2].filter(item => item[0] === 'vevent').map(item => this._parse_vevent(item[1])); + constructor(id, calendar) { + const metadata = calendars[id] + this.name = metadata.name + this.color = metadata.color || calendar[1][4][3] + this.events = calendar[2] + .filter(item => item[0] === 'vevent') + .map(item => this._parse_vevent(item[1])) } _parse_vevent(vevent) { - const event = {}; + const event = {} vevent.forEach(elt => { - event[elt[0]] = elt[3]; - }); - return event; + event[elt[0]] = elt[3] + }) + return event } } function fcEventFromjCalEvent(cal) { return function (evt) { - const start = new Date(evt.dtstart); - const end = new Date(evt.dtend); + const start = new Date(evt.dtstart) + const end = new Date(evt.dtend) const fcEvent = { title: `${cal.name}: ${evt.summary}`, start: evt.dtstart, end: evt.dtend, color: cal.color, duration: end - start // in ms - }; + } if (evt.description) { - fcEvent.description = evt.description; + fcEvent.description = evt.description + } + + if (evt.location) { + fcEvent.location = evt.location } if (evt.rrule) { - const { freq, byday, interval } = evt.rrule; + const { freq, byday, interval } = evt.rrule fcEvent.rrule = { freq, byweekday: byday, - dtstart: evt.dtstart, - }; + dtstart: evt.dtstart + } if (interval) { - fcEvent.rrule.interval = interval; + fcEvent.rrule.interval = interval } } - return fcEvent; + return fcEvent } } function mkEventsFromCalendar(id, cal) { return fetchCalendar(id, cal).then(calendar => { - if (calendar[0] !== 'vcalendar') return; + if (calendar[0] !== 'vcalendar') return const cal = new Calendar(id, calendar) return cal.events.map(fcEventFromjCalEvent(cal)) - }); + }) } export function mkEvent(title, start, duration, ...rest) { @@ -123,7 +131,9 @@ export function mkEvent(title, start, duration, ...rest) { export function refreshEvents(selectedCalendars) { return Promise.all( calendarIds - .filter(id => selectedCalendars ? selectedCalendars.includes(calendars[id].name) : true) + .filter(id => + selectedCalendars ? selectedCalendars.includes(calendars[id].name) : true + ) .map(id => mkEventsFromCalendar(id, calendars[id])) - ); + ) }