diff --git a/pkg/caldav/caldav.go b/pkg/caldav/caldav.go index 30999753808..0f53f5c1cc9 100644 --- a/pkg/caldav/caldav.go +++ b/pkg/caldav/caldav.go @@ -204,13 +204,10 @@ func ParseAlarms(alarms []Alarm, taskDescription string) (caldavalarms string) { caldavalarms += ` BEGIN:VALARM` switch a.RelativeTo { - case models.ReminderRelationDueDate: - caldavalarms += ` -TRIGGER:` + makeCalDavDuration(a.Duration) case models.ReminderRelationStartDate: caldavalarms += ` TRIGGER;RELATED=START:` + makeCalDavDuration(a.Duration) - case models.ReminderRelationEndDate: + case models.ReminderRelationEndDate, models.ReminderRelationDueDate: caldavalarms += ` TRIGGER;RELATED=END:` + makeCalDavDuration(a.Duration) default: diff --git a/pkg/caldav/caldav_test.go b/pkg/caldav/caldav_test.go index efaccd3596d..e1de0d9ca61 100644 --- a/pkg/caldav/caldav_test.go +++ b/pkg/caldav/caldav_test.go @@ -311,7 +311,7 @@ ACTION:DISPLAY DESCRIPTION:alarm description END:VALARM BEGIN:VALARM -TRIGGER:-PT2H0M0S +TRIGGER;RELATED=END:-PT2H0M0S ACTION:DISPLAY DESCRIPTION:Todo #1 END:VALARM diff --git a/pkg/caldav/parsing.go b/pkg/caldav/parsing.go index 004d50cbb9c..9b635d8c316 100644 --- a/pkg/caldav/parsing.go +++ b/pkg/caldav/parsing.go @@ -141,53 +141,56 @@ func ParseTaskFromVTODO(content string) (vTask *models.Task, err error) { vTask.EndDate = vTask.StartDate.Add(duration) } - reminders := make([]*models.TaskReminder, 0) for _, vAlarm := range vTodo.SubComponents() { if vAlarm, ok := vAlarm.(*ics.VAlarm); ok { - reminders = parseVAlarm(vAlarm, reminders) + vTask = parseVAlarm(vAlarm, vTask) } } - if len(reminders) > 0 { - vTask.Reminders = reminders - } return } -func parseVAlarm(vAlarm *ics.VAlarm, reminders []*models.TaskReminder) []*models.TaskReminder { +func parseVAlarm(vAlarm *ics.VAlarm, vTask *models.Task) *models.Task { for _, property := range vAlarm.UnknownPropertiesIANAProperties() { if property.IANAToken == "TRIGGER" { - switch { - case len(property.ICalParameters["VALUE"]) > 0: - if property.ICalParameters["VALUE"][0] == "DATE-TIME" { - // Example: TRIGGER;VALUE=DATE-TIME:20181201T011210Z - reminders = append(reminders, &models.TaskReminder{ - Reminder: caldavTimeToTimestamp(property.Value)}) - } - case len(property.ICalParameters["RELATED"]) > 0: - duration := utils.ParseISO8601Duration(property.Value) - switch property.ICalParameters["RELATED"][0] { - case "START": + if contains(property.ICalParameters["VALUE"], "DATE-TIME") { + // Example: TRIGGER;VALUE=DATE-TIME:20181201T011210Z + vTask.Reminders = append(vTask.Reminders, &models.TaskReminder{ + Reminder: caldavTimeToTimestamp(property.Value)}) + } else { + if contains(property.ICalParameters["RELATED"], "END") { + // Example: TRIGGER;RELATED=END:-P2D + duration := utils.ParseISO8601Duration(property.Value) + if vTask.EndDate.IsZero() { + vTask.Reminders = append(vTask.Reminders, &models.TaskReminder{ + RelativePeriod: int64(duration.Seconds()), + RelativeTo: models.ReminderRelationDueDate}) + } else { + vTask.Reminders = append(vTask.Reminders, &models.TaskReminder{ + RelativePeriod: int64(duration.Seconds()), + RelativeTo: models.ReminderRelationEndDate}) + } + } else { // Example: TRIGGER;RELATED=START:-P2D - reminders = append(reminders, &models.TaskReminder{ + // Example: TRIGGER:-PT60M + duration := utils.ParseISO8601Duration(property.Value) + vTask.Reminders = append(vTask.Reminders, &models.TaskReminder{ RelativePeriod: int64(duration.Seconds()), RelativeTo: models.ReminderRelationStartDate}) - case "END": - // Example: TRIGGER;RELATED=END:-P2D - reminders = append(reminders, &models.TaskReminder{ - RelativePeriod: int64(duration.Seconds()), - RelativeTo: models.ReminderRelationEndDate}) } - default: - duration := utils.ParseISO8601Duration(property.Value) - // Example: TRIGGER:-PT60M - reminders = append(reminders, &models.TaskReminder{ - RelativePeriod: int64(duration.Seconds()), - RelativeTo: models.ReminderRelationDueDate}) } } } - return reminders + return vTask +} + +func contains(array []string, str string) bool { + for _, value := range array { + if value == str { + return true + } + } + return false } // https://tools.ietf.org/html/rfc5545#section-3.3.5 diff --git a/pkg/caldav/parsing_test.go b/pkg/caldav/parsing_test.go index 31709a7ccff..b513fd0b31e 100644 --- a/pkg/caldav/parsing_test.go +++ b/pkg/caldav/parsing_test.go @@ -170,7 +170,11 @@ TRIGGER:PT0S ACTION:DISPLAY END:VALARM BEGIN:VALARM -TRIGGER:-PT60M +TRIGGER;VALUE=DURATION:-PT60M +ACTION:DISPLAY +END:VALARM +BEGIN:VALARM +TRIGGER:-PT61M ACTION:DISPLAY END:VALARM BEGIN:VALARM @@ -192,19 +196,23 @@ END:VCALENDAR`, DueDate: time.Date(2023, 3, 4, 15, 0, 0, 0, config.GetTimeZone()), Reminders: []*models.TaskReminder{ { - RelativeTo: models.ReminderRelationDueDate, + RelativeTo: models.ReminderRelationStartDate, RelativePeriod: 0, }, { - RelativeTo: models.ReminderRelationDueDate, + RelativeTo: models.ReminderRelationStartDate, RelativePeriod: -3600, }, + { + RelativeTo: models.ReminderRelationStartDate, + RelativePeriod: -3660, + }, { RelativeTo: models.ReminderRelationStartDate, RelativePeriod: -86400, }, { - RelativeTo: models.ReminderRelationEndDate, + RelativeTo: models.ReminderRelationDueDate, RelativePeriod: -1800, }, }, @@ -309,7 +317,7 @@ ACTION:DISPLAY DESCRIPTION:Task 1 END:VALARM BEGIN:VALARM -TRIGGER:-PT1H0M0S +TRIGGER;RELATED=END:-PT1H0M0S ACTION:DISPLAY DESCRIPTION:Task 1 END:VALARM