Add location to events
This commit is contained in:
parent
587e29ec6a
commit
03e284b7dc
1 changed files with 58 additions and 48 deletions
106
src/calendar.js
106
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]))
|
||||
);
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue