Skip to content
Merged
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
4 changes: 4 additions & 0 deletions css/app-full.scss
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@
.app-full &__front, &__edit {
margin-inline-start: calc(var(--default-grid-baseline) * 9);
}

&__label--default {
color: var(--color-text-maxcontrast);
}
}

.property-add-talk {
Expand Down
6 changes: 5 additions & 1 deletion src/components/Editor/Alarm/AlarmList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ export default {
...mapStores(useCalendarObjectInstanceStore),
...mapState(useSettingsStore, ['forceEventAlarmType']),
alarms() {
return this.calendarObjectInstance.alarms
return this.calendarObjectInstance.alarms.slice().sort((a, b) => {
const aIsDefault = a.alarmComponent.getFirstPropertyFirstValue('X-NC-DEFAULT-ALARM') ? 1 : 0
const bIsDefault = b.alarmComponent.getFirstPropertyFirstValue('X-NC-DEFAULT-ALARM') ? 1 : 0
return bIsDefault - aIsDefault
})
},
},

Expand Down
8 changes: 6 additions & 2 deletions src/components/Editor/Alarm/AlarmListItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

<template>
<!-- Yes, technically an alarm is a component, not a property, but for the matter of CSS names it really doesn't matter -->
<div class="property-alarm-item">
<div class="property-alarm-item" :title="isDefault ? $t('calendar', 'Default reminder of calendar') : ''">
<div v-if="!isEditing" class="property-alarm-item__front">
<div class="property-alarm-item__label">
<div class="property-alarm-item__label" :class="{ 'property-alarm-item__label--default': isDefault }">
{{ formatAlarm(alarm, isAllDay, currentUserTimezone, locale) }}
</div>
</div>
Expand Down Expand Up @@ -327,6 +327,10 @@ export default {
return moment.localeData().longDateFormat('LT')
},

isDefault() {
return this.alarm.alarmComponent.getFirstPropertyFirstValue('X-NC-DEFAULT-ALARM')
},

absoluteDateFormat() {
return [
'[',
Expand Down
3 changes: 3 additions & 0 deletions src/mixins/EditorMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import useCalendarsStore from '../store/calendars.js'
import usePrincipalsStore from '../store/principals.js'
import useSettingsStore from '../store/settings.js'
import useWidgetStore from '../store/widget.js'
import { updateDefaultAlarm } from '../utils/alarms.js'
import { removeMailtoPrefix } from '../utils/attendee.js'
import { uidToHexColor } from '../utils/color.js'
import { dateFactory } from '../utils/date.js'
Expand Down Expand Up @@ -491,6 +492,8 @@ export default {
if (this.calendarObject && !this.calendarObject.existsOnServer) {
this.calendarObject.calendarId = selectedCalendar.id
}

updateDefaultAlarm()
},
/**
* This will force the user to update this and all future occurrences when saving
Expand Down
14 changes: 12 additions & 2 deletions src/store/calendarObjectInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -1139,13 +1139,18 @@ export default defineStore('calendarObjectInstance', {
calendarObjectInstance,
type,
totalSeconds,
isDefault = false,
}) {
if (calendarObjectInstance.eventComponent) {
const eventComponent = calendarObjectInstance.eventComponent

const duration = DurationValue.fromSeconds(totalSeconds)
const alarmComponent = eventComponent.addRelativeAlarm(type, duration)

if (isDefault) {
alarmComponent.addProperty(new Property('X-NC-DEFAULT-ALARM', isDefault))
}

const alarmObject = mapAlarmComponentToAlarmObject(alarmComponent)

calendarObjectInstance.alarms.push(alarmObject)
Expand Down Expand Up @@ -1404,11 +1409,15 @@ export default defineStore('calendarObjectInstance', {
defaultReminder = parseInt(settingsStore.defaultReminder)
}

if (!isNaN(defaultReminder)) {
if (
!isNaN(defaultReminder)
&& !calendarObjectInstance.alarms.some((alarm) => alarm.alarmComponent.getFirstPropertyFirstValue('X-NC-DEFAULT-ALARM'))
) {
this.addAlarmToCalendarObjectInstance({
calendarObjectInstance,
type: 'DISPLAY',
totalSeconds: defaultReminder,
isDefault: true,
})
logger.debug(`Added defaultReminder (${defaultReminder}s) to newly created event`)
}
Expand Down Expand Up @@ -1880,8 +1889,8 @@ export default defineStore('calendarObjectInstance', {
/**
*
* @param {object} data The destructuring object for data
* @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
*/
enableRecurrenceLimitByUntil({
calendarObjectInstance,
Expand Down Expand Up @@ -1939,6 +1948,7 @@ export default defineStore('calendarObjectInstance', {
*
* @param {object} data The destructuring object for data
* @param {object} data.recurrenceRule The recurrenceRule object to modify
* @param {number} data.count The new count to set
*/
enableRecurrenceLimitByCount({ recurrenceRule }) {
this.changeRecurrenceToInfinite({
Expand Down
33 changes: 33 additions & 0 deletions src/utils/alarms.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

import { AttendeeProperty, Property } from '@nextcloud/calendar-js'
import { translate as t } from '@nextcloud/l10n'
import useCalendarObjectInstanceStore from '../store/calendarObjectInstance.js'
import useCalendarsStore from '../store/calendars.js'
import { isAfterVersion } from './nextcloudVersion.ts'

/**
* Get the factor for a given unit
Expand Down Expand Up @@ -199,6 +202,36 @@ export function getTotalSecondsFromAmountHourMinutesAndUnitForAllDayEvents(amoun
return amount
}

export function updateDefaultAlarm() {
const calendarObjectInstanceStore = useCalendarObjectInstanceStore()
const calendarObjectInstance = calendarObjectInstanceStore.calendarObjectInstance
const calendarsStore = useCalendarsStore()
const calendar = calendarsStore.getCalendarById(calendarObjectInstanceStore.calendarObject.calendarId)

let defaultReminder = null
if (isAfterVersion(34) && calendar && calendar.defaultAlarm !== null) {
defaultReminder = calendar.defaultAlarm
}

// Find the existing default alarm (if any)
const existingDefaultAlarm = calendarObjectInstance.alarms.find((alarm) => alarm.alarmComponent.getFirstPropertyFirstValue('X-NC-DEFAULT-ALARM'))
// Only update the default alarm if one already exists.
// If the user has manually removed the default alarm, don't re-add it.
if (!isNaN(defaultReminder) && existingDefaultAlarm) {
calendarObjectInstanceStore.removeAlarmFromCalendarObjectInstance({
calendarObjectInstance,
alarm: existingDefaultAlarm,
})

calendarObjectInstanceStore.addAlarmToCalendarObjectInstance({
calendarObjectInstance,
type: 'DISPLAY',
totalSeconds: defaultReminder,
isDefault: true,
})
}
}

/**
* Propagate data from an event component to all EMAIL alarm components.
* An alarm component must contain a description, summary and all attendees to be notified.
Expand Down
Loading