caldav-client

standalone CalDAV web client
git clone https://git.ce9e.org/caldav-client.git

commit
f3fe2da589eb0d83cac2757c8cd0ce1c141eafaf
parent
0aac555d56b3406b2cbb86ef9f72aa3668623e68
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-02-11 07:35
Merge branch 'sync'

Diffstat

M dav.js 23 ++++++++++++++++-------
M main.js 77 +++++++++++++++++++++++++++++++++++--------------------------

2 files changed, 60 insertions, 40 deletions


diff --git a/dav.js b/dav.js

@@ -158,21 +158,30 @@ export var createEvent = function(info, source) {
  158   158     };
  159   159 };
  160   160 
  161    -1 export var commitEvent = function(data) {
   -1   161 export var commitEvent = function(data, _changes) {
  162   162     var comp = data.extendedProps.comp;
  163   163     var vevent = new ICAL.Event(comp.getFirstSubcomponent('vevent'));
  164    -1     vevent.summary = data.title;
  165    -1     vevent.startDate = date2idate(data.start, data.allDay, data.extendedProps.offset);
  166    -1     vevent.endDate = date2idate(data.end || data.start, data.allDay, data.extendedProps.offset);
  167    -1     return _fetch(data.groupId, {
   -1   164 
   -1   165     var changes = _changes || {};
   -1   166     var groupId = changes.groupId || data.groupId;
   -1   167     var title = changes.title || data.title;
   -1   168     var start = changes.start || data.start;
   -1   169     var end = changes.end || data.end;
   -1   170     var allDay = changes.allDay || data.allDay;
   -1   171 
   -1   172     vevent.summary = title;
   -1   173     vevent.startDate = date2idate(start, allDay, data.extendedProps.offset);
   -1   174     vevent.endDate = date2idate(end || start, allDay, data.extendedProps.offset);
   -1   175 
   -1   176     return _fetch(groupId, {
  168   177         method: 'PUT',
  169   178         credentials: 'same-origin',
  170   179         body: comp.toString(),
  171   180     });
  172   181 };
  173   182 
  174    -1 export var deleteEvent = function(data) {
  175    -1     return _fetch(data.groupId, {
   -1   183 export var deleteEvent = function(url) {
   -1   184     return _fetch(url, {
  176   185         method: 'DELETE',
  177   186         credentials: 'same-origin',
  178   187     });

diff --git a/main.js b/main.js

@@ -50,44 +50,55 @@ form.querySelectorAll('[data-translate]').forEach(el => {
   50    50 
   51    51 form.addEventListener('submit', function(e) {
   52    52     e.preventDefault();
   -1    53     var data = selectedEvent;  // selectedEvent could be reset in the meantime
   53    54 
   54    55     if (e.submitter.value === 'delete') {
   55    56         if (!confirm(_('Are you sure you want to delete this?'))) {
   56    57             return;
   57    58         }
   58    -1         calendar.getEvents()
   59    -1             .filter(rel => rel.groupId === selectedEvent.groupId)
   60    -1             .forEach(rel => rel.remove());
   61    -1         dav.deleteEvent(selectedEvent);
   62    -1     } else if (e.submitter.value === 'save') {
   63    -1         selectedEvent.setProp('title', form.title.value);
   64    -1         selectedEvent.setDates(
   65    -1             form.start.value,
   66    -1             form.end.value || null,
   67    -1             {allDay: form.allday.checked}
   68    -1         );
   69    -1 
   70    -1         if (form.calendar.value == selectedEvent.source.id) {
   71    -1             dav.commitEvent(selectedEvent);
   72    -1         } else {
   73    -1             var newSource = calendar.getEventSourceById(form.calendar.value);
   74    -1             var newData;
   75    -1 
   -1    59         dav.deleteEvent(data.groupId).then(() => {
   76    60             calendar.getEvents()
   77    -1                 .filter(rel => rel.groupId === selectedEvent.groupId)
   78    -1                 .forEach(rel => {
   79    -1                     var plain = rel.toPlainObject();
   80    -1                     plain.groupId = plain.groupId.replace(selectedEvent.source.id, newSource.id);
   81    -1                     rel.remove();
   82    -1                     newData = calendar.addEvent(plain, newSource);
   83    -1                 });
   84    -1 
   85    -1             dav.commitEvent(newData);
   86    -1             dav.deleteEvent(selectedEvent);  // CAREFUL: must be called before selectedEvent is reset
   87    -1         }
   -1    61                 .filter(rel => rel.groupId === data.groupId)
   -1    62                 .forEach(rel => rel.remove());
   -1    63             closeForm();
   -1    64         });
   -1    65     } else if (e.submitter.value === 'save') {
   -1    66         var newSource = calendar.getEventSourceById(form.calendar.value);
   -1    67         var oldGroupId = data.groupId;
   -1    68         var newGroupId = data.groupId.replace(data.source.id, newSource.id);
   -1    69 
   -1    70         dav.commitEvent(data, {
   -1    71             groupId: newGroupId,
   -1    72             title: form.title.value,
   -1    73             start: new Date(form.start.value),
   -1    74             end: form.end.value ? new Date(form.end.value) : null,
   -1    75             allDay: form.allday.checked,
   -1    76         }).then(() => {
   -1    77             if (newGroupId !== oldGroupId) {
   -1    78                 return dav.deleteEvent(oldGroupId);
   -1    79             }
   -1    80         }).then(() => {
   -1    81             data.setProp('title', form.title.value);
   -1    82             data.setDates(
   -1    83                 form.start.value,
   -1    84                 form.end.value || null,
   -1    85                 {allDay: form.allday.checked}
   -1    86             );
   -1    87             if (newGroupId !== oldGroupId) {
   -1    88                 calendar.getEvents()
   -1    89                     .filter(rel => rel.groupId === oldGroupId)
   -1    90                     .forEach(rel => {
   -1    91                         var plain = rel.toPlainObject();
   -1    92                         plain.groupId = newGroupId;
   -1    93                         rel.remove();
   -1    94                         calendar.addEvent(plain, newSource);
   -1    95                     });
   -1    96             }
   -1    97             closeForm();
   -1    98         });
   -1    99     } else if (e.submitter.value === 'cancel') {
   -1   100         closeForm();
   88   101     }
   89    -1 
   90    -1     closeForm();
   91   102 });
   92   103 
   93   104 var calendar = new FullCalendar.Calendar(
@@ -118,11 +129,11 @@ var calendar = new FullCalendar.Calendar(
  118   129         })(),
  119   130         eventDrop: info => {
  120   131             closeForm();
  121    -1             dav.commitEvent(info.event);
   -1   132             dav.commitEvent(info.event).catch(() => info.revert());
  122   133         },
  123   134         eventResize: info => {
  124   135             closeForm();
  125    -1             dav.commitEvent(info.event);
   -1   136             dav.commitEvent(info.event).catch(() => info.revert());
  126   137         },
  127   138         eventDidMount: info => {
  128   139             info.el.title = info.event.title;