From 5ef79edc1aac1f675d613255a02741da4d836f81 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:20:28 +0100 Subject: [PATCH] feat: add boards management page (#55) --- .gitignore | 1 + .../_components/create-board-button.tsx | 28 +++++++++++++ .../_components/delete-board-button.tsx | 34 ++++++++++++++++ .../src/app/[locale]/manage/boards/page.tsx | 38 ++++++++++++++++++ packages/api/src/router/board.ts | 39 ++++++++++++++++++- packages/db/schema/sqlite.ts | 2 +- packages/translation/src/lang/en.ts | 9 +++++ packages/validation/src/board.ts | 3 ++ 8 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx create mode 100644 apps/nextjs/src/app/[locale]/manage/boards/_components/delete-board-button.tsx create mode 100644 apps/nextjs/src/app/[locale]/manage/boards/page.tsx diff --git a/.gitignore b/.gitignore index a9669defa..43091d08b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules .pnp .pnp.js +.idea/ # testing coverage diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx new file mode 100644 index 000000000..339ae07d8 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx @@ -0,0 +1,28 @@ +"use client"; + +import React from "react"; + +import { clientApi } from "@homarr/api/client"; +import { useI18n } from "@homarr/translation/client"; +import { Button } from "@homarr/ui"; + +import { revalidatePathAction } from "~/app/revalidatePathAction"; + +export const CreateBoardButton = () => { + const t = useI18n(); + const { mutateAsync, isPending } = clientApi.board.create.useMutation({ + onSettled: async () => { + await revalidatePathAction("/manage/boards"); + }, + }); + + const onClick = React.useCallback(async () => { + await mutateAsync({ name: "default" }); + }, [mutateAsync]); + + return ( + + ); +}; diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/delete-board-button.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/delete-board-button.tsx new file mode 100644 index 000000000..4d49ed17a --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/delete-board-button.tsx @@ -0,0 +1,34 @@ +"use client"; + +import React from "react"; + +import { clientApi } from "@homarr/api/client"; +import { useI18n } from "@homarr/translation/client"; +import { Button } from "@homarr/ui"; + +import { revalidatePathAction } from "~/app/revalidatePathAction"; + +interface Props { + id: string; +} + +export const DeleteBoardButton = ({ id }: Props) => { + const t = useI18n(); + const { mutateAsync, isPending } = clientApi.board.delete.useMutation({ + onSettled: async () => { + await revalidatePathAction("/manage/boards"); + }, + }); + + const onClick = React.useCallback(async () => { + await mutateAsync({ + id, + }); + }, [id, mutateAsync]); + + return ( + + ); +}; diff --git a/apps/nextjs/src/app/[locale]/manage/boards/page.tsx b/apps/nextjs/src/app/[locale]/manage/boards/page.tsx new file mode 100644 index 000000000..a5baaa881 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/boards/page.tsx @@ -0,0 +1,38 @@ +import React from "react"; + +import { getScopedI18n } from "@homarr/translation/server"; +import { Card, Grid, GridCol, Text, Title } from "@homarr/ui"; + +import { api } from "~/trpc/server"; +import { CreateBoardButton } from "./_components/create-board-button"; +import { DeleteBoardButton } from "./_components/delete-board-button"; + +export default async function ManageBoardsPage() { + const t = await getScopedI18n("management.page.board"); + + const boards = await api.board.getAll.query(); + + return ( + <> +