add overdue and in progress field blocks

This commit is contained in:
vhsdream 2024-10-05 22:07:48 -04:00
parent 139fba7521
commit 3879621714
4 changed files with 22 additions and 6 deletions

View File

@ -5,12 +5,16 @@ description: Vikunja Widget Configuration
Learn more about [Vikunja](https://vikunja.io). Learn more about [Vikunja](https://vikunja.io).
Allowed fields: `["projects", "tasks"]`. Allowed fields: `["projects", "tasks", "overdue", "inprogress"]`.
"Projects" lists the number of non-archived Projects the user has access to. "Projects" lists the number of non-archived Projects the user has access to.
"Tasks" lists the number of tasks due within the next 7 days. "Tasks" lists the number of tasks due within the next 7 days.
"Overdue" lists the number of all tasks overdue.
"In Progress" lists the number of tasks with a progress percentage above 0% and below 100%.
```yaml ```yaml
widget: widget:
type: vikunja type: vikunja

View File

@ -956,6 +956,8 @@
}, },
"vikunja": { "vikunja": {
"projects": "Total Active Projects", "projects": "Total Active Projects",
"tasks": "Tasks Due This Week" "tasks": "Tasks Due This Week",
"overdue": "Overdue Tasks",
"inprogress": "Tasks In Progress"
} }
} }

View File

@ -13,17 +13,25 @@ export default function Component({ service }) {
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "tasks", { const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "tasks", {
filter: "done=false&&due_date<=now+7d", filter: "done=false&&due_date<=now+7d",
}); });
const { data: overdueData, error: overdueError } = useWidgetAPI(widget, "tasks", {
filter: "done=false&&due_date<=now",
});
const { data: inProgressData, error: inProgressError } = useWidgetAPI(widget, "tasks", {
filter: "done=false&&percent_done>0&&percent_done<100",
});
if (projectsError || tasksError) { if (projectsError || tasksError || overdueError || inProgressError) {
const vikunjaError = projectsError ?? tasksError; const vikunjaError = projectsError ?? tasksError ?? overdueError ?? inProgressError;
return <Container service={service} error={vikunjaError} />; return <Container service={service} error={vikunjaError} />;
} }
if (!projectsData || !tasksData) { if (!projectsData || !tasksData || !overdueData || !inProgressData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="vikunja.projects" /> <Block label="vikunja.projects" />
<Block label="vikunja.tasks" /> <Block label="vikunja.tasks" />
<Block label="vikunja.overdue" />
<Block label="vikunja.inprogress" />
</Container> </Container>
); );
} }
@ -32,6 +40,8 @@ export default function Component({ service }) {
<Container service={service}> <Container service={service}>
<Block label="vikunja.projects" value={t("common.number", { value: projectsData.projects })} /> <Block label="vikunja.projects" value={t("common.number", { value: projectsData.projects })} />
<Block label="vikunja.tasks" value={t("common.number", { value: tasksData.tasks })} /> <Block label="vikunja.tasks" value={t("common.number", { value: tasksData.tasks })} />
<Block label="vikunja.overdue" value={t("common.number", { value: overdueData.tasks })} />
<Block label="vikunja.inprogress" value={t("common.number", { value: inProgressData.tasks })} />
</Container> </Container>
); );
} }

View File

@ -14,7 +14,7 @@ const widget = {
}, },
tasks: { tasks: {
endpoint: "tasks/all", endpoint: "tasks/all",
// to filter by done=false and dueDate <= now+7d or whatever // TODO: use filter (and other params?) to allow customizing fields/blocks
params: ["filter"], params: ["filter"],
map: (data) => ({ map: (data) => ({
tasks: jsonArrayFilter(data, (item) => !item.done).length, tasks: jsonArrayFilter(data, (item) => !item.done).length,