]> source.dussan.org Git - nextcloud-server.git/commitdiff
add first version of drop import
authorGeorg Ehrke <dev@georgswebsite.de>
Sun, 13 May 2012 13:05:57 +0000 (15:05 +0200)
committerGeorg Ehrke <dev@georgswebsite.de>
Sun, 13 May 2012 13:05:57 +0000 (15:05 +0200)
apps/calendar/ajax/import/dropimport.php [new file with mode: 0644]
apps/calendar/js/calendar.js

diff --git a/apps/calendar/ajax/import/dropimport.php b/apps/calendar/ajax/import/dropimport.php
new file mode 100644 (file)
index 0000000..e98c282
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+$data = $_POST['data'];
+$data = explode(',', $data);
+$data = end($data);
+$data = base64_decode($data);
+OCP\JSON::checkLoggedIn();
+OCP\App::checkAppEnabled('calendar');
+$nl="\r\n";
+$comps = array('VEVENT'=>true, 'VTODO'=>true, 'VJOURNAL'=>true);
+$data = str_replace(array("\r","\n\n"), array("\n","\n"), $data);
+$lines = explode("\n", $data);
+unset($data);
+$comp=$uid=$cal=false;
+$cals=$uids=array();
+$i = 0;
+foreach($lines as $line) {
+       if(strpos($line, ':')!==false) {
+               list($attr, $val) = explode(':', strtoupper($line));
+               if ($attr == 'BEGIN' && $val == 'VCALENDAR') {
+                       $cal = $i;
+                       $cals[$cal] = array('first'=>$i,'last'=>$i,'end'=>$i);
+               } elseif ($attr =='BEGIN' && $cal!==false && isset($comps[$val])) {
+                       $comp = $val;
+                       $beginNo = $i;
+               } elseif ($attr == 'END' && $cal!==false && $val == 'VCALENDAR') {
+                       if($comp!==false) {
+                               unset($cals[$cal]); // corrupt calendar, unset it
+                       } else {
+                               $cals[$cal]['end'] = $i;
+                       }
+                       $comp=$uid=$cal=false; // reset calendar
+               } elseif ($attr == 'END' && $comp!==false && $val == $comp) {
+                       if(! $uid) {
+                               $uid = OC_Calendar_Object::createUID();
+                       }
+                       $uids[$uid][$beginNo] = array('end'=>$i, 'cal'=>$cal);
+                       if ($cals[$cal]['first'] == $cal) {
+                               $cals[$cal]['first'] = $beginNo;
+                       }
+                       $cals[$cal]['last'] = $i;
+                       $comp=$uid=false; // reset component
+               } elseif ($attr =="UID" && $comp!==false) {
+                       list($attr, $uid) = explode(':', $line);
+               }
+       }
+       $i++;
+}
+$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser(), 1);
+$id = $calendars[0]['id'];
+foreach($uids as $uid) {
+       $prefix=$suffix=$content=array();
+       foreach($uid as $begin=>$details) {
+               $cal = $details['cal'];
+               if(!isset($cals[$cal])) {
+                       continue; // from corrupt/incomplete calendar
+               }
+               $cdata = $cals[$cal];
+               // if we have multiple components from different calendar objects,
+               // we should really merge their elements (enhancement?) -- 1st one wins for now.
+               if(! count($prefix)) {
+                       $prefix = array_slice($lines, $cal, $cdata['first'] - $cal);
+               }
+               if(! count($suffix)) {
+                       $suffix = array_slice($lines, $cdata['last']+1, $cdata['end'] - $cdata['last']);
+               }
+               $content = array_merge($content, array_slice($lines, $begin, $details['end'] - $begin + 1));
+       }
+       if(count($content)) {
+               $import = join($nl, array_merge($prefix, $content, $suffix)) . $nl;
+               OC_Calendar_Object::add($id, $import);
+       }
+}
+OCP\JSON::success();
+?>
\ No newline at end of file
index 80b5dd88c5ed81567cc056245a39808d418e05b8..8a3f714c5f7a0c9ddfec084cecaf4e44a2a11719 100644 (file)
@@ -601,6 +601,50 @@ Calendar={
                                });
                                /*var permissions = (this.checked) ? 1 : 0;*/
                        }
+               },
+               Drop:{
+                       init:function(){
+                               if (typeof window.FileReader === 'undefined') {
+                                       console.log('The drop-import feature is not supported in your browser :(');
+                                       return false;
+                               }
+                               droparea = document.getElementById('calendar_holder');
+                               droparea.ondrop = function(e){
+                                       e.preventDefault();
+                                       Calendar.UI.Drop.drop(e);
+                               }
+                               console.log('Drop initialized successfully');
+                       },
+                       drop:function(e){
+                               var files = e.dataTransfer.files;
+                               for(var i = 0;i < files.length;i++){
+                                       var file = files[i]
+                                       reader = new FileReader();
+                                       reader.onload = function(event){
+                                               if(file.type != 'text/calendar'){
+                                                       $('#notification').html('At least one file don\'t seems to be a calendar file. File skipped.');
+                                                       $('#notification').slideDown();
+                                                       window.setTimeout(function(){$('#notification').slideUp();}, 5000);
+                                                       return false;
+                                               }else{
+                                                       Calendar.UI.Drop.import(event.target.result);
+                                               }
+                                       }
+                                       reader.readAsDataURL(file);
+                               }
+                               $('#calendar_holder').fullCalendar('refetchEvents');
+                       },
+                       import:function(data){
+                               $.post(OC.filePath('calendar', 'ajax/import', 'dropimport.php'), {'data':data},function(result) {
+                                       if(result.data == 'success'){
+                                               return true;
+                                       }else{
+                                               $('#notification').html('ownCloud wasn\'t able to import at least one file. File skipped.');
+                                               $('#notification').slideDown();
+                                               window.setTimeout(function(){$('#notification').slideUp();}, 5000);
+                                       }
+                               });
+                       }
                }
        }
 }
@@ -858,4 +902,5 @@ $(document).ready(function(){
                $('#calendar_holder').fullCalendar('next');
        });
        Calendar.UI.Share.init();
+       Calendar.UI.Drop.init();
 });