Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 74 additions & 22 deletions src/components/AppNavigation/EditCalendarModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,32 @@
</template>
<template v-if="!calendar.isSharedWithMe && isAfterVersion">
<div class="edit-calendar-modal__default-alarm">
<label for="default-alarm-select" class="edit-calendar-modal__default-alarm__label">
{{ $t('calendar', 'Default reminder') }}
<label for="default-alarm-partday-select" class="edit-calendar-modal__default-alarm__label">
{{ $t('calendar', 'Default reminder for events with time') }}
</label>
<NcSelect
id="default-alarm-select"
v-model="selectedDefaultAlarm"
:options="defaultAlarmOptions"
id="default-alarm-partday-select"
v-model="selectedDefaultAlarmPartDay"
:options="defaultAlarmPartDayOptions"
:clearable="false"
:placeholder="$t('calendar', 'Select default reminder')"
class="edit-calendar-modal__default-alarm__select"
@update:modelValue="defaultAlarmChanged = true" />
</div>
<div class="edit-calendar-modal__default-alarm">
<label for="default-alarm-fullday-select" class="edit-calendar-modal__default-alarm__label">
{{ $t('calendar', 'Default reminder for all-day events') }}
</label>
<NcSelect
id="default-alarm-fullday-select"
v-model="selectedDefaultAlarmFullDay"
:options="defaultAlarmFullDayOptions"
:clearable="false"
:placeholder="$t('calendar', 'Select default reminder')"
class="edit-calendar-modal__default-alarm__select"
@update:modelValue="defaultAlarmChanged = true" />
<p class="edit-calendar-modal__default-alarm__hint">
{{ $t('calendar', 'This reminder will be automatically added to all new events created in this calendar') }}
{{ $t('calendar', 'These reminders will be automatically added to new events created in this calendar') }}
</p>
</div>
</template>
Expand Down Expand Up @@ -159,7 +172,8 @@ export default {
isTransparent: false,
calendarName: undefined,
calendarNameChanged: false,
selectedDefaultAlarm: null,
selectedDefaultAlarmPartDay: null,
selectedDefaultAlarmFullDay: null,
defaultAlarmChanged: false,
}
},
Expand Down Expand Up @@ -251,11 +265,11 @@ export default {
},

/**
* Get the default alarm options for the select dropdown
* Get the default alarm options for part-day (timed) events
*
* @return {Array}
*/
defaultAlarmOptions() {
defaultAlarmPartDayOptions() {
const settingsStore = useSettingsStore()
const currentUserTimezone = settingsStore.getResolvedTimezone
const locale = settingsStore.momentLocale
Expand All @@ -267,7 +281,6 @@ export default {
},
]

// Add standard alarm options for timed events
const alarms = getDefaultAlarms(false)
for (const alarm of alarms) {
const alarmObject = this.getAlarmObjectFromTriggerTime(alarm)
Expand All @@ -280,6 +293,35 @@ export default {
return options
},

/**
* Get the default alarm options for full-day (all-day) events
*
* @return {Array}
*/
defaultAlarmFullDayOptions() {
const settingsStore = useSettingsStore()
const currentUserTimezone = settingsStore.getResolvedTimezone
const locale = settingsStore.momentLocale

const options = [
{
label: this.$t('calendar', 'None'),
value: null,
},
]

const alarms = getDefaultAlarms(true)
for (const alarm of alarms) {
const alarmObject = this.getAlarmObjectFromTriggerTime(alarm)
options.push({
label: alarmFormat(alarmObject, true, currentUserTimezone, locale),
value: alarm,
})
}

return options
},

/**
* Whether the default alarm feature is supported (Nextcloud 34+)
*
Expand All @@ -302,13 +344,22 @@ export default {
this.calendarColorChanged = false
this.isTransparent = calendar.transparency === 'transparent'

// Initialize default alarm
if (calendar.defaultAlarm === null) {
this.selectedDefaultAlarm = this.defaultAlarmOptions[0]
// Initialize default alarm for part-day events
if (calendar.defaultAlarmPartDay === null) {
this.selectedDefaultAlarmPartDay = this.defaultAlarmPartDayOptions[0]
} else {
const value = parseInt(calendar.defaultAlarmPartDay)
const option = this.defaultAlarmPartDayOptions.find((opt) => opt.value === value)
this.selectedDefaultAlarmPartDay = option || this.defaultAlarmPartDayOptions[0]
}

// Initialize default alarm for full-day events
if (calendar.defaultAlarmFullDay === null) {
this.selectedDefaultAlarmFullDay = this.defaultAlarmFullDayOptions[0]
} else {
const value = parseInt(calendar.defaultAlarm)
const option = this.defaultAlarmOptions.find((opt) => opt.value === value)
this.selectedDefaultAlarm = option || this.defaultAlarmOptions[0]
const value = parseInt(calendar.defaultAlarmFullDay)
const option = this.defaultAlarmFullDayOptions.find((opt) => opt.value === value)
this.selectedDefaultAlarmFullDay = option || this.defaultAlarmFullDayOptions[0]
}
this.defaultAlarmChanged = false
},
Expand Down Expand Up @@ -377,19 +428,20 @@ export default {
},

/**
* Save the calendar default alarm.
* Save the calendar default alarms.
*/
async saveDefaultAlarm() {
try {
const defaultAlarmValue = this.selectedDefaultAlarm ? this.selectedDefaultAlarm.value : null
await this.calendarsStore.changeCalendarDefaultAlarm({
const pdayValue = this.selectedDefaultAlarmPartDay ? this.selectedDefaultAlarmPartDay.value : null
const fdayValue = this.selectedDefaultAlarmFullDay ? this.selectedDefaultAlarmFullDay.value : null
await this.calendarsStore.changeCalendarDefaultAlarms({
calendar: this.calendar,
defaultAlarm: defaultAlarmValue,
defaultAlarmPartDay: pdayValue,
defaultAlarmFullDay: fdayValue,
})
} catch (error) {
logger.error('Failed to save calendar default alarm', {
logger.error('Failed to save calendar default alarms', {
calendar: this.calendar,
defaultAlarm: this.selectedDefaultAlarm,
})
throw error
}
Expand Down
16 changes: 10 additions & 6 deletions src/models/calendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,10 @@ function getDefaultCalendarObject(props = {}) {
fetchedTimeRanges: [],
// Scheduling transparency
transparency: 'opaque',
// Default alarm/reminder for new events in seconds (null if disabled)
defaultAlarm: null,
// Default alarm/reminder for part-day events in seconds (null if disabled)
defaultAlarmPartDay: null,
// Default alarm/reminder for full-day events in seconds (null if disabled)
defaultAlarmFullDay: null,
...props,
}
}
Expand Down Expand Up @@ -106,9 +108,10 @@ function mapDavCollectionToCalendar(calendar, currentUserPrincipal) {
// then the default value CALDAV:opaque MUST be assumed.
// https://datatracker.ietf.org/doc/html/rfc6638#section-9.1
const transparency = calendar.transparency || 'opaque'
// Default alarm for new events in this calendar (in seconds)
// The value can be null or a number of seconds
const defaultAlarm = isAfterVersion(34) && calendar.defaultAlarm !== undefined ? calendar.defaultAlarm : null
// Default alarm for part-day events in this calendar (in seconds)
const defaultAlarmPartDay = isAfterVersion(34) && calendar.defaultAlarmPartDay !== undefined ? calendar.defaultAlarmPartDay : null
// Default alarm for full-day events in this calendar (in seconds)
const defaultAlarmFullDay = isAfterVersion(34) && calendar.defaultAlarmFullDay !== undefined ? calendar.defaultAlarmFullDay : null

let isSharedWithMe = false
if (!currentUserPrincipal) {
Expand Down Expand Up @@ -167,7 +170,8 @@ function mapDavCollectionToCalendar(calendar, currentUserPrincipal) {
shares,
timezone,
transparency,
defaultAlarm,
defaultAlarmPartDay,
defaultAlarmFullDay,
dav: calendar,
})
}
Expand Down
10 changes: 8 additions & 2 deletions src/store/calendarObjectInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -1422,8 +1422,14 @@ export default defineStore('calendarObjectInstance', {
}

let defaultReminder = null
if (isAfterVersion(34) && calendar && calendar.defaultAlarm !== null) {
defaultReminder = parseInt(calendar.defaultAlarm)
if (isAfterVersion(34) && calendar) {
if (calendarObjectInstance.isAllDay && calendar.defaultAlarmFullDay !== undefined) {
defaultReminder = calendar.defaultAlarmFullDay
} else if (!calendarObjectInstance.isAllDay && calendar.defaultAlarmPartDay !== undefined) {
defaultReminder = calendar.defaultAlarmPartDay
} else {
defaultReminder = parseInt(settingsStore.defaultReminder)
}
} else {
defaultReminder = parseInt(settingsStore.defaultReminder)
}
Expand Down
27 changes: 21 additions & 6 deletions src/store/calendars.js
Original file line number Diff line number Diff line change
Expand Up @@ -588,26 +588,41 @@ export default defineStore('calendars', {
},

/**
* Change a calendar's default alarm
* Change a calendar's default alarms for part-day and full-day events
*
* @param {object} data destructuring object
* @param {object} data.calendar the calendar to modify
* @param {string|null} data.defaultAlarm the new default alarm in seconds (or null to disable)
* @param {number|null} data.defaultAlarmPartDay the new default alarm for part-day events in seconds (or null to disable)
* @param {number|null} data.defaultAlarmFullDay the new default alarm for full-day events in seconds (or null to disable)
* @return {Promise}
*/
async changeCalendarDefaultAlarm({ calendar, defaultAlarm }) {
async changeCalendarDefaultAlarms({ calendar, defaultAlarmPartDay, defaultAlarmFullDay }) {
if (!isAfterVersion(34)) {
return
}

if (calendar.dav.defaultAlarm === defaultAlarm) {
const partDayChanged = calendar.dav.defaultAlarmPartDay !== defaultAlarmPartDay
const fullDayChanged = calendar.dav.defaultAlarmFullDay !== defaultAlarmFullDay

if (!partDayChanged && !fullDayChanged) {
return
}

calendar.dav.defaultAlarm = defaultAlarm
if (partDayChanged) {
calendar.dav.defaultAlarmPartDay = defaultAlarmPartDay
}
if (fullDayChanged) {
calendar.dav.defaultAlarmFullDay = defaultAlarmFullDay
}

await calendar.dav.update()
this.calendarsById[calendar.id].defaultAlarm = defaultAlarm

if (partDayChanged) {
this.calendarsById[calendar.id].defaultAlarmPartDay = defaultAlarmPartDay
}
if (fullDayChanged) {
this.calendarsById[calendar.id].defaultAlarmFullDay = defaultAlarmFullDay
}
},

/**
Expand Down
8 changes: 6 additions & 2 deletions src/utils/alarms.js
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,12 @@ export function updateDefaultAlarm() {
const calendar = calendarsStore.getCalendarById(calendarObjectInstanceStore.calendarObject.calendarId)

let defaultReminder = null
if (isAfterVersion(34) && calendar && calendar.defaultAlarm !== null) {
defaultReminder = calendar.defaultAlarm
if (isAfterVersion(34) && calendar) {
if (calendarObjectInstance.isAllDay && calendar.defaultAlarmFullDay !== undefined) {
defaultReminder = calendar.defaultAlarmFullDay
} else if (!calendarObjectInstance.isAllDay && calendar.defaultAlarmPartDay !== undefined) {
defaultReminder = calendar.defaultAlarmPartDay
}
}

// Find the existing default alarm (if any)
Expand Down
Loading