diff options
author | B. Stack <bgstack15@gmail.com> | 2022-08-10 22:35:07 -0400 |
---|---|---|
committer | B. Stack <bgstack15@gmail.com> | 2022-08-10 22:35:07 -0400 |
commit | 565d576f704c337b82a583d192c77d43bfca2648 (patch) | |
tree | 35b6ea25942e190e48a1878902c0fcbdff8825db /radicale_infcloud/web | |
parent | add my preferred contact display settings (diff) | |
download | radicaleinfcloud-565d576f704c337b82a583d192c77d43bfca2648.tar.gz radicaleinfcloud-565d576f704c337b82a583d192c77d43bfca2648.tar.bz2 radicaleinfcloud-565d576f704c337b82a583d192c77d43bfca2648.zip |
WIP: add upload functionality, part 1
The upload button now calls logic, which does a rudimentary upload.
The new item can successfully be saved to the server, but the event
does not immediately show up in the InfCloud view. The user has to
reload the web page to see the new event, which of course is not ideal.
There must be a way to add the new object immediately.
Diffstat (limited to 'radicale_infcloud/web')
-rw-r--r-- | radicale_infcloud/web/cache_handler.js | 63 | ||||
-rw-r--r-- | radicale_infcloud/web/data_process.js | 801 | ||||
-rw-r--r-- | radicale_infcloud/web/forms.js | 37 | ||||
-rw-r--r-- | radicale_infcloud/web/index.html | 1 | ||||
-rw-r--r-- | radicale_infcloud/web/interface.js | 39 |
5 files changed, 903 insertions, 38 deletions
diff --git a/radicale_infcloud/web/cache_handler.js b/radicale_infcloud/web/cache_handler.js index e21fb63..4926b20 100644 --- a/radicale_infcloud/web/cache_handler.js +++ b/radicale_infcloud/web/cache_handler.js @@ -43,37 +43,40 @@ window.applicationCache.addEventListener('updateready', function(){ // Check if a new cache is available on page load. window.addEventListener('load', function(e) { - window.applicationCache.addEventListener('cached', function(e) - { - if(!isUserLogged) - window.location.reload(); - else - $('#cacheDialog').css('display','block'); - }, false); + if(window.applicationCache) + { + window.applicationCache.addEventListener('cached', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); - window.applicationCache.addEventListener('updateready', function(e) - { - if(!isUserLogged) - window.location.reload(); - else - $('#cacheDialog').css('display','block'); - }, false); + window.applicationCache.addEventListener('updateready', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); - window.applicationCache.addEventListener('obsolete', function(e) - { - if(!isUserLogged) - window.location.reload(); - else - $('#cacheDialog').css('display','block'); - }, false); + window.applicationCache.addEventListener('obsolete', function(e) + { + if(!isUserLogged) + window.location.reload(); + else + $('#cacheDialog').css('display','block'); + }, false); - window.applicationCache.addEventListener('noupdate', function(e) - { - if(!isUserLogged) - { - clearInterval(globalCacheUpdateInterval); - globalCacheUpdateInterval=setInterval(function(){window.applicationCache.update();}, 300000); - //$('#LoginPage .window').css('display', 'inline-block'); - } - }, false); + window.applicationCache.addEventListener('noupdate', function(e) + { + if(!isUserLogged) + { + clearInterval(globalCacheUpdateInterval); + globalCacheUpdateInterval=setInterval(function(){window.applicationCache.update();}, 300000); + //$('#LoginPage .window').css('display', 'inline-block'); + } + }, false); + }; }, false); diff --git a/radicale_infcloud/web/data_process.js b/radicale_infcloud/web/data_process.js index bdbf711..e71f23e 100644 --- a/radicale_infcloud/web/data_process.js +++ b/radicale_infcloud/web/data_process.js @@ -1067,6 +1067,7 @@ function checkAndFixMultipleUID(vcalendar, isEvent) } return eventStringArray; } + function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFormHidden, deleteMode) { var vevent=false, @@ -1341,11 +1342,6 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo { if(globalSettings.timezonesupport.value) sel_option=$('#timezone').val(); - //else - //{ - // if(inputEvents.length>0) - // sel_option=inputEvents[0].timeZone; - //} if(sel_option=='UTC') { @@ -2148,9 +2144,6 @@ function dataToVcalendar(operation, accountUID, inputUID, inputEtag, delUID,isFo if($('#status').val()!='NONE') { - - //if((value=$('[id="vcalendar_editor"] [data-type="\\%note"]').find('textarea').val())!='') - //{ if(vCalendar.tplM['contentline_STATUS']!=null && (process_elem=vCalendar.tplM['contentline_STATUS'][0])!=undefined) { // replace the object and related objects' group names (+ append the related objects after the processed) @@ -3447,6 +3440,7 @@ function getDateFromDay(objComponent, t, disableRecursion,uid) return {offsetFrom:objComponent.tzOffsetFROM, offsetTo: objComponent.tzOffsetTO, startDate: dayLightStartDate}; } +/* FINDTHIS */ function vcalendarToData(inputCollection, inputEvent, isNew) { var vcalendarOrig=inputEvent.vcalendar; @@ -7793,3 +7787,794 @@ function normalizeVcard(vcardString) return vcard_out_grouped.join(''); } + +/* START stackrpms functions 2022-08-10 + * duplicated and modified from function vcalendarToData() on line 3443 + */ +function stringToVevent(inputCollection, vstring, uid, etag, isNew) +{ + //vcalendarToData(inputCollection, inputEvent, isNew) + //var vcalendarOrig=inputEvent.vcalendar; + var vcalendarOrig=vstring; + var eventArray=new Array(); + + //CHECK CALSCALE + var elem=vcalendarOrig.match(vCalendar.pre['contentline_CALSCALE']); + if(elem!=null) + { + calscale=elem[0].match(vCalendar.pre['contentline_parse'])[4]; + if(calscale!='GREGORIAN') + { + console.log("Error:'"+uid+"': Unsupported calscale in:"+vcalendarOrig); + return false; + } + } + //CHECK VERSION + var elemV=vcalendarOrig.match(vCalendar.pre['contentline_VERSION']); + if(elemV!=null) + { + var ver=elemV[0].match(vCalendar.pre['contentline_parse'])[4]; + if(ver!='2.0') + { + console.log("Error:'"+uid+"': Unsupported version ("+ver+") in:"+vcalendarOrig); + return false; + } + } + + //FIX TIMEZONE + var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE'); + var startEndTimeZone=vcalendarOrig.lastIndexOf('END:VTIMEZONE'); + var endTimeZone=0; + + var rid=uid.substring(0, uid.lastIndexOf('/')+1); + var evid=uid.substring(uid.lastIndexOf('/')+1, uid.length); + + var isChange=false, + needReload=false; + + if(!isNew) + { + var events=findEventInArray(uid, true); + if(events!='') + { + if(events.etag!=etag) + { + for(var i=0; i<events.alertTimeOut.length; i++) + clearTimeout(events.alertTimeOut[i]); + deleteEventFromArray(uid); + + if($('#show').val()!='') + { + if($('#show').val()==uid) + { + if($('#repeatEvent').val()=="true" || $('#recurrenceID').val()!='') + { + var name=globalCalEvent.title; + showEventForm(null, null, {title: name, id:uid}, globalJsEvent, 'show','', true); + $('#editAll').css('visibility','hidden'); + $('#editFuture').css('visibility','hidden'); + $('#editOnlyOne').css('visibility','hidden'); + $('#repeatConfirmBoxContent').html('<b>'+name+"</b> "+localization[globalInterfaceLanguage].repeatChangeTxt); + $('#repeatConfirmBoxQuestion').html(localization[globalInterfaceLanguage].repeatChangeTxtClose); + } + else + needReload=true; + } + } + isChange=true; + } + } + } + + if((beginTimeZone!=-1) && (startEndTimeZone!=-1)) + { + for(i=(startEndTimeZone+2);i<vcalendarOrig.length;i++) + { + if(vcalendarOrig.charAt(i)=='\n') + { + endTimeZone=i+1; + break; + } + } + vTimeZone=vcalendarOrig.substring(beginTimeZone, endTimeZone); + vcalendar=vcalendarOrig.substring(0, beginTimeZone)+vcalendarOrig.substring(endTimeZone, vcalendarOrig.length); + } + + /* + vcalendar_element=vcalendar.match(vCalendar.pre['tzone']); + if(vcalendar_element!=null) + vcalendar=vcalendar.replace(vcalendar_element[0],''); + */ + var recurrence_id_array=new Array(); + /* FINDTHIS matching for BEGIN:VEVENT */ + // this one works, but has 3 replace calls! + vcalendarOrig = vcalendarOrig.replace(/^\n/gm,'').replace('\n','\r\n').replace(/\r*\n/gm,'\r\n'); + while(vcalendarOrig.match(vCalendar.pre['vevent'])!=null) + { + if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2, vcalendarOrig.indexOf('BEGIN:VEVENT'))=='\r\n') + { + var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT')-2,vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); + vcalendarOrig=vcalendarOrig.replace(partEvent, ''); + } + else + { + var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VEVENT'),vcalendarOrig.indexOf('END:VEVENT')+'END:VEVENT'.length); + vcalendarOrig=vcalendarOrig.replace(partEvent, ''); + partEvent+='\r\n'; + } + var rec_array=partEvent.match(vCalendar.pre['contentline_RECURRENCE_ID']); + var uidString=partEvent.match(vCalendar.pre['contentline_UID']); + + if(uidString!=null && rec_array!=null) + { + recurrence_id_array[recurrence_id_array.length]=rec_array[0].match(vCalendar.pre['contentline_parse'])[4]+';'+uidString[0].match(vCalendar.pre['contentline_parse'])[4]; + } + eventArray[eventArray.length]=partEvent; + } + if(eventArray.length==0) + console.log("Error: '"+uid+"': unable to parse vEvent"); + + for(var evIt=0; evIt<eventArray.length; evIt++) + { + var oo='', + note='', + start='', + end='', + title='', + location='', + all=false, + frequency='', + interval='', + byMonthDay='', + byDay='', + until='', + isUntilDate=false, + isRepeat=false, + alertTime=new Array(), + alertNote=new Array(), + alertTimeOut=new Array(), + valOffsetFrom='', + valOffsetTo='', + intOffset=0, + tzName='local', + realStart='', + realEnd='', + rec_id='', + wkst='', + classType='', + avail='', + hrefUrl='', + returnForValue = true, + stringUID='', + priority="0", + status='', + pars=new Array(); + var dtStartTimezone=''; + var dates = new Array(); + var vcalendar=eventArray[evIt]; + var stringUID=vcalendar.match(vCalendar.pre['contentline_UID']); + if(stringUID!=null) + stringUID=stringUID[0].match(vCalendar.pre['contentline_parse'])[4]; + + var exDates=new Array(); + var exDate=null; + var exDate_array=new Array(); + var vcalendar2=vcalendar+''; + + while(vcalendar2.match(vCalendar.pre['contentline_EXDATE'])!= null) + { + exDate=vcalendar2.match(vCalendar.pre['contentline_EXDATE']); + exDate_array[exDate_array.length]=exDate[0]; + vcalendar2=vcalendar2.replace(exDate,'\r\n'); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RRULE2']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + pars=parsed[4].split(';'); + var parString=''; + + if(pars.length>0) + isRepeat=true; + for(var i=0;i<pars.length;i++) + { + if(pars[i].indexOf('FREQ=')!=-1) + frequency=pars[i].split('=')[1]; + else if(pars[i].indexOf('INTERVAL=')!=-1) + interval=pars[i].split('=')[1]; + else if(pars[i].indexOf('COUNT=')!=-1) + { + until=pars[i].split('=')[1]; + if(until==0) + { + returnForValue = false; + break + } + else if(isNaN(until)) + { + returnForValue = false; + break + } + } + else if(pars[i].indexOf('UNTIL=')!=-1) + { + isUntilDate=true; + until=pars[i].split('=')[1]; + //if(until.indexOf('T')==-1) +// until+='T000000Z'; + + } + else if(pars[i].indexOf('WKST=')!=-1) + { + wkst=pars[i].split('=')[1].replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0); + if(globalSettings.mozillasupport.value!=null && globalSettings.mozillasupport.value) + wkst=''; + } + else if(pars[i].indexOf('BYMONTHDAY=')!=-1) + byMonthDay=pars[i].split('=')[1]; + else if(pars[i].indexOf('BYDAY=')!=-1) + { + byDay=pars[i].split('=')[1]; + byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(','); + } + } + if(!returnForValue) + { + + continue; + } + if(!interval) + interval=1; + } + + var dayLightStartDate, dayLightEndDate, tzObject; + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTSTART']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + + start=parsed[4]; + var help1=start; + + if(help1.indexOf("T")==-1) + { + help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8); + all=true; + } + else + { + help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15); + all=false; + } + + var t=$.fullCalendar.parseDate(help1); + if(t==null) + return false; + if(t.toString()=='Invalid Date') + return false; + + if(!all) + { + parsed_value=vcalendarSplitParam(parsed[3]); + for(h=1;h<parsed_value.length;h++) + if(parsed_value[h]!='') + dtStartTimezone=parsed_value[h]; + dtStartTimezone=dtStartTimezone.split('=') + + if(start.charAt(start.length-1)=='Z') + tzName='UTC'; + if(dtStartTimezone.length>1 || tzName=='UTC') + { + if(tzName!='UTC') + tzName=$.trim(dtStartTimezone[1]); + var finTZ = checkTimezone(tzName); + if(finTZ!=null) + tzName = finTZ; + if(globalSettings.timezonesupport.value && tzName in timezones) + { + valOffsetFrom=getOffsetByTZ(tzName, t); + intOffset=(getLocalOffset(t)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + if(tzName!='' && tzName != 'local') + if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push(tzName); + processedTimezones.push(tzName); + } + } + else + tzName = globalSessionTimeZone; + realStart=$.fullCalendar.parseDate(help1); + //inputEvent.start=$.fullCalendar.parseDate(help1); + start=$.fullCalendar.parseDate(help1); + if(intOffset) + { + //inputEvent.start.setTime(inputEvent.start.getTime()+intOffset); + start.setTime(start.getTime()+intOffset); + } + if(exDate_array!=null) + for(var j=0;j<exDate_array.length;j++) + { + var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4]; + if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1) + var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1); + else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1) + var utcTime=exString.parseComnpactISO8601(); + else + { + if(help1.indexOf('T')!=-1) + exString += 'T' + $.fullCalendar.formatDate(start,'HHmmss'); + + var utcTime=exString.parseComnpactISO8601(); + } + exDates[exDates.length]=new Date(utcTime).toString(); + } + var valarm=vcalendar.match(vCalendar.pre['valarm']); + if(valarm!=null) + { + vcalendar=vcalendar.replace(valarm[0], ''); + var alarmString=''; + var alarmArray=new Array(); + for(var i=0;i<valarm[0].length;i++) + { + if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM') + { + alarmArray[alarmArray.length]=alarmString+'\r\n'; + alarmString=''; + } + alarmString+=valarm[0][i]; + } + + for(var j=0;j<alarmArray.length;j++) + { + checkA=alarmArray[j].match(vCalendar.re['valarm']); + if(checkA!=null) + { + action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']); + if(action!=null) + parsed=action[0].match(vCalendar.pre['contentline_parse']); + else + break; + + trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']); + if(trigger!=null) + { + parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']); + if(parsed!=null) + { + value=parsed[4]; + var checkD=value.match(vCalendar.pre['date-time-value']); + var intOffsetA=''; + var tzNameA=''; + if(checkD!=null) + { + if(parsed[3]) + var dtStartTimezoneA=parsed[3].split('='); + var alarmTimeA=$.fullCalendar.parseDate(value.substring(0, 4)+'-'+value.substring(4, 6)+'-'+value.substring(6, 8)+'T'+value.substring(9, 11)+':'+value.substring(11, 13)+':'+value.substring(13, 15)); + if(value.charAt(value.length-1)=='Z') + tzNameA='UTC'; + if(dtStartTimezoneA.length>1 || tzNameA=='UTC') + { + if(tzNameA!='UTC' && dtStartTimezoneA[0]==';TZID') + tzNameA=$.trim(dtStartTimezoneA[1]); + var finTZ = checkTimezone(tzNameA); + if(finTZ!=null) + tzNameA = finTZ; + if(globalSettings.timezonesupport.value && tzNameA in timezones) + { + var valOffsetFromA=getOffsetByTZ(tzNameA, alarmTimeA); + intOffsetA=getOffsetByTZ(tzName, alarmTimeA).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + if(tzNameA!='' && tzNameA != 'local') + if(processedTimezones.indexOf(tzNameA)==-1) + { + if(timeZonesEnabled.indexOf(tzNameA)==-1) + timeZonesEnabled.push(tzNameA); + processedTimezones.push(tzNameA); + } + if(intOffsetA!='') + alarmTimeA.setTime(alarmTimeA.getTime()+intOffsetA); + alertTime[j]=$.fullCalendar.formatDate(alarmTimeA,"yyyy-MM-dd'T'HH:mm:ss"); + } + else + { + alertTime[j]=0; + if(value.indexOf('W')!=-1) + alertTime[j]=parseAlarmWeek(value); + else if(value.indexOf('D')!=-1) + alertTime[j]=parseAlarmDay(value); + else if(value.indexOf('T')!=-1) + alertTime[j]=parseAlarmTime(value); + if(parsed[4].charAt(0)=="-") + alertTime[j]="-"+alertTime[j]; + else + alertTime[j]="+"+alertTime[j]; + } + } + } + else + break; + + noteA=alarmArray[j].match(vCalendar.pre['contentline_NOTE']); + if(noteA!=null) + { + parsed=noteA[0].match(vCalendar.pre['contentline_parse']); + alertNote[j]=parsed[4]; + } + else + alertNote[j]='Default note'; + } + } + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_LOCATION']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + location=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_NOTE']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + note=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_SUMMARY']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + title=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PRIORITY']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + priority=vcalendarUnescapeValue(parsed[4]); + } + + var index=0; + for(var p=0;p<globalResourceCalDAVList.collections.length;p++) + if(typeof globalResourceCalDAVList.collections[p].uid !='undefined' && globalResourceCalDAVList.collections[p].uid==uid) + { + index=p; + break; + } + var firstPart=index.pad(String(globalResourceCalDAVList.collections.length).length); + + var compareString=(firstPart + title).toLowerCase(); + + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CLASS']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + classType=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_STATUS']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + status=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_TRANSP']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + avail=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_URL']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + hrefUrl=vcalendarUnescapeValue(parsed[4]); + } + + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RECURRENCE_ID']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + var rec=parsed[4]; + /*if(rec.indexOf("T")==-1) + { + rec=rec.substring(0, 4)+'/'+rec.substring(4, 6)+'/'+rec.substring(6, 8); + var d=$.fullCalendar.parseDate(rec); + var da=new Date(d.getTime()-1*24*60*60*1000); + var day=da.getDate(); + + if(day<10) + day='0'+day; + + var month=da.getMonth(); + month++; + if(month<10) + month='0'+month; + + rec=da.getFullYear()+'-'+month+'-'+day; + } + else + rec=rec.substring(0, 4)+'-'+rec.substring(4, 6)+'-'+rec.substring(6, 8)+'T'+rec.substring(9, 11)+':'+rec.substring(11, 13)+':'+rec.substring(13, 15); + rec_id=$.fullCalendar.parseDate(rec);*/ + //if(!rec_id || rec_id=='Invalid Date') + // rec_id=''; + rec_id=rec; + } + + var isDuration = false; + var dur = 0; + vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTEND']); + if(vcalendar_element!=null) + { + parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']); + end=parsed[4]; + var help=end; + if(help.indexOf("T")==-1) + { + help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8); + var d=$.fullCalendar.parseDate(help); + var da=new Date(d.getTime()); + if(help1.indexOf("T")==-1) + da.setDate(da.getDate()-1); + help=$.fullCalendar.formatDate(da, "yyyy-MM-dd"); + all=true; + if(help1.indexOf("T")!=-1) + { + all=false; + help+='T00:00:00'; + if(tzName == 'UTC') + help+='Z'; + } + } + else + { + help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8)+'T'+help.substring(9, 11)+':'+help.substring(11, 13)+':'+help.substring(13, 15); + all=false; + } + } + else + { + var checkDur=vcalendar.match(vCalendar.pre['dur-value']); + if(checkDur!=null) + { + var checkP = (checkDur[0]+'\r\n').match(vCalendar.pre['contentline_parse']); + if(checkP != null) + { + var value=checkP[4]; + + var number = 0; + if(value.indexOf('W')!=-1) + number=parseAlarmWeek(value); + else if(value.indexOf('D')!=-1) + number=parseAlarmDay(value); + else if(value.indexOf('T')!=-1) + number=parseAlarmTime(value); + if(parsed[4].charAt(0)=="-") + number="-"+number; + else + number="+"+number; + dur=parseInt(number.substring(1, number.length-1),10); + isDuration = true; + } + } + } + if(isDuration) + { + var st=''; + if(!all) + st = $.fullCalendar.parseDate(help1); + else + { + st = $.fullCalendar.parseDate(help1+'T00:00:00'); + //date object mindfuck problem + st.setMilliseconds(-1); + } + var durDate = new Date(st.getTime() + dur); + help = $.fullCalendar.formatDate(durDate,"yyyy-MM-dd'T'HH:mm:ss"); + } + + if(typeof help=='undefined' || help=='' || help==null) + help=help1; + var t1=$.fullCalendar.parseDate(help); + if(t1==null) + return false; + else if(t1.toString()=='Invalid Date') + return false; + + if(!all) + { + if(end.charAt(end.length-1)=='Z') + tzName='UTC'; + if(dtStartTimezone.length>1 || tzName=='UTC') + { + if(tzName!='UTC') + tzName=$.trim(dtStartTimezone[1]); + var finTZ = checkTimezone(tzName); + if(finTZ!=null) + tzName = finTZ; + if(globalSettings.timezonesupport.value && tzName in timezones) + { + valOffsetFrom=getOffsetByTZ(tzName, t1); + intOffset=(getLocalOffset(t1)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000; + } + } + else if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push('local'); + processedTimezones.push('local'); + } + //realEnd=$.fullCalendar.parseDate(help); + //help1+=valOffsetFrom; + + if(tzName!='' && tzName != 'local') + if(processedTimezones.indexOf(tzName)==-1) + { + if(timeZonesEnabled.indexOf(tzName)==-1) + timeZonesEnabled.push(tzName); + processedTimezones.push(tzName); + } + } + else + tzName = globalSessionTimeZone; + + realEnd=$.fullCalendar.parseDate(help); + //inputEvent.end=$.fullCalendar.parseDate(help); + end=$.fullCalendar.parseDate(help); + if(intOffset) + { + //inputEvent.end.setTime(inputEvent.end.getTime()+intOffset); + end.setTime(end.getTime()+intOffset); + } + } + else + return false; + + if(globalVisibleCalDAVCollections.indexOf(rid)!=-1 || isChange || isNew) + { + if(isRepeat) + { + var futureRLimit = new Date(globalToLoadedLimit.getTime()) + futureRLimit.setDate(futureRLimit.getDate()+14); + var ruleString=vcalendar.match(vCalendar.pre['contentline_RRULE2'])[0].match(vCalendar.pre['contentline_parse'])[4]; + //inputEvent.isRepeat=true; + if(realStart) + var varDate=new Date(realStart.getTime()); + else + var varDate=new Date(start.getTime()); + + if(realEnd) + var varEndDate=new Date(realEnd.getTime()); + else + var varEndDate=new Date(end.getTime()); + + var lastGenDate=''; + var repeatStart=new Date(varDate.getTime()); + var repeatEnd=new Date(varEndDate.getTime()); + var untilDate='',realUntilDate='',realUntil=''; + + if(until!=='') + { + if(isUntilDate) + { + if(until.indexOf('T')!=-1) + { + var uString = until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)+'T'+until.substring(9, 11)+':'+until.substring(11, 13)+':'+until.substring(13, 15); + var ut=$.fullCalendar.parseDate(uString); + if(ut==null) + return false; + if(ut.toString()=='Invalid Date') + return false; + if(!all) + { + if(globalSettings.timezonesupport.value && tzName in timezones) + valOffsetFrom=getOffsetByTZ(tzName, ut); + if(valOffsetFrom) + { + var intOffset=valOffsetFrom.getSecondsFromOffset()*1000; + ut.setTime(ut.getTime()+intOffset); + } + } + untilDate = new Date(ut.getTime()); + } + else + { + untilDate=$.fullCalendar.parseDate(until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)); + untilDate.setHours(realStart.getHours()); + untilDate.setMinutes(realStart.getMinutes()); + untilDate.setSeconds(realStart.getSeconds()); + } + + realUntil=''; + } + else + { + untilDate=''; + realUntil=until; + + } + realUntilDate=untilDate; + //inputEvent.untilDate=untilDate; + } + else + { + untilDate=new Date(futureRLimit.getTime()); + realUntilDate=''; + //inputEvent.untilDate='never'; + } + var repeatCount=0, realRepeatCount=0; + + if(true) + { + if(alertTime.length>0) + { + var aTime=''; + var now=new Date(); + if(!inputCollection.ignoreAlarms) + alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title}, true, uid); + } + realRepeatCount++; + var checkRec=isInRecurrenceArray(varDate,stringUID,recurrence_id_array, tzName); + + if(exDates.length>0) + if(exDates.indexOf(varDate.toString())!=-1) + checkRec=true; + if(!checkRec) + { + repeatCount++; + var tmpObj=new items(etag, start, end, title, all, uid, rid, evid, note, inputCollection.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay,repeatCount, realRepeatCount, vcalendar, location, alertTimeOut,tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl, compareString,priority,status,ruleString); + globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); + } + } + + var lastGenDate=generateRepeatInstances({ + untilDate:realUntilDate, + repeatStart:varDate, + futureRLimit:futureRLimit, + stringUID:stringUID, + recurrence_id_array:recurrence_id_array, + exDates:exDates, + alertTime:alertTime, + ignoreAlarms:inputCollection.ignoreAlarms, + items:new items(etag, varDate, varEndDate, title, all, uid, rid, evid, note, inputCollection.displayValue, alertTime, alertNote, realUntilDate, frequency, interval, realUntil, repeatStart, repeatEnd, byMonthDay, repeatCount, realRepeatCount, vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString) + }); + } + else + { + if(!inputCollection.ignoreAlarms) + alertTimeOut=setAlertTimeouts(false,alertTime, start, end, {allDay:all, title:title},true,uid); + + var tmpObj=new items(etag, start, end, title, all, uid, rid, evid, note, inputCollection.displayValue, alertTime, alertNote, '', '', '', '', '', '', '', '', '', vcalendar, location, alertTimeOut, tzName, realStart, realEnd, byDay, rec_id,wkst,classType, avail,hrefUrl,compareString,priority,status,ruleString); + if(isChange) + { + if(needReload) + showEventForm(null, null, tmpObj, globalJsEvent, 'show', ''); + } + globalEventList.displayEventsArray[rid].splice(globalEventList.displayEventsArray[rid].length, 0, tmpObj); + } + } + } + //inputEvent.isDrawn=true; + return tmpObj; +} +/* END stackrpms functions */ diff --git a/radicale_infcloud/web/forms.js b/radicale_infcloud/web/forms.js index c125820..4e5a1a9 100644 --- a/radicale_infcloud/web/forms.js +++ b/radicale_infcloud/web/forms.js @@ -31,6 +31,39 @@ function updateTodoFormDimensions(setHeight) } } +function dragOverHandler(event) { + //if (window.console) { + // console.log("dragOverHandler",event); + //} + event.preventDefault(); + event.stopPropagation(); +} + +/* Incomplete import process. The function logs to console but does not use the vcard contents. */ +function dropHandler(event) { + if (event) { + event.preventDefault(); + event.stopPropagation(); + if (window.console) { + console.log("dropHandler",event); + } + if(event.dataTransfer && event.dataTransfer && event.dataTransfer.files.length > 0) { + if(window.console){console.log("files",event.dataTransfer.files);} + for (let f of event.dataTransfer.files) { + if(window.console){console.log("file:",f)}; + let reader = new FileReader(); + reader.readAsText(f); + reader.onload = function(){ + if(window.console){console.log(reader.result)}; + //dataToVcalendar('EDIT' + uploadFile(reader.result) + }; + reader.onerror = function(){if(window.console){console.log(reader.error)}}; + } + } + } +} + function updateEventFormDimensions(setHeight) { $('#CAEvent').css('width',''); @@ -2316,6 +2349,7 @@ function showEventForm(date, allDay, calEvent, jsEvent, mod, repeatOne, confirmR if(mod=='show') { $('#saveButton').hide(); + $('#uploadButton').hide(); $('#resetButton').hide(); $('#deleteButton').hide(); if($('#ResourceCalDAVList').find('[data-id="'+calEvent.res_id+'"]').hasClass("resourceCalDAV_item_ro")) @@ -2844,6 +2878,9 @@ function startEditModeEvent() $('#saveButton').show(); $('#resetButton').show(); $('#deleteButton').show(); + /* WORKHERE: hide the uploadButton when editing an existing object */ + $('#uploadButton').show(); + $('#uploadButton').on("drop",dropHandler(event)); $('#downloadButton').hide(); $('#show').val(''); $('#eventDetailsTable :input[disabled]').prop('disabled', false); diff --git a/radicale_infcloud/web/index.html b/radicale_infcloud/web/index.html index 39b8583..a8b95e4 100644 --- a/radicale_infcloud/web/index.html +++ b/radicale_infcloud/web/index.html @@ -629,6 +629,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. <input id="resetButton" type="button" value="Reset" data-type="reset" /> <input id="closeButton" type="button" value="Cancel" data-type="cancel" /> <input id="downloadButton" type="button" value="Download" data-type="download"/> + <input id="uploadButton" type="button" value="Import" data-type="upload" ondrop="dropHandler(event)" ondragover="dragOverHandler(event);"/> <input id="deleteButton" type="button" value="Delete" data-type="delete" onclick="updateEventFormDimensions(true);$('#CAEvent .saveLoader').show();deleteEvent();" /> </td> </tr> diff --git a/radicale_infcloud/web/interface.js b/radicale_infcloud/web/interface.js index e5afb8d..745d58d 100644 --- a/radicale_infcloud/web/interface.js +++ b/radicale_infcloud/web/interface.js @@ -1289,6 +1289,45 @@ function addAndEdit(isFormHidden, deleteMode) dataToVcalendar('EDIT',origUID, inputUID, $('#etag').val(), '', isFormHidden, deleteMode); } +/* START stackrpms 2022-08-10 + * uploadFile is a clone of addAndEdit + */ +function uploadFile(fileContents) +{ + var inputUID=''; + if($('#uid').val()!='') + var coll = globalResourceCalDAVList.getEventCollectionByUID($('#uid').val().substring(0, $('#uid').val().lastIndexOf('/')+1)); + else + var coll = globalResourceCalDAVList.getEventCollectionByUID($('#event_calendar').val()); + var res = getAccount(coll.accountUID); + var tmp=res.href.match(vCalendar.pre['hrefRex']); + var origUID=tmp[1]+res.userAuth.userName+'@'+tmp[2]; + if($('#etag').val()!='') + inputUID=$('#uid').val(); + else if($('#event_calendar').val()!='choose') + inputUID = $('#event_calendar').val()+''; + else + return false; + // ripped from data_process.js:1474 + var newUID=globalEventList.getNewUID(); + //process_elem=process_elem.replace('##:::##uid##:::##', newUID); + fileContents = fileContents.replace(/^UID:.*$/gm,String("UID:"+newUID)); + // WORKHERE: Could also try adding inputUID+newUID. Not sure if it helps or hurts. + newEvent = stringToVevent(coll, fileContents, inputUID, $('#etag').val(), true); + console.log(newEvent); + console.log("All day:"); + console.log(newEvent.allDay); + console.log(newEvent.allDay); + // This was an attempt to populate the form. I found it easier to just send the object to the caldav server right away. + // ref: interface.js:2601 + //showEventForm(null, newEvent.allDay, newEvent, null, 'show', ''); + // Just call the caldav operation directly. + //putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID, 'vevent', isFormHidden, deleteMode, fixedArr); + // putVcalendarToCollection("http://domainjoin@d2-03a/radicale/domainjoin", "http://domainjoin@d2-03a/radicale/domainjoin/4f58b6a8-014f-03b9-ae12-071eb28798de/", "", fileContents, "", 'vevent', undefined, undefined, + return putVcalendarToCollection(coll.accountUID, inputUID, "", fileContents, "", 'vevent', false, false, ""); + // WORKHERE: somehow add this to the globalEventList thing, like adding a brand-new event by hand? +} + function interResourceEdit(op, delUID,isFormHidden) { var inputUID=''; |