diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx
index f4d8c13e..c89047c9 100644
--- a/src/components/services/widget/container.jsx
+++ b/src/components/services/widget/container.jsx
@@ -33,5 +33,5 @@ export default function Container({ error = false, children, service }) {
}));
}
- return
{visibleChildren}
;
+ return {visibleChildren.slice(0, 4)}
;
}
diff --git a/src/components/tasklist/group.jsx b/src/components/tasklist/group.jsx
new file mode 100644
index 00000000..3f56b85c
--- /dev/null
+++ b/src/components/tasklist/group.jsx
@@ -0,0 +1,13 @@
+import ErrorBoundary from "components/errorboundry";
+import List from "components/tasklist/list";
+
+export default function TaskListGroup({ group }) {
+ return (
+
+
{group.name}
+
+
+
+
+ );
+}
diff --git a/src/components/tasklist/item.jsx b/src/components/tasklist/item.jsx
new file mode 100644
index 00000000..bf748af6
--- /dev/null
+++ b/src/components/tasklist/item.jsx
@@ -0,0 +1,14 @@
+export default function Item({ task }) {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/tasklist/list.jsx b/src/components/tasklist/list.jsx
new file mode 100644
index 00000000..e5eb97f4
--- /dev/null
+++ b/src/components/tasklist/list.jsx
@@ -0,0 +1,11 @@
+import Item from "components/tasklist/item";
+
+export default function List({ tasklist }) {
+ return (
+
+ {tasklist.map((task) => (
+
+ ))}
+
+ );
+}
diff --git a/src/pages/api/tasklist.js b/src/pages/api/tasklist.js
new file mode 100644
index 00000000..8237e3f4
--- /dev/null
+++ b/src/pages/api/tasklist.js
@@ -0,0 +1,5 @@
+import { tasklistResponse } from "utils/config/api-response";
+
+export default async function handler(req, res) {
+ res.send(await tasklistResponse());
+}
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 025ace6d..13ccbd28 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -10,6 +10,7 @@ import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import ServicesGroup from "components/services/group";
import BookmarksGroup from "components/bookmarks/group";
+import TasklistGroup from "components/tasklist/group";
import Widget from "components/widgets/widget";
import Revalidate from "components/toggles/revalidate";
import createLogger from "utils/logger";
@@ -174,6 +175,7 @@ function Home({ initialSettings }) {
const { data: services } = useSWR("/api/services");
const { data: bookmarks } = useSWR("/api/bookmarks");
+ const { data: tasklist } = useSWR("/api/tasklist");
const { data: widgets } = useSWR("/api/widgets");
const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()]
@@ -294,6 +296,14 @@ function Home({ initialSettings }) {
)}
+ {tasklist?.length > 0 && (
+
+ {tasklist.map((group) => (
+
+ ))}
+
+ )}
+
{bookmarks?.length > 0 && (
{bookmarks.map((group) => (
diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js
index fad3022d..c9689b5d 100644
--- a/src/utils/config/api-response.js
+++ b/src/utils/config/api-response.js
@@ -46,6 +46,29 @@ export async function bookmarksResponse() {
return bookmarksArray;
}
+export async function tasklistResponse() {
+ checkAndCopyConfig("tasklist.yaml");
+
+ const tasklistYaml = path.join(process.cwd(), "config", "tasklist.yaml");
+ const rawFileContents = await fs.readFile(tasklistYaml, "utf8");
+ const fileContents = substituteEnvironmentVars(rawFileContents);
+ const tasklist = yaml.load(fileContents);
+
+ if (!tasklist) return [];
+
+ // map easy to write YAML objects into easy to consume JS arrays
+ const tasklistArray = tasklist.map((group) => ({
+ name: Object.keys(group)[0],
+ tasklist: group[Object.keys(group)[0]].map((entries) => ({
+ // id: Object.values(entries)[0].replaceAll(" ", "_"),
+ title: Object.values(entries)[0],
+ checked: Object.values(entries)[1],
+ })),
+ }));
+
+ return tasklistArray;
+}
+
export async function widgetsResponse() {
let configuredWidgets;