From 1aec61811fae27a98f1a028801ba493bc1b9c125 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 26 Jan 2026 10:27:36 -0800 Subject: [PATCH] Enhancement: handle Vikunja v1rc4 breaking changes (#6234) --- docs/widgets/services/vikunja.md | 6 ++++++ src/utils/config/service-helpers.js | 1 + src/widgets/vikunja/component.jsx | 6 +++++- src/widgets/vikunja/widget.js | 23 ++++++++++++++--------- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/docs/widgets/services/vikunja.md b/docs/widgets/services/vikunja.md index 94b990557..048a19c05 100644 --- a/docs/widgets/services/vikunja.md +++ b/docs/widgets/services/vikunja.md @@ -9,10 +9,16 @@ Allowed fields: `["projects", "tasks7d", "tasksOverdue", "tasksInProgress"]`. A list of the next 5 tasks ordered by due date is disabled by default, but can be enabled with the `enableTaskList` option. +| Vikunja Version | Homepage Widget Version | +| --------------- | ----------------------- | +| < v1.0.0-rc4 | 1 (default) | +| >= v1.0.0-rc4 | 2 | + ```yaml widget: type: vikunja url: http[s]://vikunja.host.or.ip[:port] key: vikunjaapikey enableTaskList: true # optional, defaults to false + version: 2 # optional, defaults to 1 ``` diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index d358f9d2f..95cdc7538 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -569,6 +569,7 @@ export function cleanServiceGroups(groups) { "wgeasy", "grafana", "gluetun", + "vikunja", ].includes(type) ) { if (version) widget.version = parseInt(version, 10); diff --git a/src/widgets/vikunja/component.jsx b/src/widgets/vikunja/component.jsx index 1afccd38d..9aae02da0 100644 --- a/src/widgets/vikunja/component.jsx +++ b/src/widgets/vikunja/component.jsx @@ -8,11 +8,15 @@ export default function Component({ service }) { const { t } = useTranslation(); const { widget } = service; + const version = widget.version ?? 1; + const { data: projectsData, error: projectsError } = useWidgetAPI(widget, "projects"); - const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "tasks"); + const { data: tasksData, error: tasksError } = useWidgetAPI(widget, version === 2 ? "tasks_v2" : "tasks"); if (projectsError || tasksError) { return ; + } else if (projectsData?.message || tasksData?.message) { + return ; } if (!projectsData || !tasksData) { diff --git a/src/widgets/vikunja/widget.js b/src/widgets/vikunja/widget.js index 8e5e680a7..147e4a141 100644 --- a/src/widgets/vikunja/widget.js +++ b/src/widgets/vikunja/widget.js @@ -1,6 +1,15 @@ import { asJson } from "utils/proxy/api-helpers"; import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; +const map = asJson(data).map((task) => ({ + id: task.id, + title: task.title, + priority: task.priority, + dueDate: task.due_date, + dueDateIsDefault: task.due_date === "0001-01-01T00:00:00Z", + inProgress: task.percent_done > 0 && task.percent_done < 1, +})); + const widget = { api: `{url}/api/v1/{endpoint}`, proxyHandler: credentialedProxyHandler, @@ -11,15 +20,11 @@ const widget = { }, tasks: { endpoint: "tasks/all?filter=done%3Dfalse&sort_by=due_date", - map: (data) => - asJson(data).map((task) => ({ - id: task.id, - title: task.title, - priority: task.priority, - dueDate: task.due_date, - dueDateIsDefault: task.due_date === "0001-01-01T00:00:00Z", - inProgress: task.percent_done > 0 && task.percent_done < 1, - })), + map: map, + }, + tasks_v2: { + endpoint: "tasks?filter=done%3Dfalse&sort_by=due_date", + map: map, }, }, };