{ "id": "147991", "key": "TIMOB-18927", "fields": { "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "16980", "description": "New V8", "name": "Release 6.0.0", "archived": false, "released": true, "releaseDate": "2016-11-15" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2016-07-23T18:56:17.000+0000", "created": "2015-05-20T01:29:29.000+0000", "priority": { "name": "Medium", "id": "3" }, "labels": [ "calendar", "event", "invitee", "organizer" ], "versions": [], "issuelinks": [ { "id": "52230", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "134095", "key": "TIMOB-17450", "fields": { "summary": "Android: Ti.Calendar.Event should expose the attendees of the meeting invite as a property (Parity with iOS)", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Medium", "id": "3" }, "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false } } } } ], "assignee": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "updated": "2016-09-26T21:49:04.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10206", "name": "iOS", "description": "iOS Platform" } ], "description": "Customer (Agilent, VMWare) is looking for a way to fetch event Organiser and Invitees/Attendees details form Ti.Calendar.Event", "attachment": [], "flagged": false, "summary": "iOS: Calendar Event: Allow to fetch event Organiser and Invitees/Attendees details", "creator": { "name": "sliang", "key": "sliang", "displayName": "Shuo Liang", "active": true, "timeZone": "Asia/Harbin" }, "subtasks": [], "reporter": { "name": "sliang", "key": "sliang", "displayName": "Shuo Liang", "active": true, "timeZone": "Asia/Harbin" }, "environment": null, "closedSprints": [ { "id": 685, "state": "closed", "name": "2016 Sprint 16 SDK", "startDate": "2016-07-30T00:40:02.939Z", "endDate": "2016-08-13T00:40:00.000Z", "completeDate": "2016-08-15T08:00:33.056Z", "originBoardId": 114 } ], "comment": { "comments": [ { "id": "391342", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Updated PR: https://github.com/appcelerator/titanium_mobile/pull/8150\r\n\r\nUpdated demo:\r\n{code:javascript}\r\nvar currentYear = 2016;\r\nvar currentMonth = 7;\r\n \r\nvar win = Ti.UI.createWindow({\r\n translucent: false,\r\n title: 'Calendar Demo'\r\n});\r\n\r\nvar list = Ti.UI.createListView({\r\n template: Titanium.UI.LIST_ITEM_TEMPLATE_SUBTITLE,\r\n style: 1\r\n});\r\n\r\nvar nav = Ti.UI.iOS.createNavigationWindow({\r\n window: win\r\n});\r\n\r\nvar fetchEventsButton = Ti.UI.createButton({\r\n title: \"Fetch events\"\r\n});\r\n\r\nfetchEventsButton.addEventListener(\"click\", handlePermissions);\r\nlist.addEventListener(\"itemclick\", handleAttendee);\r\n\r\nwin.setRightNavButton(fetchEventsButton);\r\nwin.add(list); \r\n\r\nfunction handleAttendee(e) {\r\n var attendee = e.section.getItemAt(e.itemIndex).attendee;\r\n \r\n var str = \"E-Mail: \" + attendee.email;\r\n \r\n str += \"\\nRole: \" + formatAttendeeRole(attendee.role);\r\n str += \"\\nType: \" + formatAttendeeType(attendee.type);\r\n str += \"\\nStatus: \" + formatAttendeeStatus(attendee.status);\r\n str += \"\\nIs organizer: \" + (attendee.isOrganizer ? \"Yes\" : \"No\");\r\n \r\n Ti.UI.createAlertDialog({\r\n title: attendee.name,\r\n message: str,\r\n buttonNames: [\"OK\"]\r\n }).show();\r\n \r\n list.deselectItem(e.sectionIndex, e.itemIndex);\r\n}\r\n\r\nfunction formatAttendeeRole(role) {\r\n switch (role) {\r\n case Ti.Calendar.ATTENDEE_ROLE_UNKNOWN:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_UNKNOWN\";\r\n \r\n case Ti.Calendar.ATTENDEE_ROLE_REQUIRED:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_REQUIRED\";\r\n \r\n case Ti.Calendar.ATTENDEE_ROLE_OPTIONAL:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_OPTIONAL\";\r\n \r\n case Ti.Calendar.ATTENDEE_ROLE_CHAIR:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_CHAIR\";\r\n \r\n case Ti.Calendar.ATTENDEE_ROLE_NON_PARTICIPANT:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_NON_PARTICIPANT\"; \r\n }\r\n \r\n return \"Unknown attendee role: \" + role;\r\n}\r\n\r\nfunction formatAttendeeType(type) {\r\n switch (type) {\r\n case Ti.Calendar.ATTENDEE_TYPE_UNKNOWN:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_UNKNOWN\";\r\n \r\n case Ti.Calendar.ATTENDEE_TYPE_PERSON:\r\n return \"Ti.Calendar.ATTENDEE_TYPE_PERSON\";\r\n \r\n case Ti.Calendar.ATTENDEE_TYPE_ROOM:\r\n return \"Ti.Calendar.ATTENDEE_TYPE_ROOM\";\r\n \r\n case Ti.Calendar.ATTENDEE_TYPE_RESOURCE:\r\n return \"Ti.Calendar.ATTENDEE_TYPE_RESOURCE\";\r\n \r\n case Ti.Calendar.ATTENDEE_TYPE_GROUP:\r\n return \"Ti.Calendar.ATTENDEE_TYPE_GROUP\"; \r\n }\r\n \r\n return \"Unknown attendee type: \" + type;\r\n}\r\n\r\nfunction formatAttendeeStatus(status) {\r\n switch (status) {\r\n case Ti.Calendar.ATTENDEE_STATUS_UNKNOWN:\r\n return \"Ti.Calendar.ATTENDEE_ROLE_UNKNOWN\";\r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_PENDING:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_PENDING\";\r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_ACCEPTED:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_ACCEPTED\";\r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_DECLINED:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_DECLINED\";\r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_TENTATIVE:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_TENTATIVE\"; \r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_DELEGATED:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_DELEGATED\"; \r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_COMPLETED:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_COMPLETED\"; \r\n \r\n case Ti.Calendar.ATTENDEE_STATUS_IN_PROCESS:\r\n return \"Ti.Calendar.ATTENDEE_STATUS_IN_PROCESS\"; \r\n }\r\n \r\n return \"Unknown attendee status: \" + status;\r\n}\r\n\r\nfunction handlePermissions() {\r\n\tif (Ti.Calendar.hasCalendarPermissions()) {\r\n\t performCalendarReadFunctions();\r\n\t} else {\r\n\t Ti.Calendar.requestCalendarPermissions(function(e) {\r\n\t if (e.success) {\r\n\t performCalendarReadFunctions();\r\n\t } else {\r\n\t alert('Access to calendar is not allowed: ' + e.error);\r\n\t }\r\n\t });\r\n\t}\r\n}\r\n \r\nfunction performCalendarReadFunctions() {\r\n var calendar = Ti.Calendar.defaultCalendar; \r\n var events = calendar.getEventsInMonth(currentYear, currentMonth); \r\n var sections = [];\r\n \r\n if (events && events.length) {\r\n console.log(events.length + ' event(s) in ' + currentYear);\r\n for (var i = 0; i < events.length; i++) {\r\n \tsections.push(createSectionFromEvent(events[i]));\r\n }\r\n list.setSections(sections);\r\n } else {\r\n console.log('No events in ' + currentMonth + '/' + currentYear + ' found');\r\n }\r\n}\r\n \r\nfunction createSectionFromEvent(event) {\r\n\r\n var items = [];\r\n var attendees = event.attendees;\r\n var section = Ti.UI.createListSection({\r\n headerTitle: event.title + ' (' + attendees.length + ' Attendees)'\r\n });\r\n \r\n\tfor (var i = 0; i < attendees.length; i++) {\r\n var attendee = attendees[i];\r\n var item = {\r\n attendee: attendee,\r\n properties: {\r\n title: attendee.name,\r\n subtitle: attendee.email,\r\n height: 50,\r\n accessoryType: Titanium.UI.LIST_ACCESSORY_TYPE_DISCLOSURE\r\n }\r\n };\r\n \r\n items.push(item);\r\n }\r\n \r\n if (attendees.length == 0) {\r\n items.push({\r\n properties: {\r\n title: 'No attendees',\r\n selectionStyle: Ti.UI.iOS.ListViewCellSelectionStyle.NONE\r\n }\r\n })\r\n }\r\n \r\n section.setItems(items);\r\n \r\n return section;\r\n}\r\n \r\nnav.open();\r\n{code}", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2016-07-23T15:35:10.000+0000", "updated": "2016-07-23T15:42:14.000+0000" }, { "id": "397319", "author": { "name": "amukherjee", "key": "amukherjee", "displayName": "Abir Mukherjee", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Verified fix with Environment:\r\n\r\nNPM Version: 2.15.9 \r\nNode Version: 4.5.0 \r\nMac OS: 10.11.6 \r\nAppc CLI: 5.5.0 \r\nAppc CLI NPM: 4.2.7 \r\nTitanium SDK version: 6.0.0.v20160925202930 \r\nAppcelerator Studio, build: 4.7.1.201609100950 \r\nXcode 8.0 GM\r\n\r\nI was able to reproduce the issue with Titanium SDK version 5.5.0 using the repro code in the Description. I ran the code on an iPhone 6s Plus iOS v10.0.1. I launched the app, clicked on the \"Fetch events\" button, and an \"Application Error\" window appeared.\r\n\r\nI reran the same test script with Titanium SDK version 6.0.0, clicked on \"Fetch events\", and an event which I had put on the calendar displayed as a list. The name of the event along with a list of attendees was shown. Clicking on each attendee showed whether the attendee was an organizer or not.", "updateAuthor": { "name": "amukherjee", "key": "amukherjee", "displayName": "Abir Mukherjee", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2016-09-26T21:48:39.000+0000", "updated": "2016-09-26T21:48:39.000+0000" } ], "maxResults": 4, "total": 4, "startAt": 0 } } }