1903 lines
70 KiB
JavaScript
1903 lines
70 KiB
JavaScript
/**
|
|
* @copyright Copyright (c) 2019 Georg Ehrke
|
|
*
|
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
|
*
|
|
* @license GNU AGPL version 3 or any later version
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
import Vue from 'vue'
|
|
import getTimezoneManager from '../services/timezoneDataProviderService'
|
|
import {
|
|
getDateFromDateTimeValue,
|
|
} from '../utils/date.js'
|
|
import DurationValue from 'calendar-js/src/values/durationValue.js'
|
|
import AttendeeProperty from 'calendar-js/src/properties/attendeeProperty.js'
|
|
import DateTimeValue from 'calendar-js/src/values/dateTimeValue.js'
|
|
import RecurValue from 'calendar-js/src/values/recurValue.js'
|
|
import Property from 'calendar-js/src/properties/property.js'
|
|
import { getBySetPositionAndBySetFromDate, getWeekDayFromDate } from '../utils/recurrence.js'
|
|
import {
|
|
getDefaultEventObject,
|
|
mapEventComponentToEventObject,
|
|
} from '../models/event.js'
|
|
import {
|
|
getAmountAndUnitForTimedEvents,
|
|
getAmountHoursMinutesAndUnitForAllDayEvents,
|
|
getTotalSecondsFromAmountAndUnitForTimedEvents, getTotalSecondsFromAmountHourMinutesAndUnitForAllDayEvents,
|
|
} from '../utils/alarms.js'
|
|
import {
|
|
getClosestCSS3ColorNameForHex,
|
|
getHexForColorName,
|
|
} from '../utils/color.js'
|
|
import { mapAlarmComponentToAlarmObject } from '../models/alarm.js'
|
|
import { getObjectAtRecurrenceId } from '../utils/calendarObject.js'
|
|
import logger from '../utils/logger.js'
|
|
import settings from './settings.js'
|
|
|
|
const state = {
|
|
isNew: null,
|
|
calendarObject: null,
|
|
calendarObjectInstance: null,
|
|
existingEvent: {
|
|
objectId: null,
|
|
recurrenceId: null,
|
|
},
|
|
}
|
|
|
|
const mutations = {
|
|
|
|
/**
|
|
* Set a calendar-object-instance that will be opened in the editor (existing event)
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObject The calendar-object currently being edited
|
|
* @param {Object} data.calendarObjectInstance The calendar-object-instance currently being edited
|
|
* @param {String} data.objectId The objectId of the calendar-object
|
|
* @param {number} data.recurrenceId The recurrence-id of the calendar-object-instance
|
|
*/
|
|
setCalendarObjectInstanceForExistingEvent(state, { calendarObject, calendarObjectInstance, objectId, recurrenceId }) {
|
|
state.isNew = false
|
|
state.calendarObject = calendarObject
|
|
state.calendarObjectInstance = calendarObjectInstance
|
|
state.existingEvent.objectId = objectId
|
|
state.existingEvent.recurrenceId = recurrenceId
|
|
},
|
|
|
|
/**
|
|
* Set a calendar-object-instance that will be opened in the editor (new event)
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObject The calendar-object currently being created
|
|
* @param {Object} data.calendarObjectInstance The calendar-object-instance currently being crated
|
|
*/
|
|
setCalendarObjectInstanceForNewEvent(state, { calendarObject, calendarObjectInstance }) {
|
|
state.isNew = true
|
|
state.calendarObject = calendarObject
|
|
state.calendarObjectInstance = calendarObjectInstance
|
|
state.existingEvent.objectId = null
|
|
state.existingEvent.recurrenceId = null
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
*/
|
|
resetCalendarObjectInstanceObjectIdAndRecurrenceId(state) {
|
|
state.isNew = false
|
|
state.calendarObject = null
|
|
state.calendarObjectInstance = null
|
|
state.existingEvent.objectId = null
|
|
state.existingEvent.recurrenceId = null
|
|
},
|
|
|
|
/**
|
|
* Change the title of the event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.title The new Title
|
|
*/
|
|
changeTitle(state, { calendarObjectInstance, title }) {
|
|
calendarObjectInstance.eventComponent.title = title
|
|
calendarObjectInstance.title = title
|
|
},
|
|
|
|
/**
|
|
* Change the event's start
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Date} data.startDate New start date to set
|
|
*/
|
|
changeStartDate(state, { calendarObjectInstance, startDate }) {
|
|
calendarObjectInstance.eventComponent.startDate.year = startDate.getFullYear()
|
|
calendarObjectInstance.eventComponent.startDate.month = startDate.getMonth() + 1
|
|
calendarObjectInstance.eventComponent.startDate.day = startDate.getDate()
|
|
calendarObjectInstance.eventComponent.startDate.hour = startDate.getHours()
|
|
calendarObjectInstance.eventComponent.startDate.minute = startDate.getMinutes()
|
|
calendarObjectInstance.eventComponent.startDate.second = 0
|
|
|
|
const isAllDay = calendarObjectInstance.eventComponent.isAllDay()
|
|
const endDateObj = calendarObjectInstance.eventComponent.endDate.clone()
|
|
const startDateObj = calendarObjectInstance.eventComponent.startDate.clone()
|
|
|
|
if (isAllDay) {
|
|
endDateObj.addDuration(DurationValue.fromSeconds(-1 * 60 * 60 * 24))
|
|
|
|
if (endDateObj.compare(startDateObj) === -1) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(endDateObj.timezoneId)
|
|
calendarObjectInstance.eventComponent.endDate
|
|
= calendarObjectInstance.eventComponent.startDate.getInTimezone(timezone)
|
|
calendarObjectInstance.endDate = getDateFromDateTimeValue(calendarObjectInstance.eventComponent.endDate)
|
|
calendarObjectInstance.eventComponent.endDate.addDuration(DurationValue.fromSeconds(60 * 60 * 24))
|
|
}
|
|
} else {
|
|
if (endDateObj.compare(startDateObj) === -1) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(endDateObj.timezoneId)
|
|
calendarObjectInstance.eventComponent.endDate
|
|
= calendarObjectInstance.eventComponent.startDate.getInTimezone(timezone)
|
|
calendarObjectInstance.endDate = getDateFromDateTimeValue(calendarObjectInstance.eventComponent.endDate)
|
|
}
|
|
}
|
|
|
|
calendarObjectInstance.startDate = startDate
|
|
},
|
|
|
|
/**
|
|
* Change the timezone of the event's start
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.startTimezone New timezone to set for start
|
|
*/
|
|
changeStartTimezone(state, { calendarObjectInstance, startTimezone }) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(startTimezone)
|
|
calendarObjectInstance.eventComponent.startDate.replaceTimezone(timezone)
|
|
calendarObjectInstance.startTimezoneId = startTimezone
|
|
|
|
// Either both are floating or both have a timezone, but it can't be mixed
|
|
if (startTimezone === 'floating' || calendarObjectInstance.endTimezoneId === 'floating') {
|
|
calendarObjectInstance.eventComponent.endDate.replaceTimezone(timezone)
|
|
calendarObjectInstance.endTimezoneId = startTimezone
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the event's end
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Date} data.endDate New end date to set
|
|
*/
|
|
changeEndDate(state, { calendarObjectInstance, endDate }) {
|
|
// If the event is using DURATION, endDate is dynamically generated.
|
|
// In order to alter it, we need to explicitly set DTEND
|
|
const endDateObject = calendarObjectInstance.eventComponent.endDate
|
|
calendarObjectInstance.eventComponent.endDate = endDateObject
|
|
|
|
calendarObjectInstance.eventComponent.endDate.year = endDate.getFullYear()
|
|
calendarObjectInstance.eventComponent.endDate.month = endDate.getMonth() + 1
|
|
calendarObjectInstance.eventComponent.endDate.day = endDate.getDate()
|
|
calendarObjectInstance.eventComponent.endDate.hour = endDate.getHours()
|
|
calendarObjectInstance.eventComponent.endDate.minute = endDate.getMinutes()
|
|
calendarObjectInstance.eventComponent.endDate.second = 0
|
|
|
|
const isAllDay = calendarObjectInstance.eventComponent.isAllDay()
|
|
const endDateObj = calendarObjectInstance.eventComponent.endDate.clone()
|
|
const startDateObj = calendarObjectInstance.eventComponent.startDate.clone()
|
|
|
|
if (isAllDay) {
|
|
if (endDateObj.compare(startDateObj) === -1) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(startDateObj.timezoneId)
|
|
calendarObjectInstance.eventComponent.startDate
|
|
= calendarObjectInstance.eventComponent.endDate.getInTimezone(timezone)
|
|
calendarObjectInstance.startDate = getDateFromDateTimeValue(calendarObjectInstance.eventComponent.startDate)
|
|
}
|
|
|
|
// endDate is inclusive, but DTEND needs to be exclusive, so always add one day
|
|
calendarObjectInstance.eventComponent.endDate.addDuration(DurationValue.fromSeconds(60 * 60 * 24))
|
|
} else {
|
|
if (endDateObj.compare(startDateObj) === -1) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(startDateObj.timezoneId)
|
|
calendarObjectInstance.eventComponent.startDate
|
|
= calendarObjectInstance.eventComponent.endDate.getInTimezone(timezone)
|
|
calendarObjectInstance.startDate = getDateFromDateTimeValue(calendarObjectInstance.eventComponent.startDate)
|
|
}
|
|
}
|
|
|
|
calendarObjectInstance.endDate = endDate
|
|
},
|
|
|
|
/**
|
|
* Change the timezone of the event's end
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.endTimezone New timezone to set for end
|
|
*/
|
|
changeEndTimezone(state, { calendarObjectInstance, endTimezone }) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(endTimezone)
|
|
calendarObjectInstance.eventComponent.endDate.replaceTimezone(timezone)
|
|
calendarObjectInstance.endTimezoneId = endTimezone
|
|
|
|
// Either both are floating or both have a timezone, but it can't be mixed
|
|
if (endTimezone === 'floating' || calendarObjectInstance.startTimezoneId === 'floating') {
|
|
calendarObjectInstance.eventComponent.startDate.replaceTimezone(timezone)
|
|
calendarObjectInstance.startTimezoneId = endTimezone
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Switch from a timed event to allday or vice versa
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
*/
|
|
toggleAllDay(state, { calendarObjectInstance }) {
|
|
if (!calendarObjectInstance.eventComponent.canModifyAllDay()) {
|
|
return
|
|
}
|
|
|
|
const isAllDay = calendarObjectInstance.eventComponent.isAllDay()
|
|
calendarObjectInstance.eventComponent.startDate.isDate = !isAllDay
|
|
calendarObjectInstance.eventComponent.endDate.isDate = !isAllDay
|
|
calendarObjectInstance.isAllDay = calendarObjectInstance.eventComponent.isAllDay()
|
|
|
|
// isAllDay = old value
|
|
if (isAllDay) {
|
|
calendarObjectInstance.eventComponent.endDate.addDuration(DurationValue.fromSeconds(-1 * 60 * 60 * 24))
|
|
} else {
|
|
calendarObjectInstance.eventComponent.endDate.addDuration(DurationValue.fromSeconds(60 * 60 * 24))
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Changes the time of a timed event to the default values
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
*/
|
|
changeTimeToDefaultForTimedEvents(state, { calendarObjectInstance }) {
|
|
const startDate = calendarObjectInstance.eventComponent.startDate
|
|
const endDate = calendarObjectInstance.eventComponent.endDate
|
|
if (startDate.hour === 0 && startDate.minute === 0 && endDate.hour === 0 && endDate.minute === 0) {
|
|
startDate.hour = 10
|
|
endDate.hour = 11
|
|
|
|
calendarObjectInstance.startDate = getDateFromDateTimeValue(startDate)
|
|
calendarObjectInstance.endDate = getDateFromDateTimeValue(endDate)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the location of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.location New location to set
|
|
*/
|
|
changeLocation(state, { calendarObjectInstance, location }) {
|
|
calendarObjectInstance.eventComponent.location = location
|
|
calendarObjectInstance.location = location
|
|
},
|
|
|
|
/**
|
|
* Change the description of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.description New description to set
|
|
*/
|
|
changeDescription(state, { calendarObjectInstance, description }) {
|
|
calendarObjectInstance.eventComponent.description = description
|
|
calendarObjectInstance.description = description
|
|
},
|
|
|
|
/**
|
|
* Change the access class of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.accessClass New access class to set
|
|
*/
|
|
changeAccessClass(state, { calendarObjectInstance, accessClass }) {
|
|
calendarObjectInstance.eventComponent.accessClass = accessClass
|
|
calendarObjectInstance.accessClass = accessClass
|
|
},
|
|
|
|
/**
|
|
* Change the status of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.status New status to set
|
|
*/
|
|
changeStatus(state, { calendarObjectInstance, status }) {
|
|
calendarObjectInstance.eventComponent.status = status
|
|
calendarObjectInstance.status = status
|
|
},
|
|
|
|
/**
|
|
* Change the time-transparency of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.timeTransparency New time-transparency to set
|
|
*/
|
|
changeTimeTransparency(state, { calendarObjectInstance, timeTransparency }) {
|
|
calendarObjectInstance.eventComponent.timeTransparency = timeTransparency
|
|
calendarObjectInstance.timeTransparency = timeTransparency
|
|
},
|
|
|
|
/**
|
|
* Change the customized color of an event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String|null} data.customColor New color to set
|
|
*/
|
|
changeCustomColor(state, { calendarObjectInstance, customColor }) {
|
|
if (customColor === null) {
|
|
calendarObjectInstance.eventComponent.deleteAllProperties('COLOR')
|
|
Vue.set(calendarObjectInstance, 'customColor', null)
|
|
return
|
|
}
|
|
|
|
const cssColorName = getClosestCSS3ColorNameForHex(customColor)
|
|
const hexColorOfCssName = getHexForColorName(cssColorName)
|
|
|
|
// Abort if either is undefined
|
|
if (!cssColorName || !hexColorOfCssName) {
|
|
console.error('Setting custom color failed')
|
|
console.error('customColor: ', customColor)
|
|
console.error('cssColorName: ', cssColorName)
|
|
console.error('hexColorOfCssName: ', hexColorOfCssName)
|
|
return
|
|
}
|
|
|
|
calendarObjectInstance.eventComponent.color = cssColorName
|
|
Vue.set(calendarObjectInstance, 'customColor', hexColorOfCssName)
|
|
},
|
|
|
|
/**
|
|
* Adds an attendee to the event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.commonName Displayname of attendee
|
|
* @param {String} data.uri Email address of attendee
|
|
* @param {String} data.calendarUserType Calendar-user-type of attendee (INDIVIDUAL, GROUP, RESOURCE, ROOM)
|
|
* @param {String} data.participationStatus Participation Status of attendee
|
|
* @param {String} data.role Role of Attendee
|
|
* @param {Boolean} data.rsvp Whether or not to request a response from the attendee
|
|
* @param {String=} data.language Preferred language of the attendee
|
|
* @param {String=} data.timezoneId Preferred timezone of the attendee
|
|
*/
|
|
addAttendee(state, { calendarObjectInstance, commonName, uri, calendarUserType = null, participationStatus = null, role = null, rsvp = null, language = null, timezoneId = null }) {
|
|
const attendee = AttendeeProperty.fromNameAndEMail(commonName, uri)
|
|
|
|
if (calendarUserType !== null) {
|
|
attendee.userType = calendarUserType
|
|
}
|
|
if (participationStatus !== null) {
|
|
attendee.participationStatus = participationStatus
|
|
}
|
|
if (role !== null) {
|
|
attendee.role = role
|
|
}
|
|
if (rsvp !== null) {
|
|
attendee.rsvp = rsvp
|
|
}
|
|
if (language !== null) {
|
|
attendee.language = language
|
|
}
|
|
if (timezoneId !== null) {
|
|
attendee.updateParameterIfExist('TZID', timezoneId)
|
|
}
|
|
|
|
// TODO - use real addAttendeeFrom method
|
|
calendarObjectInstance.eventComponent.addProperty(attendee)
|
|
calendarObjectInstance.attendees.push({
|
|
commonName,
|
|
participationStatus,
|
|
role,
|
|
rsvp,
|
|
uri,
|
|
attendeeProperty: attendee,
|
|
})
|
|
},
|
|
|
|
/**
|
|
* Removes an attendee from the event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.attendee The attendee object to remove
|
|
*/
|
|
removeAttendee(state, { calendarObjectInstance, attendee }) {
|
|
calendarObjectInstance.eventComponent.removeAttendee(attendee.attendeeProperty)
|
|
|
|
const index = calendarObjectInstance.attendees.indexOf(attendee)
|
|
if (index !== -1) {
|
|
calendarObjectInstance.attendees.splice(index, 1)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Changes an attendees' participation status
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.attendee The attendee object
|
|
* @param {String} data.participationStatus New Participation Status of attendee
|
|
*/
|
|
changeAttendeesParticipationStatus(state, { attendee, participationStatus }) {
|
|
attendee.attendeeProperty.participationStatus = participationStatus
|
|
attendee.participationStatus = participationStatus
|
|
},
|
|
|
|
/**
|
|
* Changes an attendees' role
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.attendee The attendee object
|
|
* @param {String} data.role New role of attendee
|
|
*/
|
|
changeAttendeesRole(state, { attendee, role }) {
|
|
attendee.attendeeProperty.role = role
|
|
attendee.role = role
|
|
},
|
|
|
|
/**
|
|
* Changes an attendees' RVSP
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.attendee The attendee object
|
|
* @param {Boolean} data.rsvp New RSVP value
|
|
*/
|
|
toggleAttendeeRSVP(state, { attendee }) {
|
|
const oldRSVP = attendee.attendeeProperty.rsvp
|
|
attendee.attendeeProperty.rsvp = !oldRSVP
|
|
attendee.rsvp = !oldRSVP
|
|
},
|
|
|
|
/**
|
|
* Set the event's organizer
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String=} data.commonName Displayname of organizer
|
|
* @param {String} data.email Email-address of organizer
|
|
*/
|
|
setOrganizer(state, { calendarObjectInstance, commonName = null, email }) {
|
|
calendarObjectInstance.eventComponent.setOrganizerFromNameAndEMail(commonName, email)
|
|
Vue.set(calendarObjectInstance, 'organizer', {})
|
|
Vue.set(calendarObjectInstance.organizer, 'commonName', commonName)
|
|
Vue.set(calendarObjectInstance.organizer, 'uri', email)
|
|
Vue.set(calendarObjectInstance.organizer, 'attendeeProperty', calendarObjectInstance.eventComponent.getFirstProperty('ORGANIZER'))
|
|
},
|
|
|
|
/**
|
|
* Adds a category to the event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.category Category to add
|
|
*/
|
|
addCategory(state, { calendarObjectInstance, category }) {
|
|
calendarObjectInstance.eventComponent.addCategory(category)
|
|
calendarObjectInstance.categories.push(category)
|
|
},
|
|
|
|
/**
|
|
* Removes a category from the event
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.category Category to remove
|
|
*/
|
|
removeCategory(state, { calendarObjectInstance, category }) {
|
|
calendarObjectInstance.eventComponent.removeCategory(category)
|
|
|
|
const index = calendarObjectInstance.categories.indexOf(category)
|
|
if (index !== -1) {
|
|
calendarObjectInstance.categories.splice(index, 1)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the interval of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.interval The new interval to set
|
|
*/
|
|
changeRecurrenceInterval(state, { calendarObjectInstance, recurrenceRule, interval }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.interval = interval
|
|
recurrenceRule.interval = interval
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the frequency of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.frequency The new frequency to set
|
|
*/
|
|
changeRecurrenceFrequency(state, { calendarObjectInstance, recurrenceRule, frequency }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.frequency = frequency
|
|
recurrenceRule.frequency = frequency
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the count limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.count The new count to set
|
|
*/
|
|
changeRecurrenceCount(state, { calendarObjectInstance, recurrenceRule, count }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.count = count
|
|
recurrenceRule.count = count
|
|
recurrenceRule.until = null
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {Date} data.until The new until to set
|
|
*/
|
|
changeRecurrenceUntil(state, { calendarObjectInstance, recurrenceRule, until }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
// RFC 5545, setion 3.3.10: until must be in UTC if the start time is timezone-aware
|
|
if (calendarObjectInstance.startTimezoneId !== 'floating') {
|
|
recurrenceRule.recurrenceRuleValue.until = DateTimeValue.fromJSDate(until, { zone: 'utc' })
|
|
} else {
|
|
recurrenceRule.recurrenceRuleValue.until = DateTimeValue.fromJSDate(until)
|
|
}
|
|
recurrenceRule.until = until
|
|
recurrenceRule.count = null
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Changes the recurrence-rule to never end
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
changeRecurrenceToInfinite(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.setToInfinite()
|
|
recurrenceRule.until = null
|
|
recurrenceRule.count = null
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reset the By-parts of the recurrence rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
resetRecurrenceByParts(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const parts = [
|
|
'BYSECOND',
|
|
'BYMINUTE',
|
|
'BYHOUR',
|
|
'BYDAY',
|
|
'BYMONTHDAY',
|
|
'BYYEARDAY',
|
|
'BYWEEKNO',
|
|
'BYMONTH',
|
|
'BYSETPOS',
|
|
]
|
|
|
|
for (const part of parts) {
|
|
recurrenceRule.recurrenceRuleValue.setComponent(part, [])
|
|
}
|
|
|
|
Vue.set(recurrenceRule, 'byDay', [])
|
|
Vue.set(recurrenceRule, 'byMonth', [])
|
|
Vue.set(recurrenceRule, 'byMonthDay', [])
|
|
Vue.set(recurrenceRule, 'bySetPosition', null)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reset the By-parts of the recurrence rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
setDefaultRecurrenceByPartsForWeekly(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byDay = getWeekDayFromDate(calendarObjectInstance.startDate)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYDAY', [byDay])
|
|
recurrenceRule.byDay.push(byDay)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reset the By-parts of the recurrence rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
setDefaultRecurrenceByPartsForMonthly(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byMonthDay = calendarObjectInstance.startDate.getDate().toString()
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTHDAY', [byMonthDay])
|
|
recurrenceRule.byMonthDay.push(byMonthDay)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
setDefaultRecurrenceByPartsForMonthlyBySetPosition(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const {
|
|
byDay,
|
|
bySetPosition,
|
|
} = getBySetPositionAndBySetFromDate(calendarObjectInstance.startDate)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYDAY', [byDay])
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYSETPOS', [bySetPosition])
|
|
|
|
recurrenceRule.byDay.push(byDay)
|
|
recurrenceRule.bySetPosition = bySetPosition
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Reset the By-parts of the recurrence rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
setDefaultRecurrenceByPartsForYearly(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byMonth = calendarObjectInstance.startDate.getMonth() + 1 // Javascript months are zero-based
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTH', [byMonth])
|
|
recurrenceRule.byMonth.push(byMonth)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byDay The new until to set
|
|
*/
|
|
addByDayToRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byDay }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byDayList = recurrenceRule.recurrenceRuleValue.getComponent('BYDAY')
|
|
const index = byDayList.indexOf(byDay)
|
|
if (index === -1) {
|
|
byDayList.push(byDay)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYDAY', byDayList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byDay.indexOf(byDay)
|
|
if (index2 === -1) {
|
|
recurrenceRule.byDay.push(byDay)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byDay The new until to set
|
|
*/
|
|
removeByDayFromRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byDay }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byDayList = recurrenceRule.recurrenceRuleValue.getComponent('BYDAY')
|
|
const index = byDayList.indexOf(byDay)
|
|
if (index !== -1) {
|
|
byDayList.splice(index, 1)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYDAY', byDayList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byDay.indexOf(byDay)
|
|
if (index2 !== -1) {
|
|
recurrenceRule.byDay.splice(index2, 1)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byMonthDay The new until to set
|
|
*/
|
|
addByMonthDayToRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byMonthDay }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byMonthDayList = recurrenceRule.recurrenceRuleValue.getComponent('BYMONTHDAY')
|
|
const index = byMonthDayList.indexOf(byMonthDay)
|
|
if (index === -1) {
|
|
byMonthDayList.push(byMonthDay)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTHDAY', byMonthDayList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byMonthDay.indexOf(byMonthDay)
|
|
if (index2 === -1) {
|
|
recurrenceRule.byMonthDay.push(byMonthDay)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byMonthDay The new until to set
|
|
*/
|
|
removeByMonthDayFromRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byMonthDay }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
const byMonthDayList = recurrenceRule.recurrenceRuleValue.getComponent('BYMONTHDAY')
|
|
const index = byMonthDayList.indexOf(byMonthDay)
|
|
if (index !== -1) {
|
|
byMonthDayList.splice(index, 1)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTHDAY', byMonthDayList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byMonthDay.indexOf(byMonthDay)
|
|
if (index2 !== -1) {
|
|
recurrenceRule.byMonthDay.splice(index2, 1)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byMonth The new until to set
|
|
*/
|
|
addByMonthToRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byMonth }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
console.debug('addByMonthToRecurrenceRule', byMonth)
|
|
|
|
const byMonthList = recurrenceRule.recurrenceRuleValue.getComponent('BYMONTH')
|
|
const index = byMonthList.indexOf(byMonth)
|
|
if (index === -1) {
|
|
byMonthList.push(byMonth)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTH', byMonthList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byMonth.indexOf(byMonth)
|
|
if (index2 === -1) {
|
|
recurrenceRule.byMonth.push(byMonth)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.byMonth The new until to set
|
|
*/
|
|
removeByMonthFromRecurrenceRule(state, { calendarObjectInstance, recurrenceRule, byMonth }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
console.debug('removeByMonthFromRecurrenceRule', byMonth)
|
|
|
|
const byMonthList = recurrenceRule.recurrenceRuleValue.getComponent('BYMONTH')
|
|
const index = byMonthList.indexOf(byMonth)
|
|
if (index !== -1) {
|
|
byMonthList.splice(index, 1)
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYMONTH', byMonthList)
|
|
}
|
|
|
|
const index2 = recurrenceRule.byMonth.indexOf(byMonth)
|
|
if (index2 !== -1) {
|
|
recurrenceRule.byMonth.splice(index2, 1)
|
|
}
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String[]} data.byDay The new until to set
|
|
*/
|
|
changeRecurrenceByDay(state, { calendarObjectInstance, recurrenceRule, byDay }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYDAY', byDay)
|
|
Vue.set(recurrenceRule, 'byDay', byDay)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Change the until limit of the recurrence-rule
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data.bySetPosition The new until to set
|
|
*/
|
|
changeRecurrenceBySetPosition(state, { calendarObjectInstance, recurrenceRule, bySetPosition }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYSETPOS', [bySetPosition])
|
|
Vue.set(recurrenceRule, 'bySetPosition', bySetPosition)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
unsetRecurrenceBySetPosition(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
recurrenceRule.recurrenceRuleValue.setComponent('BYSETPOS', [])
|
|
Vue.set(recurrenceRule, 'bySetPosition', null)
|
|
|
|
console.debug(recurrenceRule.recurrenceRuleValue._innerValue.toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Remove the recurrence-rule from the calendarObjectInstance
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
removeRecurrenceRuleFromCalendarObjectInstance(state, { calendarObjectInstance, recurrenceRule }) {
|
|
if (recurrenceRule.recurrenceRuleValue) {
|
|
calendarObjectInstance.eventComponent.deleteAllProperties('RRULE')
|
|
Vue.set(calendarObjectInstance, 'recurrenceRule', getDefaultEventObject().recurrenceRule)
|
|
|
|
console.debug(calendarObjectInstance)
|
|
console.debug(recurrenceRule)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Add a new recurrence-rule to the calendarObjectInstance
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
*/
|
|
addRecurrenceRuleFromCalendarObjectInstance(state, { calendarObjectInstance }) {
|
|
const recurrenceValue = RecurValue.fromData({})
|
|
const recurrenceProperty = new Property('RRULE', recurrenceValue)
|
|
calendarObjectInstance.eventComponent.addProperty(recurrenceProperty)
|
|
calendarObjectInstance.recurrenceRule.recurrenceRuleValue = recurrenceValue
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
markRecurrenceRuleAsSupported(state, { calendarObjectInstance, recurrenceRule }) {
|
|
recurrenceRule.isUnsupported = false
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {String} data.type New type of alarm
|
|
*/
|
|
changeAlarmType(state, { calendarObjectInstance, alarm, type }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.action = type
|
|
alarm.type = type
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {Number} data.amount New amount of timed event
|
|
*/
|
|
changeAlarmAmountTimed(state, { calendarObjectInstance, alarm, amount }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.totalSeconds
|
|
= getTotalSecondsFromAmountAndUnitForTimedEvents(amount, alarm.relativeUnitTimed, alarm.relativeIsBefore)
|
|
|
|
alarm.relativeAmountTimed = amount
|
|
alarm.relativeTrigger = alarm.alarmComponent.trigger.value.totalSeconds
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {String} data.unit New unit of timed event
|
|
*/
|
|
changeAlarmUnitTimed(state, { calendarObjectInstance, alarm, unit }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.totalSeconds
|
|
= getTotalSecondsFromAmountAndUnitForTimedEvents(alarm.relativeAmountTimed, unit, alarm.relativeIsBefore)
|
|
|
|
alarm.relativeUnitTimed = unit
|
|
alarm.relativeTrigger = alarm.alarmComponent.trigger.value.totalSeconds
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {Number} data.amount New amount of all-day event
|
|
*/
|
|
changeAlarmAmountAllDay(state, { calendarObjectInstance, alarm, amount }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.totalSeconds
|
|
= getTotalSecondsFromAmountHourMinutesAndUnitForAllDayEvents(amount,
|
|
alarm.relativeHoursAllDay, alarm.relativeMinutesAllDay, alarm.relativeUnitAllDay)
|
|
|
|
alarm.relativeAmountAllDay = amount
|
|
alarm.relativeTrigger = alarm.alarmComponent.trigger.value.totalSeconds
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {String} data.unit New Unit of all-day event
|
|
*/
|
|
changeAlarmUnitAllDay(state, { calendarObjectInstance, alarm, unit }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.totalSeconds
|
|
= getTotalSecondsFromAmountHourMinutesAndUnitForAllDayEvents(alarm.relativeAmountAllDay,
|
|
alarm.relativeHoursAllDay, alarm.relativeMinutesAllDay, unit)
|
|
|
|
alarm.relativeUnitAllDay = unit
|
|
alarm.relativeTrigger = alarm.alarmComponent.trigger.value.totalSeconds
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {Number} data.hours New Hour
|
|
* @param {Number} data.minutes New Minutes
|
|
*/
|
|
changeAlarmHoursMinutesAllDay(state, { calendarObjectInstance, alarm, hours, minutes }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.totalSeconds
|
|
= getTotalSecondsFromAmountHourMinutesAndUnitForAllDayEvents(alarm.relativeAmountAllDay,
|
|
hours, minutes, alarm.relativeUnitAllDay)
|
|
|
|
alarm.relativeHoursAllDay = hours
|
|
alarm.relativeMinutesAllDay = minutes
|
|
alarm.relativeTrigger = alarm.alarmComponent.trigger.value.totalSeconds
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {Date} data.date New date object
|
|
*/
|
|
changeAlarmAbsoluteDate(state, { calendarObjectInstance, alarm, date }) {
|
|
if (alarm.alarmComponent) {
|
|
alarm.alarmComponent.trigger.value.year = date.getFullYear()
|
|
alarm.alarmComponent.trigger.value.month = date.getMonth() + 1
|
|
alarm.alarmComponent.trigger.value.day = date.getDate()
|
|
alarm.alarmComponent.trigger.value.hour = date.getHours()
|
|
alarm.alarmComponent.trigger.value.minute = date.getMinutes()
|
|
alarm.alarmComponent.trigger.value.second = 0
|
|
|
|
alarm.absoluteDate = date
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
* @param {String} data.timezoneId New timezoneId
|
|
*/
|
|
changeAlarmAbsoluteTimezoneId(state, { calendarObjectInstance, alarm, timezoneId }) {
|
|
if (alarm.alarmComponent) {
|
|
const timezone = getTimezoneManager().getTimezoneForId(timezoneId)
|
|
alarm.alarmComponent.trigger.value.replaceTimezone(timezone)
|
|
|
|
alarm.absoluteTimezoneId = timezoneId
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
changeAlarmFromRelativeToAbsolute(state, { calendarObjectInstance, alarm }) {
|
|
if (alarm.alarmComponent) {
|
|
const triggerDateTime = calendarObjectInstance.eventComponent.startDate.clone()
|
|
// The trigger of an alarm must be DATE-TIME, startDate can be either.
|
|
triggerDateTime.isDate = false
|
|
|
|
triggerDateTime.addDuration(alarm.alarmComponent.trigger.value)
|
|
|
|
alarm.alarmComponent.setTriggerFromAbsolute(triggerDateTime)
|
|
|
|
alarm.absoluteDate = getDateFromDateTimeValue(alarm.alarmComponent.trigger.value)
|
|
alarm.absoluteTimezoneId = alarm.alarmComponent.trigger.value.timezoneId
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
changeAlarmFromAbsoluteToRelative(state, { calendarObjectInstance, alarm }) {
|
|
if (alarm.alarmComponent) {
|
|
const duration = alarm.alarmComponent.trigger.value
|
|
.subtractDateWithTimezone(calendarObjectInstance.eventComponent.startDate)
|
|
|
|
alarm.alarmComponent.setTriggerFromRelative(duration)
|
|
alarm.relativeIsBefore = alarm.alarmComponent.trigger.value.isNegative
|
|
alarm.relativeIsRelatedToStart = true
|
|
alarm.relativeTrigger = duration.totalSeconds
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
resetAlarmRelativeParts(state, { alarm }) {
|
|
alarm.relativeIsBefore = null
|
|
alarm.relativeIsRelatedToStart = null
|
|
alarm.relativeUnitTimed = null
|
|
alarm.relativeAmountTimed = null
|
|
alarm.relativeUnitAllDay = null
|
|
alarm.relativeAmountAllDay = null
|
|
alarm.relativeHoursAllDay = null
|
|
alarm.relativeMinutesAllDay = null
|
|
alarm.relativeTrigger = null
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
resetAlarmAbsoluteParts(state, { alarm }) {
|
|
alarm.absoluteDate = null
|
|
alarm.absoluteTimezoneId = null
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
updateAlarmAllDayParts(state, { calendarObjectInstance, alarm }) {
|
|
if (alarm.alarmComponent) {
|
|
const totalSeconds = alarm.alarmComponent.trigger.value.totalSeconds
|
|
const allDayParts = getAmountHoursMinutesAndUnitForAllDayEvents(totalSeconds)
|
|
|
|
alarm.relativeUnitAllDay = allDayParts.unit
|
|
alarm.relativeAmountAllDay = allDayParts.amount
|
|
alarm.relativeHoursAllDay = allDayParts.hours
|
|
alarm.relativeMinutesAllDay = allDayParts.minutes
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
updateAlarmTimedParts(state, { calendarObjectInstance, alarm }) {
|
|
if (alarm.alarmComponent) {
|
|
const totalSeconds = alarm.alarmComponent.trigger.value.totalSeconds
|
|
const timedParts = getAmountAndUnitForTimedEvents(totalSeconds)
|
|
|
|
alarm.relativeUnitTimed = timedParts.unit
|
|
alarm.relativeAmountTimed = timedParts.amount
|
|
|
|
console.debug(alarm.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data.type Type of alarm
|
|
* @param {Number} data.totalSeconds Total amount of seconds for new alarm
|
|
*/
|
|
addAlarmToCalendarObjectInstance(state, { calendarObjectInstance, type, totalSeconds }) {
|
|
if (calendarObjectInstance.eventComponent) {
|
|
const eventComponent = calendarObjectInstance.eventComponent
|
|
|
|
const duration = DurationValue.fromSeconds(totalSeconds)
|
|
const alarmComponent = eventComponent.addRelativeAlarm(type, duration)
|
|
|
|
const alarmObject = mapAlarmComponentToAlarmObject(alarmComponent)
|
|
|
|
calendarObjectInstance.alarms.push(alarmObject)
|
|
|
|
console.debug(alarmObject.alarmComponent.toICALJs().toString())
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} state The Vuex state
|
|
* @param {Object} data The destructuring object
|
|
* @param {Object} data.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data.alarm The alarm object
|
|
*/
|
|
removeAlarmFromCalendarObjectInstance(state, { calendarObjectInstance, alarm }) {
|
|
if (alarm.alarmComponent) {
|
|
calendarObjectInstance.eventComponent.removeAlarm(alarm.alarmComponent)
|
|
|
|
const index = calendarObjectInstance.alarms.indexOf(alarm)
|
|
if (index !== -1) {
|
|
calendarObjectInstance.alarms.splice(index, 1)
|
|
}
|
|
}
|
|
},
|
|
}
|
|
|
|
const getters = {}
|
|
|
|
const actions = {
|
|
|
|
/**
|
|
* Returns the closest existing recurrence-id of a calendar-object
|
|
* close to the given date.
|
|
* This is either the next occurrence in the future or
|
|
* in case there are no more future occurrences the closest
|
|
* occurrence in the past
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {String} data.objectId The objectId of the calendar-object to edit
|
|
* @param {Date} data.closeToDate The date to get a close occurrence to
|
|
* @returns {Promise<Number>}
|
|
*/
|
|
async resolveClosestRecurrenceIdForCalendarObject({ state, dispatch, commit }, { objectId, closeToDate }) {
|
|
const calendarObject = await dispatch('getEventByObjectId', { objectId })
|
|
const iterator = calendarObject.calendarComponent.getVObjectIterator()
|
|
const firstVObject = iterator.next().value
|
|
|
|
const d = DateTimeValue.fromJSDate(closeToDate, true)
|
|
return firstVObject
|
|
.recurrenceManager
|
|
.getClosestOccurrence(d)
|
|
.getReferenceRecurrenceId()
|
|
.unixTime
|
|
},
|
|
|
|
/**
|
|
* Gets the calendar-object and calendar-object-instance
|
|
* for a given objectId and recurrenceId.
|
|
*
|
|
* If the recurrenceId does not represent a valid instance,
|
|
* an error will be thrown.
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {String} data.objectId The objectId of the calendar-object to edit
|
|
* @param {Number} data.recurrenceId The recurrence-id to edit
|
|
* @returns {Promise<{calendarObject: Object, calendarObjectInstance: Object}>}
|
|
*/
|
|
async getCalendarObjectInstanceByObjectIdAndRecurrenceId({ state, dispatch, commit }, { objectId, recurrenceId }) {
|
|
if (state.existingEvent.objectId === objectId && state.existingEvent.recurrenceId === recurrenceId) {
|
|
return Promise.resolve({
|
|
calendarObject: state.calendarObject,
|
|
calendarObjectInstance: state.calendarObjectInstance,
|
|
})
|
|
}
|
|
|
|
const recurrenceIdDate = new Date(recurrenceId * 1000)
|
|
const calendarObject = await dispatch('getEventByObjectId', { objectId })
|
|
const eventComponent = getObjectAtRecurrenceId(calendarObject, recurrenceIdDate)
|
|
if (eventComponent === null) {
|
|
throw new Error('Not a valid recurrence-id')
|
|
}
|
|
|
|
const calendarObjectInstance = mapEventComponentToEventObject(eventComponent)
|
|
commit('setCalendarObjectInstanceForExistingEvent', {
|
|
calendarObject,
|
|
calendarObjectInstance,
|
|
objectId,
|
|
recurrenceId,
|
|
})
|
|
|
|
return {
|
|
calendarObject,
|
|
calendarObjectInstance,
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Gets the new calendar-object-instance.
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {Boolean} data.isAllDay Whether or not the new event is supposed to be all-day
|
|
* @param {Number} data.start The start of the new event (unixtime)
|
|
* @param {Number} data.end The end of the new event (unixtime)
|
|
* @param {String} data.timezoneId The timezoneId of the new event
|
|
* @returns {Promise<{calendarObject: Object, calendarObjectInstance: Object}>}
|
|
*/
|
|
async getCalendarObjectInstanceForNewEvent({ state, dispatch, commit }, { isAllDay, start, end, timezoneId }) {
|
|
if (state.isNew === true) {
|
|
return Promise.resolve({
|
|
calendarObject: state.calendarObject,
|
|
calendarObjectInstance: state.calendarObjectInstance,
|
|
})
|
|
}
|
|
|
|
const calendarObject = await dispatch('createNewEvent', { start, end, isAllDay, timezoneId })
|
|
const startDate = new Date(start * 1000)
|
|
const eventComponent = getObjectAtRecurrenceId(calendarObject, startDate)
|
|
const calendarObjectInstance = mapEventComponentToEventObject(eventComponent)
|
|
|
|
// Add an alarm if the user set a default one in the settings. If
|
|
// not, defaultReminder will not be a number (rather the string "none").
|
|
const defaultReminder = parseInt(settings.state.defaultReminder)
|
|
if (!isNaN(defaultReminder)) {
|
|
commit('addAlarmToCalendarObjectInstance', {
|
|
calendarObjectInstance: calendarObjectInstance,
|
|
type: 'DISPLAY',
|
|
totalSeconds: defaultReminder,
|
|
})
|
|
logger.debug(`Added defaultReminder (${defaultReminder}s) to newly created event`)
|
|
}
|
|
|
|
commit('setCalendarObjectInstanceForNewEvent', {
|
|
calendarObject,
|
|
calendarObjectInstance,
|
|
})
|
|
|
|
return {
|
|
calendarObject,
|
|
calendarObjectInstance,
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Updates the existing calendar-object-instance.
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {Boolean} data.isAllDay Whether or not the new event is supposed to be all-day
|
|
* @param {Number} data.start The start of the new event (unixtime)
|
|
* @param {Number} data.end The end of the new event (unixtime)
|
|
* @param {String} data.timezoneId The timezoneId of the new event
|
|
* @returns {Promise<{calendarObject: Object, calendarObjectInstance: Object}>}
|
|
*/
|
|
async updateCalendarObjectInstanceForNewEvent({ state, dispatch, commit }, { isAllDay, start, end, timezoneId }) {
|
|
await dispatch('updateTimeOfNewEvent', {
|
|
calendarObjectInstance: state.calendarObjectInstance,
|
|
start,
|
|
end,
|
|
isAllDay,
|
|
timezoneId,
|
|
})
|
|
commit('setCalendarObjectInstanceForNewEvent', {
|
|
calendarObject: state.calendarObject,
|
|
calendarObjectInstance: state.calendarObjectInstance,
|
|
})
|
|
|
|
return {
|
|
calendarObject: state.calendarObject,
|
|
calendarObjectInstance: state.calendarObjectInstance,
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Saves changes made to a single calendar-object-instance
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {Boolean} data.thisAndAllFuture Whether or not to save changes for all future occurrences or just this one
|
|
* @param {String} data.calendarId The new calendar-id to store it in
|
|
* @returns {Promise<void>}
|
|
*/
|
|
async saveCalendarObjectInstance({ state, dispatch, commit }, { thisAndAllFuture, calendarId }) {
|
|
const eventComponent = state.calendarObjectInstance.eventComponent
|
|
const calendarObject = state.calendarObject
|
|
|
|
if (eventComponent.isDirty()) {
|
|
const isForkedItem = eventComponent.primaryItem !== null
|
|
let original = null
|
|
let fork = null
|
|
|
|
// We check if two things apply:
|
|
// - primaryItem !== null -> Is this a fork or not?
|
|
// - eventComponent.canCreateRecurrenceExceptions() - Can we create a recurrence-exception for this item
|
|
if (isForkedItem && eventComponent.canCreateRecurrenceExceptions()) {
|
|
[original, fork] = eventComponent.createRecurrenceException(thisAndAllFuture)
|
|
}
|
|
|
|
await dispatch('updateCalendarObject', { calendarObject })
|
|
|
|
if (original !== null && fork !== null && original.root !== fork.root) {
|
|
await dispatch('createCalendarObjectFromFork', {
|
|
eventComponent: fork,
|
|
calendarId: calendarId,
|
|
})
|
|
}
|
|
}
|
|
|
|
if (calendarId !== state.calendarObject.calendarId) {
|
|
await dispatch('moveCalendarObject', {
|
|
calendarObject,
|
|
newCalendarId: calendarId,
|
|
})
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Deletes a calendar-object-instance
|
|
*
|
|
* @param {Object} vuex The vuex destructuring object
|
|
* @param {Object} vuex.state The Vuex state
|
|
* @param {Function} vuex.dispatch The Vuex dispatch function
|
|
* @param {Function} vuex.commit The Vuex commit function
|
|
* @param {Object} data The destructuring object
|
|
* @param {Boolean} data.thisAndAllFuture Whether or not to delete all future occurrences or just this one
|
|
* @returns {Promise<void>}
|
|
*/
|
|
async deleteCalendarObjectInstance({ state, dispatch, commit }, { thisAndAllFuture }) {
|
|
const eventComponent = state.calendarObjectInstance.eventComponent
|
|
const isRecurrenceSetEmpty = eventComponent.removeThisOccurrence(thisAndAllFuture)
|
|
const calendarObject = state.calendarObject
|
|
|
|
if (isRecurrenceSetEmpty) {
|
|
await dispatch('deleteCalendarObject', { calendarObject })
|
|
} else {
|
|
await dispatch('updateCalendarObject', { calendarObject })
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Date} data2.startDate The new start-date
|
|
*/
|
|
changeStartDate({ commit }, { calendarObjectInstance, startDate }) {
|
|
const difference = startDate.getTime() - calendarObjectInstance.startDate.getTime()
|
|
const endDate = new Date(calendarObjectInstance.endDate.getTime() + difference)
|
|
|
|
commit('changeStartDate', {
|
|
calendarObjectInstance,
|
|
startDate,
|
|
})
|
|
commit('changeEndDate', {
|
|
calendarObjectInstance,
|
|
endDate,
|
|
})
|
|
},
|
|
|
|
/**
|
|
* Change the timezone of the event's start
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data2.startTimezone New timezone to set for start
|
|
*/
|
|
changeStartTimezone({ commit }, { calendarObjectInstance, startTimezone }) {
|
|
commit('changeStartTimezone', { calendarObjectInstance, startTimezone })
|
|
|
|
// Simulate a change of the start time to trigger the comparison
|
|
// of start and end and trigger an update of end if necessary
|
|
commit('changeStartDate', {
|
|
calendarObjectInstance,
|
|
startDate: calendarObjectInstance.startDate,
|
|
})
|
|
},
|
|
|
|
/**
|
|
* Change the timezone of the event's end
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {String} data2.endTimezone New timezone to set for end
|
|
*/
|
|
changeEndTimezone({ commit }, { calendarObjectInstance, endTimezone }) {
|
|
commit('changeEndTimezone', { calendarObjectInstance, endTimezone })
|
|
|
|
// Simulate a change of the end time to trigger the comparison
|
|
// of start and end and trigger an update of start if necessary
|
|
commit('changeEndDate', {
|
|
calendarObjectInstance,
|
|
endDate: calendarObjectInstance.endDate,
|
|
})
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Function} data.dispatch The Vuex dispatch function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data2.frequency The new frequency to set
|
|
*/
|
|
changeRecurrenceFrequency({ commit, dispatch }, { calendarObjectInstance, recurrenceRule, frequency }) {
|
|
|
|
console.debug(calendarObjectInstance)
|
|
console.debug(recurrenceRule)
|
|
console.debug(frequency)
|
|
|
|
if (recurrenceRule.frequency === 'NONE' && frequency !== 'NONE') {
|
|
// Add a new recurrence-rule
|
|
commit('addRecurrenceRuleFromCalendarObjectInstance', { calendarObjectInstance })
|
|
commit('resetRecurrenceByParts', { calendarObjectInstance, recurrenceRule })
|
|
commit('changeRecurrenceFrequency', {
|
|
calendarObjectInstance,
|
|
recurrenceRule: calendarObjectInstance.recurrenceRule,
|
|
frequency,
|
|
})
|
|
commit('changeRecurrenceInterval', {
|
|
calendarObjectInstance,
|
|
recurrenceRule: calendarObjectInstance.recurrenceRule,
|
|
interval: 1,
|
|
})
|
|
commit('changeRecurrenceToInfinite', {
|
|
calendarObjectInstance,
|
|
recurrenceRule: calendarObjectInstance.recurrenceRule,
|
|
})
|
|
dispatch('setDefaultRecurrenceByParts', { calendarObjectInstance, recurrenceRule, frequency })
|
|
|
|
console.debug(`changed from none to ${frequency}`)
|
|
} else if (recurrenceRule.frequency !== 'NONE' && frequency === 'NONE') {
|
|
console.debug('calling removeRecurrenceRuleFromCalendarObjectInstance')
|
|
// Remove the recurrence-rule
|
|
commit('removeRecurrenceRuleFromCalendarObjectInstance', { calendarObjectInstance, recurrenceRule })
|
|
} else {
|
|
// Change frequency of existing recurrence-rule
|
|
commit('resetRecurrenceByParts', { calendarObjectInstance, recurrenceRule })
|
|
commit('changeRecurrenceFrequency', {
|
|
calendarObjectInstance,
|
|
recurrenceRule: calendarObjectInstance.recurrenceRule,
|
|
frequency,
|
|
})
|
|
dispatch('setDefaultRecurrenceByParts', { calendarObjectInstance, recurrenceRule, frequency })
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
* @param {String} data2.frequency The new frequency to set
|
|
*/
|
|
setDefaultRecurrenceByParts({ commit }, { calendarObjectInstance, recurrenceRule, frequency }) {
|
|
switch (frequency) {
|
|
case 'WEEKLY':
|
|
commit('setDefaultRecurrenceByPartsForWeekly', { calendarObjectInstance, recurrenceRule })
|
|
break
|
|
|
|
case 'MONTHLY':
|
|
commit('setDefaultRecurrenceByPartsForMonthly', { calendarObjectInstance, recurrenceRule })
|
|
break
|
|
|
|
case 'YEARLY':
|
|
commit('setDefaultRecurrenceByPartsForYearly', { calendarObjectInstance, recurrenceRule })
|
|
break
|
|
}
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
setRecurrenceToInfinite({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
commit('changeRecurrenceToInfinite', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
})
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
changeMonthlyRecurrenceFromByDayToBySetPosition({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
console.debug('changeMonthlyRecurrenceFromByDayToBySetPosition')
|
|
commit('resetRecurrenceByParts', { calendarObjectInstance, recurrenceRule })
|
|
commit('setDefaultRecurrenceByPartsForMonthlyBySetPosition', { calendarObjectInstance, recurrenceRule })
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
changeMonthlyRecurrenceFromBySetPositionToByDay({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
console.debug('changeMonthlyRecurrenceFromBySetPositionToByDay')
|
|
commit('resetRecurrenceByParts', { calendarObjectInstance, recurrenceRule })
|
|
commit('setDefaultRecurrenceByPartsForMonthly', { calendarObjectInstance, recurrenceRule })
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
enableYearlyRecurrenceBySetPosition({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
commit('setDefaultRecurrenceByPartsForMonthlyBySetPosition', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
})
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
disableYearlyRecurrenceBySetPosition({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
commit('changeRecurrenceByDay', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
byDay: [],
|
|
})
|
|
commit('unsetRecurrenceBySetPosition', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
})
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
enableRecurrenceLimitByUntil({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
let until
|
|
switch (recurrenceRule.frequency) {
|
|
// Defaults to 7 days
|
|
case 'DAILY':
|
|
until = new Date(calendarObjectInstance.startDate.getTime() + 7 * 24 * 60 * 60 * 1000)
|
|
break
|
|
|
|
// Defaults to 4 weeks
|
|
case 'WEEKLY':
|
|
until = new Date(calendarObjectInstance.startDate.getTime() + 4 * 7 * 24 * 60 * 60 * 1000)
|
|
break
|
|
|
|
// Defaults to 10 year
|
|
case 'YEARLY':
|
|
until = new Date(
|
|
calendarObjectInstance.startDate.getFullYear() + 10,
|
|
calendarObjectInstance.startDate.getMonth(),
|
|
calendarObjectInstance.startDate.getDate(),
|
|
23,
|
|
59,
|
|
59
|
|
)
|
|
break
|
|
|
|
// Defaults to 12 months
|
|
case 'MONTHLY':
|
|
default:
|
|
until = new Date(
|
|
calendarObjectInstance.startDate.getFullYear() + 1,
|
|
calendarObjectInstance.startDate.getMonth(),
|
|
calendarObjectInstance.startDate.getDate(),
|
|
23,
|
|
59,
|
|
59
|
|
)
|
|
break
|
|
}
|
|
|
|
commit('changeRecurrenceToInfinite', { calendarObjectInstance, recurrenceRule })
|
|
commit('changeRecurrenceUntil', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
until,
|
|
})
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param {Object} data The destructuring object for Vuex
|
|
* @param {Function} data.commit The Vuex commit function
|
|
* @param {Object} data2 The destructuring object for data
|
|
* @param {Object} data2.calendarObjectInstance The calendarObjectInstance object
|
|
* @param {Object} data2.recurrenceRule The recurrenceRule object to modify
|
|
*/
|
|
enableRecurrenceLimitByCount({ commit }, { calendarObjectInstance, recurrenceRule }) {
|
|
commit('changeRecurrenceToInfinite', { calendarObjectInstance, recurrenceRule })
|
|
commit('changeRecurrenceCount', {
|
|
calendarObjectInstance,
|
|
recurrenceRule,
|
|
count: 2, // Default value is two
|
|
})
|
|
},
|
|
|
|
changeAlarmAmountTimed({ commit }, { calendarObjectInstance, alarm, amount }) {
|
|
commit('changeAlarmAmountTimed', { calendarObjectInstance, alarm, amount })
|
|
commit('updateAlarmAllDayParts', { calendarObjectInstance, alarm })
|
|
},
|
|
|
|
changeAlarmUnitTimed({ commit }, { calendarObjectInstance, alarm, unit }) {
|
|
commit('changeAlarmUnitTimed', { calendarObjectInstance, alarm, unit })
|
|
commit('updateAlarmAllDayParts', { calendarObjectInstance, alarm })
|
|
},
|
|
|
|
changeAlarmAmountAllDay({ commit }, { calendarObjectInstance, alarm, amount }) {
|
|
commit('changeAlarmAmountAllDay', { calendarObjectInstance, alarm, amount })
|
|
commit('updateAlarmTimedParts', { calendarObjectInstance, alarm })
|
|
},
|
|
|
|
changeAlarmUnitAllDay({ commit }, { calendarObjectInstance, alarm, unit }) {
|
|
commit('changeAlarmUnitAllDay', { calendarObjectInstance, alarm, unit })
|
|
commit('updateAlarmTimedParts', { calendarObjectInstance, alarm })
|
|
},
|
|
|
|
changeAlarmHoursMinutesAllDay({ commit }, { calendarObjectInstance, alarm, hours, minutes }) {
|
|
commit('changeAlarmHoursMinutesAllDay', { calendarObjectInstance, alarm, hours, minutes })
|
|
commit('updateAlarmTimedParts', { calendarObjectInstance, alarm })
|
|
},
|
|
|
|
changeAlarmFromRelativeToAbsolute({ commit }, { calendarObjectInstance, alarm }) {
|
|
commit('changeAlarmFromRelativeToAbsolute', { calendarObjectInstance, alarm })
|
|
commit('resetAlarmRelativeParts', { alarm })
|
|
},
|
|
|
|
changeAlarmFromAbsoluteToRelative({ commit }, { calendarObjectInstance, alarm }) {
|
|
commit('changeAlarmFromAbsoluteToRelative', { calendarObjectInstance, alarm })
|
|
commit('updateAlarmAllDayParts', { calendarObjectInstance, alarm })
|
|
commit('updateAlarmTimedParts', { calendarObjectInstance, alarm })
|
|
commit('resetAlarmAbsoluteParts', { alarm })
|
|
},
|
|
|
|
toggleAllDay({ commit, getters }, { calendarObjectInstance }) {
|
|
commit('toggleAllDay', { calendarObjectInstance })
|
|
|
|
if (!calendarObjectInstance.isAllDay) {
|
|
if (calendarObjectInstance.startTimezoneId === 'floating') {
|
|
const startTimezone = getters.getResolvedTimezone
|
|
commit('changeStartTimezone', { calendarObjectInstance, startTimezone })
|
|
}
|
|
|
|
commit('changeTimeToDefaultForTimedEvents', { calendarObjectInstance })
|
|
}
|
|
},
|
|
|
|
}
|
|
|
|
export default { state, mutations, getters, actions }
|