diff --git a/src/Calendar.tsx b/src/Calendar.tsx index 25b712b..92214fa 100644 --- a/src/Calendar.tsx +++ b/src/Calendar.tsx @@ -33,6 +33,14 @@ class Calendar extends React.Component { } }); + function eventPropGetter(event: EventType) { + return { + style: { + backgroundColor: event.color, + } + }; + } + return (
{ this.setState({currentDate}); }} /> diff --git a/src/Journal.tsx b/src/Journal.tsx index adb7d9d..3bab481 100644 --- a/src/Journal.tsx +++ b/src/Journal.tsx @@ -66,10 +66,12 @@ class Journal extends React.Component { let itemsTitle: string; let itemsView: JSX.Element; if (collectionInfo.type === 'CALENDAR') { - itemsView = ; + itemsView = + ; itemsTitle = 'Events'; } else if (collectionInfo.type === 'ADDRESS_BOOK') { - itemsView = ; + itemsView = + ; itemsTitle = 'Contacts'; } else { itemsView =
Unsupported type
; diff --git a/src/Pim.tsx b/src/Pim.tsx index 292091b..90c11c1 100644 --- a/src/Pim.tsx +++ b/src/Pim.tsx @@ -61,9 +61,9 @@ class Pim extends React.Component { }); if (collectionInfo.type === 'ADDRESS_BOOK') { - syncEntriesAddressBook.push(syncEntriesToItemMap(syncEntries)); + syncEntriesAddressBook.push(syncEntriesToItemMap(collectionInfo, syncEntries)); } else if (collectionInfo.type === 'CALENDAR') { - syncEntriesCalendar.push(syncEntriesToCalendarItemMap(syncEntries)); + syncEntriesCalendar.push(syncEntriesToCalendarItemMap(collectionInfo, syncEntries)); } } diff --git a/src/journal-processors.tsx b/src/journal-processors.tsx index 3ecc0c2..2e70093 100644 --- a/src/journal-processors.tsx +++ b/src/journal-processors.tsx @@ -4,7 +4,7 @@ import { EventType, ContactType } from './pim-types'; import * as EteSync from './api/EteSync'; -export function syncEntriesToItemMap(entries: EteSync.SyncEntry[]) { +export function syncEntriesToItemMap(collection: EteSync.CollectionInfo, entries: EteSync.SyncEntry[]) { let items: {[key: string]: ContactType} = {}; for (const syncEntry of entries) { @@ -23,9 +23,32 @@ export function syncEntriesToItemMap(entries: EteSync.SyncEntry[]) { return items; } -export function syncEntriesToCalendarItemMap(entries: EteSync.SyncEntry[]) { +function colorIntToHtml(color: number) { + if (color === undefined) { + return '#8BC34A'; + } + + // tslint:disable:no-bitwise + const blue = color & 0xFF; + const green = (color >> 8) & 0xFF; + const red = (color >> 16) & 0xFF; + const alpha = (color >> 24) & 0xFF; + // tslint:enable + + function toHex(num: number) { + let ret = num.toString(16); + return (ret.length === 1) ? '0' + ret : ret; + } + + return '#' + toHex(red) + toHex(green) + toHex(blue) + + ((alpha > 0) ? toHex(alpha) : ''); +} + +export function syncEntriesToCalendarItemMap(collection: EteSync.CollectionInfo, entries: EteSync.SyncEntry[]) { let items: {[key: string]: EventType} = {}; + const color = colorIntToHtml(collection.color); + for (const syncEntry of entries) { let comp = new EventType(new ICAL.Component(ICAL.parse(syncEntry.content)).getFirstSubcomponent('vevent')); @@ -33,6 +56,8 @@ export function syncEntriesToCalendarItemMap(entries: EteSync.SyncEntry[]) { continue; } + comp.color = color; + const uid = comp.uid; if ((syncEntry.action === EteSync.SyncEntryAction.Add) || diff --git a/src/pim-types.tsx b/src/pim-types.tsx index c461a9c..db5b4bd 100644 --- a/src/pim-types.tsx +++ b/src/pim-types.tsx @@ -1,6 +1,8 @@ import * as ICAL from 'ical.js'; export class EventType extends ICAL.Event { + color: string; + get title() { return this.summary; }