# Task OP-12308 - Research iCal possibilities

Project: OpenProject
Status: closed
URL: https://community.openproject.org/work_packages/OP-12308

## Details

| Attribute | Value |
| --- | --- |
| Assignee |  |
| Date |  |
| Priority | Medium |
| Target versions | 13.0.0 |
| Category |  |
| Labels |  |

## Description

# Attribute mapping

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table">
<thead class="op-uc-table--head"><tr class="op-uc-table--row">
<th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Example</th>
<th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Work package attribute</th>
<th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">mapped iCal attribute</th>
<th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">iCal notes</th>
</tr></thead>
<tbody>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">OpenProject GmbH//OpenProject Core Project//EN</td>
<td class="op-uc-p op-uc-table--cell">Container calendar and company</td>
<td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-7-3-product-identifier.html">PRODID</a></td>
<td class="op-uc-p op-uc-table--cell">This is a MUST in iCal and specifies who created this iCal and for what and its never represented in the UI</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">V1.0</td>
<td class="op-uc-p op-uc-table--cell">Version of the iCal</td>
<td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-7-4-version.html">VERSION</a></td>
<td class="op-uc-p op-uc-table--cell">This is the version of iCal and is a MUST and it is not represented in the UI</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">-</td>
<td class="op-uc-p op-uc-table--cell">Work package (type of calendar entry)</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-6-1-event-component.htmlhttps://icalendar.org/iCalendar-RFC-5545/3-6-1-event-component.html">VEVENT</a> or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-6-3-journal-component.html">VJOURNAL</a>
</td>
<td class="op-uc-p op-uc-table--cell">VJOURNAL seemed the most ideal event as basically a Journal entry without need to be a meeting or a event but it is not displayed properly in a lot of calendars therefore I tried also a normal VEVENT.</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">  @community.openproject.com</td>
<td class="op-uc-p op-uc-table--cell">Calendar entry ID</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-7-unique-identifier.html">UID</a> (id)</td>
<td class="op-uc-p op-uc-table--cell">This is a MUST in iCAL and must be unique for each calendar entry in all the iCal and therefore is recommended to use specific methods of creation <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-7-unique-identifier.html">explained here</a>
</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"> </td>
<td class="op-uc-p op-uc-table--cell">Work package ID</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-1-iana-properties.html">IANA</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">This can be added in the calendar entry as a "IANA" extra property. All compliant applications are expected to be able to parse but it can be that they are ignored.</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://community.openproject.org/projects/openproject/work_packages/15339">.../openproject/work_packages/15339</a></td>
<td class="op-uc-p op-uc-table--cell">Work package URL</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-6-uniform-resource-locator.html">URL</a> (link) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-7-location.html">LOCATION</a>
</td>
<td class="op-uc-p op-uc-table--cell">Not clear if this information is shared with the iCal "URI" or should be included as an LOCATION to be displayed (or in the description)</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">Share project calendars using the iCalendar format</td>
<td class="op-uc-p op-uc-table--cell">Subject</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-12-summary.html">SUMMARY</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">The subject could be directly matched as the "SUMMARY" of the calendar entry</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">Delivering the first version of the new fancy product.</td>
<td class="op-uc-p op-uc-table--cell">Description</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-5-description.html">DESCRIPTION</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">The description is always displayed in the calendar entries. We need to decide what is the content we want to display in this description as I assume we don't want to show the full WP description here.</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">closed</td>
<td class="op-uc-p op-uc-table--cell">Status</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-2-categories.html">CATEGORIES</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">"STATUS" is limited to the type of entry journal and there is not a lot of options, <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-11-status.html">see here</a>
</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">Epic</td>
<td class="op-uc-p op-uc-table--cell">Work package type</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-2-categories.html">CATEGORIES</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">iCal "TYPE" will not work here as it specifies the type of calendar not of each entry.</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">Medium</td>
<td class="op-uc-p op-uc-table--cell">Priority</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-9-priority.html">PRIORITY</a> (integer)</td>
<td class="op-uc-p op-uc-table--cell">"PRIORITY" can be used to see the priority in between the elements of a calendar and they are defined by numbers form 0 to 9 that can be ranged also as LOW, MEDIUM and HIGH</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">Tobias Nöbauer</td>
<td class="op-uc-p op-uc-table--cell">Author</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-3-organizer.html">ORGANIZER</a> (cal-address) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-2-contact.html">CONTACT</a> (text)</td>
<td class="op-uc-table--cell">
<p class="op-uc-p">If we extract the Author and map it as Organizer this could appear in the iCal invite</p>
<p class="op-uc-p">This is even possible with LDAP URI</p>
</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"> </td>
<td class="op-uc-p op-uc-table--cell">Assignee</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-2-contact.html">CONTACT</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">We could use the assignee and map it with the "CONTACT" reference in the calendar entry. This is even possible with LDAP URI. But cannot be used if used for Author</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">20.01.2023</td>
<td class="op-uc-p op-uc-table--cell">Creation date</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-7-1-date-time-created.html">CREATED</a> (date-time)</td>
<td class="op-uc-p op-uc-table--cell">Maps the WP creation date with</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">20.01.2023</td>
<td class="op-uc-p op-uc-table--cell">Last modification date</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-7-3-last-modified.html">LAST-MODIFIED</a> (date-time)</td>
<td class="op-uc-p op-uc-table--cell">We could map the last modification date in the activity with the "LAST-MODIFIED"</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"> </td>
<td class="op-uc-p op-uc-table--cell">Start date</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-4-date-time-start.html">DTSTART</a> (date)</td>
<td class="op-uc-p op-uc-table--cell"></td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"> </td>
<td class="op-uc-p op-uc-table--cell">Finish date</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-2-date-time-end.html">DTEND</a> or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-3-date-time-due.html">DUE</a> (date)</td>
<td class="op-uc-p op-uc-table--cell">Need to see what works better if "DTEND" or "DUE"</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell"> </td>
<td class="op-uc-p op-uc-table--cell">Duration</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-3-6-duration.html">DURATION</a> (duration)</td>
<td class="op-uc-p op-uc-table--cell"></td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">
<mention class="mention" data-id="25541" data-type="work_package" data-text="#25541"><mention class="mention" data-id="25541" data-type="work_package" data-text="#25541">#25541</mention></mention> </td>
<td class="op-uc-p op-uc-table--cell">Parent work package</td>
<td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-5-related-to.html">RELATED-TO</a></td>
<td class="op-uc-p op-uc-table--cell">Can be used to establish if the work package is related to any other calendar entries (WP)</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">-</td>
<td class="op-uc-p op-uc-table--cell">Any other information</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-4-comment.html">COMMENT</a> (text)</td>
<td class="op-uc-p op-uc-table--cell">Everything can be always added to an extra section besides the description called "COMMENT"</td>
</tr>
<tr class="op-uc-table--row">
<td class="op-uc-p op-uc-table--cell">-</td>
<td class="op-uc-p op-uc-table--cell">Extra custom values</td>
<td class="op-uc-p op-uc-table--cell">
<a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-1-iana-properties.html">IANA</a> (text) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-2-non-standard-properties.html">X-</a> (text with other type acceptance)</td>
<td class="op-uc-p op-uc-table--cell">This are extra full custom properties that all compliant applications are expected to be able to parse but it can be that they are ignored.</td>
</tr>
</tbody>
</table></figure>

# Ideal iCal example

Using this work package as example the journal entry in a iCalendar ideal format should be:

``` text
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//OpenProject GmbH//OpenProject Core Project//EN
BEGIN:VEVENT
DTSTAMP:20230120T000000
CREATED:20230120T151920
LAST-MODIFIED:20230120T183250
DTSTART:20230112T000000
DTEND:20230415T000000
DURATION:P94D
UID:15339@community.openproject.com
WPID:15339
URL:https://community.openproject.org/projects/
	openproject/work_packages/15339
ORGANIZER;CN=Max Mustermann:mailto:m.mustermann@example.com
CONTACT:Jonas Rietz\, OpenProject GmbH\, mailto:j.rietz@example.com
SUMMARY:Share project calendars using the iCalendar format
DESCRIPTION:Work package description:/User Story/
	As a project team member/I want to see my project 
	calendar in my personal calendar/So that I don't 
	have to maintain two different calendars to organize 
    my work.
CATEGORIES:🟩 FEATURE,In development
PRIORITY:5
RELATED-TO:25541@community.openproject.com
END:VJOURNAL
END:VCALENDAR
```

This code has been successfully validated using the [iCalendar Validator](https://icalendar.org/validator.html#results) and it has no errors. Also you can download the ICS file that I'm using to try all this configurations [here](https://community.openproject.org/api/v3/attachments/49599/content).

# Calendar clients UI

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Work package attribute</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">mapped iCal attribute</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">OX</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Thunderbird</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Mailbox</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Outlook</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Yahoo</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Google Calendar</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Google Calendar (Android)</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Calendar (MAC)</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Calendar (iOS)</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">BusyCal</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">OneCalendar</th><th class="op-uc-p op-uc-table--cell op-uc-table--cell_head">Fantastical</th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Container calendar and company</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-7-3-product-identifier.html">PRODID</a></td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Version of the iCal</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-7-4-version.html">VERSION</a></td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Work package (type of calendar entry)</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-6-1-event-component.htmlhttps://icalendar.org/iCalendar-RFC-5545/3-6-1-event-component.html">VEVENT</a> or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-6-3-journal-component.html">VJOURNAL</a></td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td><td class="op-uc-p op-uc-table--cell">-</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Calendar entry ID</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-7-unique-identifier.html">UID</a> (id)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Work package ID</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-1-iana-properties.html">IANA</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Displayed with the IANA name</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Work package URL</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-6-uniform-resource-locator.html">URL</a> (link) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-7-location.html">LOCATION</a></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>URL or Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>URL or Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>URL or Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>URL</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Location</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Subject</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-12-summary.html">SUMMARY</a> (text)</td><td class="op-uc-p op-uc-table--cell"><strong>Title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Subject</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Event title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Title</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Event name</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Event name</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Event name</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Subject</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Subject</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Description</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-5-description.html">DESCRIPTION</a> (text)</td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Notes</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Notes</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Description</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Status</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-2-categories.html">CATEGORIES</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Category</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Category</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Tags</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Work package type</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-2-categories.html">CATEGORIES</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Category</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Category</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Tags</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Priority</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-9-priority.html">PRIORITY</a> (integer)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Priority</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Author</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-3-organizer.html">ORGANIZER</a> (cal-address) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-2-contact.html">CONTACT</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed (it display you as organiser)</td><td class="op-uc-p op-uc-table--cell"><strong>Organizer</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed (it display you as organiser)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Invited (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Invitee (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Invitee (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Invitee (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Invitee (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Organiser</strong></td><td class="op-uc-p op-uc-table--cell"><strong>People (organiser)</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Invitee (organiser)</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Assignee</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-2-contact.html">CONTACT</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Invitees</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Creation date</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-7-1-date-time-created.html">CREATED</a> (date-time)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Last modification date</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-7-3-last-modified.html">LAST-MODIFIED</a> (date-time)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Edited</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Start date</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-4-date-time-start.html">DTSTART</a> (date)</td><td class="op-uc-p op-uc-table--cell"><strong>Starts on</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Starts on</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Start</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Finish date</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-2-date-time-end.html">DTEND</a> or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-2-3-date-time-due.html">DUE</a> (date)</td><td class="op-uc-p op-uc-table--cell"><strong>Ends on</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Ends on</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Finish date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Finish date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>Due date</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End</strong></td><td class="op-uc-p op-uc-table--cell"><strong>End</strong></td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Duration</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-3-6-duration.html">DURATION</a> (duration)</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td><td class="op-uc-p op-uc-table--cell">Established by dates but not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Parent work package</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-4-5-related-to.html">RELATED-TO</a></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Any other information</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-1-4-comment.html">COMMENT</a> (text)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr><tr class="op-uc-table--row"><td class="op-uc-p op-uc-table--cell">Extra custom values</td><td class="op-uc-p op-uc-table--cell"><a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-1-iana-properties.html">IANA</a> (text) or <a class="op-uc-link" href="https://icalendar.org/iCalendar-RFC-5545/3-8-8-2-non-standard-properties.html">X-</a> (text with other type acceptance)</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell"><strong>Displayed with the X- or IANA name</strong></td><td class="op-uc-p op-uc-table--cell">Not displayed</td><td class="op-uc-p op-uc-table--cell">Not displayed</td></tr></tbody></table></figure>

# Conclusion and iCal construction

After all the analysis, unfortunately the majority of the iCal events that are described in their documentation are not displayed at all in the most common calendar clients. Therefore we will need to use the field that are displayed in all the clients to ensure that all the work package information is displayed:

  - **LOCATION:** For the work package ***URL***
  - **SUMMARY:** For the work package ***subject***. We've decoded to not display the ***work package ID***.
  - **DESCRIPTION:** After the first discussion we decided to display this elements in the descrpition:
    1.  Project
    2.  Type (with a square colour emoji)
    3.  Status
    4.  Assignee
    5.  Priority (with a round colour emoji)
    6.  Description (up to X characters of the description)
  - **ORGANIZER:** For the ***author, assignee or accountable (TBD)*** of the work package.
  - **DTSTART:** For the work package ***start date***.
  - **DTEND:** For the work package ***finish date***.

With this information this would be one of the examples for a work package iCalendar event code ([download and try it here](https://community.openproject.org/api/v3/attachments/49712/content)):

``` text
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//OpenProject GmbH//OpenProject Core Project//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-CALNAME:OpenProject Calendar
BEGIN:VEVENT
UID:15339@community.openproject.com
LOCATION:https://community.openproject.org/projects/openproject/work_packages/15339
SUMMARY:Share project calendars using the iCalendar format
DESCRIPTION:Project: OpenProject\nType: 🟩 FEATURE\nStatus: In development\nAssignee: Max Mustermann\nPriority: 🟢 Medium\n\rWork package description: User Story As a project team member I want to see my project calendar in my personal calendar So that I don't have to maintain two different calendars to organize my work...
DTSTART;VALUE=DATE:20230112
DTEND;VALUE=DATE:20230415
END:VEVENT
END:VCALENDAR
```

# Calendar entries examples

<img class="op-uc-image op-uc-image_inline" style="width:189px;" src="/api/v3/attachments/49630/content"><img class="op-uc-image op-uc-image_inline" style="width:661px;" src="/api/v3/attachments/49631/content">  
<img class="op-uc-image op-uc-image_inline" style="width:189px;" src="/api/v3/attachments/49629/content"><img class="op-uc-image op-uc-image_inline" style="width:660px;" src="/api/v3/attachments/49632/content"><img class="op-uc-image op-uc-image_inline" style="width:662px;" src="/api/v3/attachments/49636/content"><img class="op-uc-image op-uc-image_inline" style="width:663px;" src="/api/v3/attachments/49634/content"><img class="op-uc-image op-uc-image_inline" style="width:661px;" src="/api/v3/attachments/49635/content"><img class="op-uc-image op-uc-image_inline" style="width:662px;" src="/api/v3/attachments/49633/content">
