From 4fc5481fbefce624587526044e641d5f2cd2e33e Mon Sep 17 00:00:00 2001 From: Khaled FERJANI Date: Wed, 24 Nov 2021 10:03:15 +0100 Subject: [PATCH] linagora/esn-frontend-calendar#611 move events between calendars --- .../event/form/event-form.controller.js | 45 ++++++++++++++++++- .../app/components/event/form/event-form.pug | 4 +- .../app/services/calendar-api.js | 19 +++++++- .../app/services/event-service.js | 5 +++ 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/esn.calendar.libs/app/components/event/form/event-form.controller.js b/src/esn.calendar.libs/app/components/event/form/event-form.controller.js index 9d9b908c..6d4a282e 100644 --- a/src/esn.calendar.libs/app/components/event/form/event-form.controller.js +++ b/src/esn.calendar.libs/app/components/event/form/event-form.controller.js @@ -179,6 +179,10 @@ function CalEventFormController( _.find(calendars, 'selected'); } + // when editing an event exclude delegated calendars from the possible target calendars + // that can be used to move events into + $scope.calendars = calendars.filter(calendar => calendar.isOwner(session.user._id)); + return _getCalendarByUniqueId($scope.editedEvent.calendarUniqueId); }) .then(function(selectedCalendar) { @@ -368,7 +372,7 @@ function CalEventFormController( $scope.editedEvent.attendees = getUpdatedAttendees(); - if (!calEventUtils.hasAnyChange($scope.editedEvent, $scope.event)) { + if (!calEventUtils.hasAnyChange($scope.editedEvent, $scope.event) && !_calendarHasChanged()) { _hideModal(); return; @@ -393,6 +397,10 @@ function CalEventFormController( .then(cacheAttendees) .then(denormalizeAttendees) .then(function() { + if (!calEventUtils.hasAnyChange($scope.editedEvent, $scope.event)) { + return $q.when(true); + } + return calEventService.modifyEvent( $scope.event.path || calPathBuilder.forCalendarPath($scope.calendarHomeId, _getCalendarByUniqueId($scope.selectedCalendar.uniqueId).id), $scope.editedEvent, @@ -402,6 +410,7 @@ function CalEventFormController( { graceperiod: true, notifyFullcalendar: $state.is('calendar.main') } ); }) + .then(canPerformCalendarMove) .then(onEventCreateUpdateResponse) .finally(function() { $scope.restActive = false; @@ -668,4 +677,38 @@ function CalEventFormController( placement: 'center' }); } + + /** + * Checks if an event can be moved into another calendar + * + * @param {boolean} success - true if the previous response was successful + * + * @returns {Promise} + */ + function canPerformCalendarMove(success) { + if (!success) return $q.when(false); + + return _calendarHasChanged() ? changeCalendar() : Promise.resolve(); + } + + /** + * moves the event to the new calendar + * + * @returns {Promise} - resolves to true if the event calendar has changed + */ + function changeCalendar() { + const destinationPath = calPathBuilder.forEventId($scope.calendarHomeId, _getCalendarByUniqueId($scope.selectedCalendar.uniqueId).id, $scope.editedEvent.uid); + const sourcePath = $scope.event.path; + + return calEventService.moveEvent(sourcePath, destinationPath); + } + + /** + * Checks if the selected calendar differs from the original event calendar + * + * @returns {Boolean} - true if the event calendar and the selected calendar are different + */ + function _calendarHasChanged() { + return _getCalendarByUniqueId($scope.selectedCalendar.uniqueId).id !== $scope.editedEvent.calendarId; + } } diff --git a/src/esn.calendar.libs/app/components/event/form/event-form.pug b/src/esn.calendar.libs/app/components/event/form/event-form.pug index 93eb6bfd..f7970ccc 100644 --- a/src/esn.calendar.libs/app/components/event/form/event-form.pug +++ b/src/esn.calendar.libs/app/components/event/form/event-form.pug @@ -46,8 +46,8 @@ form.event-form(role="form", name="form", aria-hidden="true", ng-class="{ 'reado i.mdi.mdi-calendar-multiple .fg-line md-input-container(ng-click="changeBackdropZIndex()") - md-select(ng-disabled="!isNew(editedEvent) || !canModifyEvent", ng-model="selectedCalendar.uniqueId", md-container-class="cal-select-dropdown" aria-label="calendar") - md-option(ng-value="calendar.getUniqueId()" ng-repeat="calendar in calendars | filter: (isNew(editedEvent) || canModifyEvent) ? { readOnly: false } : {}") + md-select(ng-disabled="!canModifyEvent", ng-model="selectedCalendar.uniqueId", md-container-class="cal-select-dropdown" aria-label="calendar") + md-option(ng-value="calendar.getUniqueId()" ng-repeat="calendar in calendars | filter: { readOnly: false }") cal-select-calendar-item(calendar="calendar") cal-event-date-edition(event="editedEvent", disabled='!canModifyEvent', use-24hour-format='use24hourFormat', on-date-change='onDateChange') cal-entities-autocomplete-input.cal-user-autocomplete-input( diff --git a/src/esn.calendar.libs/app/services/calendar-api.js b/src/esn.calendar.libs/app/services/calendar-api.js index 56fe8936..817b995f 100644 --- a/src/esn.calendar.libs/app/services/calendar-api.js +++ b/src/esn.calendar.libs/app/services/calendar-api.js @@ -43,7 +43,8 @@ require('./http-response-handler.js'); changeParticipation: changeParticipation, modifyPublicRights: modifyPublicRights, exportCalendar, - getSecretAddress + getSecretAddress, + moveEvent }; //////////// @@ -331,5 +332,21 @@ require('./http-response-handler.js'); return $q.reject(error); }); } + + /** + * Move an event from one calendar to another + * + * @param {String} eventPath the path of the event. + * @param {String} destinationCalendarId the calendar id + * @returns {Object} the http response. + */ + function moveEvent(originalEventPath, destinationEventPath) { + const headers = { + Destination: destinationEventPath, + Overwrite: 'F' + }; + + return calDavRequest('move', originalEventPath, headers); + } } })(angular); diff --git a/src/esn.calendar.libs/app/services/event-service.js b/src/esn.calendar.libs/app/services/event-service.js index b21f3e11..fef02096 100644 --- a/src/esn.calendar.libs/app/services/event-service.js +++ b/src/esn.calendar.libs/app/services/event-service.js @@ -59,6 +59,7 @@ function calEventService( self.getEventByUID = getEventByUID; self.getEventFromICSUrl = getEventFromICSUrl; self.onEventCreatedOrUpdated = onEventCreatedOrUpdated; + self.moveEvent = moveEvent; //////////// @@ -575,4 +576,8 @@ function calEventService( return new CalendarShell(ICAL.Component.fromString(response.data)); }); } + + function moveEvent(source, destination) { + return calendarAPI.moveEvent(source, destination); + } }