Refactor widget and component, create simple functions to filter tasks data, add flag to enable Task List (WIP)

This commit is contained in:
vhsdream
2024-10-11 17:15:15 -04:00
parent 197b4a2f61
commit 379d556916
5 changed files with 52 additions and 21 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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;

View File

@@ -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 (
// <>
<Container service={service}>
<Block label="vikunja.projects" value={t("common.number", { value: projects })} />
<Block label="vikunja.tasks7d" value={t("common.number", { value: tasksData.tasks7d })} />
<Block label="vikunja.tasksOverdue" value={t("common.number", { value: tasksData.overdue })} />
<Block label="vikunja.tasksInProgress" value={t("common.number", { value: tasksData.inProgress })} />
<Block label="vikunja.projects" value={t("common.number", { value: projects.length })} />
<Block label="vikunja.tasks7d" value={t("common.number", { value: tasks7d.length })} />
<Block label="vikunja.tasksOverdue" value={t("common.number", { value: overdue.length })} />
<Block label="vikunja.tasksInProgress" value={t("common.number", { value: inProgress.length })} />
</Container>
);
}

View File

@@ -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,
})),
},
},
};