[PR #2032] feat(repeat): migrate from legacy repeat fields to RFC 5545 RRULE #5424

Open
opened 2026-04-16 13:37:49 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/go-vikunja/vikunja/pull/2032
Author: @IAMSamuelRodda
Created: 12/29/2025
Status: 🔄 Open

Base: mainHead: feat/rrule-upstream-pr


📝 Commits (10+)

  • 0d22817 feat(repeat): add months/years intervals with fixed day selection
  • e263828 feat(repeat): migrate from legacy repeat fields to RFC 5545 RRULE
  • f8bb9df fix(i18n): add missing repeat interval translation keys
  • 2d15e8c fix(repeat): set due date for repeating tasks without existing due date
  • 9207b99 fix(caldav): parse RRULE from incoming CalDAV data
  • d9dcde1 docs(api): remove repeat_after from sortable fields
  • 1688a8e test: update webtests for RRULE recurrence format
  • 39d767b feat(migration): add RRULE recurrence import for Todoist
  • 733fe8c feat(migration): add RRULE recurrence import for TickTick
  • 6342fbe fix(ci): resolve lint and test failures

📊 Changes

43 files changed (+1778 additions, -745 deletions)

View changed files

📝 frontend/src/components/tasks/partials/KanbanCard.vue (+3 -3)
📝 frontend/src/components/tasks/partials/RepeatAfter.vue (+121 -53)
📝 frontend/src/components/tasks/partials/SingleTaskInProject.vue (+13 -5)
📝 frontend/src/components/tasks/partials/SingleTaskInlineReadonly.vue (+2 -1)
frontend/src/helpers/rrule.ts (+123 -0)
📝 frontend/src/helpers/time/period.ts (+22 -1)
📝 frontend/src/i18n/lang/en.json (+12 -0)
frontend/src/modelSchema/common/repeats.ts (+0 -40)
📝 frontend/src/modelTypes/ITask.ts (+21 -5)
📝 frontend/src/models/task.ts (+2 -22)
📝 frontend/src/modules/parseTaskText.test.ts (+43 -45)
📝 frontend/src/modules/parseTaskText.ts (+23 -25)
📝 frontend/src/services/task.ts (+0 -18)
📝 frontend/src/stores/tasks.ts (+2 -6)
frontend/src/types/IRepeatAfter.ts (+0 -16)
frontend/src/types/IRepeatMode.ts (+0 -7)
📝 frontend/src/views/tasks/TaskDetailView.vue (+37 -5)
📝 go.mod (+1 -0)
📝 go.sum (+2 -0)
📝 pkg/caldav/caldav.go (+6 -34)

...and 23 more files

📄 Description

Closes #1369

This PR migrates Vikunja's recurrence system from the legacy repeat_after/repeat_mode/repeat_day fields to RFC 5545 compliant RRULE strings, as suggested by @kolaente.

Changes

Backend

  • Uses teambition/rrule-go library for RRULE parsing
  • Database migration (20251229100000) converts legacy repeat data to RRULE format and drops old columns
  • CalDAV: Full roundtrip support - RRULE from incoming VTODO is preserved
  • Todoist and TickTick migrations now import recurrence patterns as RRULE

Frontend

  • New rrule.ts helper for parsing/formatting RRULE strings
  • Updated RepeatAfter.vue component with new UI
  • Quick buttons: Every Day, Week, 30 Days, Month, Quarter, 6 Months, Year
  • i18n strings for new UI elements

RRULE Format

Recurrence is now stored as RFC 5545 RRULE strings:

  • FREQ=DAILY;INTERVAL=1 - Every day
  • FREQ=WEEKLY;INTERVAL=1 - Every week
  • FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=15 - Monthly on the 15th
  • FREQ=YEARLY;INTERVAL=1 - Yearly (calendar-aware)

This format supports flexible patterns like BYDAY for weekly recurrence and BYMONTHDAY for monthly, providing the foundation for more complex patterns (like "first Tuesday of every other month") in future iterations.


Reopened from #2029 to use a dedicated branch and avoid polluting the PR with unrelated fork commits.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/go-vikunja/vikunja/pull/2032 **Author:** [@IAMSamuelRodda](https://github.com/IAMSamuelRodda) **Created:** 12/29/2025 **Status:** 🔄 Open **Base:** `main` ← **Head:** `feat/rrule-upstream-pr` --- ### 📝 Commits (10+) - [`0d22817`](https://github.com/go-vikunja/vikunja/commit/0d22817791819d61e16dafdc3a0af6e9c32efa09) feat(repeat): add months/years intervals with fixed day selection - [`e263828`](https://github.com/go-vikunja/vikunja/commit/e263828596fcb134276a1f3499b5c778e1f8f3f4) feat(repeat): migrate from legacy repeat fields to RFC 5545 RRULE - [`f8bb9df`](https://github.com/go-vikunja/vikunja/commit/f8bb9df78ed6bfa5af27fadf1ebc73f1c30a588f) fix(i18n): add missing repeat interval translation keys - [`2d15e8c`](https://github.com/go-vikunja/vikunja/commit/2d15e8c91729c6e02fe6da69c19f675424a4b2b6) fix(repeat): set due date for repeating tasks without existing due date - [`9207b99`](https://github.com/go-vikunja/vikunja/commit/9207b99d238b68da04367f4699cc04dc40a18a42) fix(caldav): parse RRULE from incoming CalDAV data - [`d9dcde1`](https://github.com/go-vikunja/vikunja/commit/d9dcde18076a5becc392497c5fc8eee63e36a49c) docs(api): remove repeat_after from sortable fields - [`1688a8e`](https://github.com/go-vikunja/vikunja/commit/1688a8e38bb1d3de769aa63818c66c0956d40689) test: update webtests for RRULE recurrence format - [`39d767b`](https://github.com/go-vikunja/vikunja/commit/39d767bf484135798d78f538a2c45997c9a223dc) feat(migration): add RRULE recurrence import for Todoist - [`733fe8c`](https://github.com/go-vikunja/vikunja/commit/733fe8cfa363804007ed6bb5664c4728c31bdf00) feat(migration): add RRULE recurrence import for TickTick - [`6342fbe`](https://github.com/go-vikunja/vikunja/commit/6342fbea1a2bab015593eaa181fa670593b57766) fix(ci): resolve lint and test failures ### 📊 Changes **43 files changed** (+1778 additions, -745 deletions) <details> <summary>View changed files</summary> 📝 `frontend/src/components/tasks/partials/KanbanCard.vue` (+3 -3) 📝 `frontend/src/components/tasks/partials/RepeatAfter.vue` (+121 -53) 📝 `frontend/src/components/tasks/partials/SingleTaskInProject.vue` (+13 -5) 📝 `frontend/src/components/tasks/partials/SingleTaskInlineReadonly.vue` (+2 -1) ➕ `frontend/src/helpers/rrule.ts` (+123 -0) 📝 `frontend/src/helpers/time/period.ts` (+22 -1) 📝 `frontend/src/i18n/lang/en.json` (+12 -0) ➖ `frontend/src/modelSchema/common/repeats.ts` (+0 -40) 📝 `frontend/src/modelTypes/ITask.ts` (+21 -5) 📝 `frontend/src/models/task.ts` (+2 -22) 📝 `frontend/src/modules/parseTaskText.test.ts` (+43 -45) 📝 `frontend/src/modules/parseTaskText.ts` (+23 -25) 📝 `frontend/src/services/task.ts` (+0 -18) 📝 `frontend/src/stores/tasks.ts` (+2 -6) ➖ `frontend/src/types/IRepeatAfter.ts` (+0 -16) ➖ `frontend/src/types/IRepeatMode.ts` (+0 -7) 📝 `frontend/src/views/tasks/TaskDetailView.vue` (+37 -5) 📝 `go.mod` (+1 -0) 📝 `go.sum` (+2 -0) 📝 `pkg/caldav/caldav.go` (+6 -34) _...and 23 more files_ </details> ### 📄 Description Closes #1369 This PR migrates Vikunja's recurrence system from the legacy `repeat_after`/`repeat_mode`/`repeat_day` fields to RFC 5545 compliant RRULE strings, as suggested by @kolaente. ## Changes ### Backend - Uses `teambition/rrule-go` library for RRULE parsing - Database migration (`20251229100000`) converts legacy repeat data to RRULE format and drops old columns - CalDAV: Full roundtrip support - RRULE from incoming VTODO is preserved - Todoist and TickTick migrations now import recurrence patterns as RRULE ### Frontend - New `rrule.ts` helper for parsing/formatting RRULE strings - Updated `RepeatAfter.vue` component with new UI - Quick buttons: Every Day, Week, 30 Days, Month, Quarter, 6 Months, Year - i18n strings for new UI elements ## RRULE Format Recurrence is now stored as RFC 5545 RRULE strings: - `FREQ=DAILY;INTERVAL=1` - Every day - `FREQ=WEEKLY;INTERVAL=1` - Every week - `FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=15` - Monthly on the 15th - `FREQ=YEARLY;INTERVAL=1` - Yearly (calendar-aware) This format supports flexible patterns like BYDAY for weekly recurrence and BYMONTHDAY for monthly, providing the foundation for more complex patterns (like "first Tuesday of every other month") in future iterations. --- *Reopened from #2029 to use a dedicated branch and avoid polluting the PR with unrelated fork commits.* --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-16 13:37:49 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/vikunja#5424