diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md index 3462fef37..91f91d383 100644 --- a/docs/widgets/services/index.md +++ b/docs/widgets/services/index.md @@ -128,6 +128,7 @@ You can also find a list of all available service widgets in the sidebar navigat - [Uptime Kuma](uptime-kuma.md) - [UptimeRobot](uptimerobot.md) - [UrBackup](urbackup.md) +- [Vikunja](vikunja.md) - [Watchtower](watchtower.md) - [WGEasy](wgeasy.md) - [WhatsUpDocker](whatsupdocker.md) diff --git a/mkdocs.yml b/mkdocs.yml index 1b3afd622..0667e5eaa 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -151,6 +151,7 @@ nav: - widgets/services/uptime-kuma.md - widgets/services/uptimerobot.md - widgets/services/urbackup.md + - widgets/services/vikunja.md - widgets/services/watchtower.md - widgets/services/wgeasy.md - widgets/services/whatsupdocker.md diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 6138d2e90..9df2c321d 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -478,6 +478,9 @@ export function cleanServiceGroups(groups) { // unifi site, + // vikunja + enableTaskList, + // wgeasy threshold, @@ -633,6 +636,9 @@ export function cleanServiceGroups(groups) { if (type === "lubelogger") { if (vehicleID !== undefined) cleanedService.widget.vehicleID = parseInt(vehicleID, 10); } + if (type === "vikunja") { + if (enableTaskList !== undefined) cleanedService.widget.enableTaskList = enableTaskList; + } } return cleanedService; diff --git a/src/widgets/vikunja/component.jsx b/src/widgets/vikunja/component.jsx index 59faa863b..677a915f0 100644 --- a/src/widgets/vikunja/component.jsx +++ b/src/widgets/vikunja/component.jsx @@ -4,6 +4,32 @@ import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; +// return Projects that are not Saved Filters +function getRealProjects(project) { + return project.id > 0; +} + +// return Tasks that have a real due date in 7 days or less +function get7dTasks(task) { + return ( + new Date(task.dueDate).getTime() > new Date("0001-01-01T00:00:00Z").getTime() && + new Date(task.dueDate).getTime() <= new Date(Date.now() + 604800000) + ); +} + +// return Tasks that have a real due date in the past +function getOverdue(task) { + return ( + new Date(task.dueDate).getTime() > new Date("0001-01-01T00:00:00Z").getTime() && + new Date(task.dueDate).getTime() <= new Date(Date.now()) + ); +} + +// return Tasks that are not 100% complete +function getInProgress(task) { + return task.inProgress === true; +} + export default function Component({ service }) { const { t } = useTranslation(); const { widget } = service; @@ -30,14 +56,18 @@ export default function Component({ service }) { ); } - const projects = projectsData.length; + const projects = projectsData.filter(getRealProjects); + const tasks7d = tasksData.filter(get7dTasks); + const overdue = tasksData.filter(getOverdue); + const inProgress = tasksData.filter(getInProgress); return ( + // <> - - - - + + + + ); } diff --git a/src/widgets/vikunja/widget.js b/src/widgets/vikunja/widget.js index 559a31d66..8c1b6ab04 100644 --- a/src/widgets/vikunja/widget.js +++ b/src/widgets/vikunja/widget.js @@ -1,5 +1,5 @@ import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; -import { jsonArrayFilter } from "utils/proxy/api-helpers"; +import { asJson } from "utils/proxy/api-helpers"; const widget = { api: `{url}/api/v1/{endpoint}`, @@ -12,21 +12,14 @@ const widget = { tasks: { endpoint: "tasks/all", params: ["filter", "sort_by"], - map: (data) => ({ - tasks7d: jsonArrayFilter( - data, - (item) => - new Date(item.due_date).valueOf() > 978307168000 && - new Date(item.due_date).valueOf() <= new Date(Date.now() + 640800000).valueOf(), - ).length, - inProgress: jsonArrayFilter(data, (item) => item.percent_done > 0 && item.percent_done < 1).length, - overdue: jsonArrayFilter( - data, - (item) => - new Date(item.due_date).valueOf() > 978307168000 && - new Date(item.due_date).valueOf() <= new Date(Date.now()), - ).length, - }), + map: (data) => + asJson(data).map((task) => ({ + id: task.id, + title: task.title, + priority: task.priority, + dueDate: task.due_date, + inProgress: task.percent_done > 0 && task.percent_done < 1, + })), }, }, };