diff --git a/js/data/ResponseHandler.js b/js/data/ResponseHandler.js
index 1d338c1..0a2b823 100644
--- a/js/data/ResponseHandler.js
+++ b/js/data/ResponseHandler.js
@@ -52,7 +52,7 @@ Zarafa.plugins.calendarimporter.data.ResponseHandler = Ext.extend(Zarafa.core.da
* Call the successCallback callback function.
* @param {Object} response Object contained the response data.
*/
- doList: function (response) {
+ doLoad: function (response) {
this.successCallback(response);
},
diff --git a/js/dialogs/ImportPanel.js b/js/dialogs/ImportPanel.js
index c12743a..a317efc 100644
--- a/js/dialogs/ImportPanel.js
+++ b/js/dialogs/ImportPanel.js
@@ -77,17 +77,19 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
// create the data store
this.store = new Ext.data.ArrayStore({
fields: [
- {name: 'title'},
- {name: 'start'},
- {name: 'end'},
+ {name: 'subject'},
+ {name: 'startdate'},
+ {name: 'enddate'},
{name: 'location'},
- {name: 'description'},
+ {name: 'body'},
{name: 'priority'},
{name: 'label'},
{name: 'busy'},
- {name: 'privatestate'},
+ {name: 'class'},
{name: 'organizer'},
- {name: 'trigger'}
+ {name: 'alarms'},
+ {name: 'timezone'},
+ {name: 'record'}
]
});
@@ -285,13 +287,21 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
parsedData = new Array(eventdata.events.length);
var i = 0;
for(i = 0; i < eventdata.events.length; i++) {
- var trigger = null;
-
- if(eventdata.events[i]["VALARM"]) {
- trigger = eventdata.events[i]["VALARM"]["TRIGGER"];
- trigger = new Date(parseInt(trigger) + local_tz_offset);
- }
- parsedData[i] = new Array(eventdata.events[i]["SUMMARY"], new Date(parseInt(eventdata.events[i]["DTSTART"]) + local_tz_offset), new Date(parseInt(eventdata.events[i]["DTEND"]) + local_tz_offset), eventdata.events[i]["LOCATION"], eventdata.events[i]["DESCRIPTION"],eventdata.events[i]["PRIORITY"],eventdata.events[i]["X-ZARAFA-LABEL"],eventdata.events[i]["X-MICROSOFT-CDO-BUSYSTATUS"],eventdata.events[i]["CLASS"],eventdata.events[i]["ORGANIZER"],trigger);
+ parsedData[i] = [
+ eventdata.events[i]["subject"],
+ new Date(parseInt(eventdata.events[i]["startdate"]) * 1000 + local_tz_offset),
+ new Date(parseInt(eventdata.events[i]["enddate"]) * 1000 + local_tz_offset),
+ eventdata.events[i]["location"],
+ eventdata.events[i]["body"],
+ eventdata.events[i]["priority"],
+ eventdata.events[i]["label"],
+ eventdata.events[i]["busy"],
+ eventdata.events[i]["class"],
+ eventdata.events[i]["organizer"],
+ eventdata.events[i]["alarms"],
+ eventdata.events[i]["timezone"],
+ eventdata.events[i]
+ ];
}
} else {
return null;
@@ -325,17 +335,18 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
sortable: true
},
columns: [
- {id: 'Summary', header: 'Title', width: 200, sortable: true, dataIndex: 'title'},
- {header: 'Start', width: 200, sortable: true, dataIndex: 'start', renderer : Zarafa.common.ui.grid.Renderers.datetime},
- {header: 'End', width: 200, sortable: true, dataIndex: 'end', renderer : Zarafa.common.ui.grid.Renderers.datetime},
+ {id: 'Summary', header: 'Title', width: 200, sortable: true, dataIndex: 'subject'},
+ {header: 'Start', width: 200, sortable: true, dataIndex: 'startdate', renderer : Zarafa.common.ui.grid.Renderers.datetime},
+ {header: 'End', width: 200, sortable: true, dataIndex: 'enddate', renderer : Zarafa.common.ui.grid.Renderers.datetime},
{header: 'Location', width: 150, sortable: true, dataIndex: 'location'},
- {header: 'Description', sortable: true, dataIndex: 'description'},
+ {header: 'Description', sortable: true, dataIndex: 'body'},
{header: "Priority", dataIndex: 'priority', hidden: true},
{header: "Label", dataIndex: 'label', hidden: true},
{header: "Busystatus", dataIndex: 'busy', hidden: true},
- {header: "Privacystatus", dataIndex: 'privatestate', hidden: true},
+ {header: "Privacystatus", dataIndex: 'class', hidden: true},
{header: "Organizer", dataIndex: 'organizer', hidden: true},
- {header: "Alarm", dataIndex: 'trigger', hidden: true, renderer : Zarafa.common.ui.grid.Renderers.datetime}
+ {header: "Alarm", dataIndex: 'alarms', hidden: true, renderer : Zarafa.common.ui.grid.Renderers.datetime},
+ {header: "Timezone", dataIndex: 'timezone', hidden: true}
]
}),
sm: new Ext.grid.RowSelectionModel({multiSelect:true})
@@ -430,7 +441,7 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
createSubmitButton: function() {
return {
xtype: "button",
- ref: "submitButton",
+ ref: "../submitButton",
disabled: true,
width: 100,
border: false,
@@ -444,7 +455,7 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
createSubmitAllButton: function() {
return {
xtype: "button",
- ref: "submitAllButton",
+ ref: "../submitAllButton",
disabled: true,
width: 100,
border: false,
@@ -548,20 +559,22 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
},
handleParsingResult: function(response) {
- this.loadMask.hide();
+ var self = this.scope;
+
+ self.loadMask.hide();
if(response["status"] == true) {
- this.submitButton.enable();
- this.submitAllButton.enable();
+ self.submitButton.enable();
+ self.submitAllButton.enable();
if(typeof response.parsed.calendar["X-WR-TIMEZONE"] !== "undefined") {
- this.timezone = response.parsed.calendar["X-WR-TIMEZONE"];
- this.timezoneselector.setValue(Zarafa.plugins.calendarimporter.data.Timezones.unMap(this.timezone));
+ self.timezone = response.parsed.calendar["X-WR-TIMEZONE"];
+ self.timezoneselector.setValue(Zarafa.plugins.calendarimporter.data.Timezones.unMap(this.timezone));
}
- this.reloadGridStore(response.parsed);
+ self.reloadGridStore(response.parsed);
} else {
- this.submitButton.disable();
- this.submitAllButton.disable();
+ self.submitButton.disable();
+ self.submitAllButton.disable();
Zarafa.common.dialogs.MessageBox.show({
title : _('Parser Error'),
msg : _(response["message"]),
diff --git a/manifest.xml b/manifest.xml
index 207e798..00e0852 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -20,7 +20,7 @@
php/module.calendar.php
- js/calendarimporter.js
+ js/calendarimporter-debug.js
js/calendarimporter-debug.js
js/data/timezones.js
@@ -39,7 +39,7 @@
js/plugin.calendarimporter.js
- resources/css/calendarimporter-min.css
+ resources/css/calendarimporter.css
resources/css/calendarimporter.css
resources/css/calendarimporter-main.css
diff --git a/php/composer.json b/php/composer.json
index 7579244..aa0fd8e 100644
--- a/php/composer.json
+++ b/php/composer.json
@@ -1,5 +1,5 @@
{
"require": {
- "kigkonsult/icalcreator": "dev-master"
+ "sabre/vobject": "4.1"
}
}
\ No newline at end of file
diff --git a/php/module.calendar.php b/php/module.calendar.php
index feab76a..040d447 100644
--- a/php/module.calendar.php
+++ b/php/module.calendar.php
@@ -23,6 +23,8 @@
include_once('vendor/autoload.php');
+use Sabre\VObject;
+
class CalendarModule extends Module
{
@@ -585,13 +587,10 @@ class CalendarModule extends Module
$parser = null;
try {
- $parser = new vcalendar([
- "unique_id" => md5($actionData["ics_filepath"]),
- "directory" => dirname($actionData["ics_filepath"]),
- "filename" => basename($actionData["ics_filepath"])
- ]);
- $parser->parse();
- error_log(print_r($parser, true));
+ $parser = VObject\Reader::read(
+ fopen($actionData["ics_filepath"],'r')
+ );
+ error_log(print_r($parser->VTIMEZONE, true));
} catch (Exception $e) {
$error = true;
$error_msg = $e->getMessage();
@@ -600,14 +599,16 @@ class CalendarModule extends Module
$response['status'] = false;
$response['message'] = $error_msg;
} else {
- if (count($parser->components) == 0) {
+ if (count($parser->VEVENT) == 0) {
$response['status'] = false;
$response['message'] = "No event in ics file";
} else {
$response['status'] = true;
$response['parsed_file'] = $actionData["ics_filepath"];
$response['parsed'] = array(
- 'contacts' => $this->parseCalendarToArray($parser)
+ 'events' => $this->parseCalendarToArray($parser),
+ 'timezone' => $parser->VTIMEZONE->TZID,
+ 'calendar' => $parser
);
}
}
@@ -627,13 +628,42 @@ class CalendarModule extends Module
/**
* Create a array with contacts
*
- * @param calendar ics parser object
+ * @param {VObject} $calendar ics parser object
* @return array parsed events
* @private
*/
private function parseCalendarToArray($calendar)
{
- return false;
+ $events = array();
+ foreach ($calendar->VEVENT as $Index => $vEvent) {
+ // Sabre\VObject\Parser\XML\Element\VEvent
+ $properties = array();
+
+ //uid - used for front/backend communication
+ $properties["internal_fields"] = array();
+ $properties["internal_fields"]["event_uid"] = base64_encode($Index . $vEvent->UID);
+
+ $properties["startdate"] = (string)$vEvent->DTSTART->getDateTime()->getTimestamp();
+ $properties["enddate"] = (string)$vEvent->DTEND->getDateTime()->getTimestamp();
+ $properties["location"] = (string)$vEvent->LOCATION;
+ $properties["subject"] = (string)$vEvent->SUMMARY;
+ $properties["body"] = (string)$vEvent->DESCRIPTION;
+ $properties["comment"] = (string)$vEvent->COMMENT;
+ $properties["timezone"] = (string)$vEvent->DTSTART["TZID"];
+ $properties["organizer"] = (string)$vEvent->ORGANIZER;
+ $properties["busy"] = (string)$vEvent->{'X-MICROSOFT-CDO-INTENDEDSTATUS'}; // X-MICROSOFT-CDO-BUSYSTATUS
+ $properties["transp"] = (string)$vEvent->TRANSP;
+ //$properties["trigger"] = (string)$vEvent->COMMENT;
+ $properties["priority"] = (string)$vEvent->PRIORITY;
+ $properties["class"] = (string)$vEvent->CLASS;
+ $properties["label"] = (string)$vEvent->COMMENT;
+ $properties["lastmodified"] = (string)$vEvent->{'LAST-MODIFIED'};
+ $properties["created"] = (string)$vEvent->CREATED;
+
+ array_push($events, $properties);
+ }
+
+ return $events;
}
}
diff --git a/resources/css/calendarimporter-main.css b/resources/css/calendarimporter-main.css
index d3d595a..d101e01 100644
--- a/resources/css/calendarimporter-main.css
+++ b/resources/css/calendarimporter-main.css
@@ -2,5 +2,29 @@
background: url(../images/import_icon.png) no-repeat !important;
background-repeat: no-repeat;
background-position: center;
- background-size: 18px!important;
-}
\ No newline at end of file
+}
+
+.icon_calendarimporter_export {
+ background: url(../images/download.png) no-repeat;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.icon_calendarimporter_import {
+ background: url(../images/upload.png) no-repeat;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.zarafa-caiplg-container {
+ width: 100%;
+ height: 50px;
+}
+
+.zarafa-caiplg-button .x-btn-small {
+ width: 80%;
+ height: 30px;
+ margin-left: 10%;
+ margin-right: 10%;
+ margin-top: 10px;
+}
diff --git a/resources/images/download.png b/resources/images/download.png
new file mode 100755
index 0000000..38a8281
Binary files /dev/null and b/resources/images/download.png differ
diff --git a/resources/images/download.xcf b/resources/images/download.xcf
new file mode 100755
index 0000000..9a5b62c
Binary files /dev/null and b/resources/images/download.xcf differ
diff --git a/resources/images/upload.png b/resources/images/upload.png
new file mode 100644
index 0000000..9e3158a
Binary files /dev/null and b/resources/images/upload.png differ
diff --git a/resources/images/upload.xcf b/resources/images/upload.xcf
new file mode 100755
index 0000000..e89500d
Binary files /dev/null and b/resources/images/upload.xcf differ