From 5a563b387530c08eb1af66f165296cdc22138d91 Mon Sep 17 00:00:00 2001 From: ajnart Date: Mon, 13 Nov 2023 20:28:31 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Improve=20boards=20page,=20show=20i?= =?UTF-8?q?f=20Public/Restricted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/en/common.json | 10 +- src/pages/board/index.tsx | 1 - src/pages/manage/boards/index.tsx | 298 +++++++++++++++--------------- src/server/api/routers/board.ts | 1 + src/tools/server/loginBuilder.ts | 6 +- 5 files changed, 159 insertions(+), 157 deletions(-) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 31f4af7b1..18cc8e650 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -44,12 +44,14 @@ }, "seeMore": "See more...", "position": { - "left": "Left", - "center": "Center", - "right": "Right" + "left": "Left", + "center": "Center", + "right": "Right" }, "attributes": { "width": "Width", "height": "Height" - } + }, + "public": "Public", + "restricted": "Restricted" } \ No newline at end of file diff --git a/src/pages/board/index.tsx b/src/pages/board/index.tsx index 94c8d2e4e..9822d125b 100644 --- a/src/pages/board/index.tsx +++ b/src/pages/board/index.tsx @@ -25,7 +25,6 @@ export default function BoardPage({ type BoardGetServerSideProps = { config: ConfigType; - dockerEnabled: boolean; _nextI18Next?: SSRConfig['_nextI18Next']; }; diff --git a/src/pages/manage/boards/index.tsx b/src/pages/manage/boards/index.tsx index 75b17d045..822bfeef1 100644 --- a/src/pages/manage/boards/index.tsx +++ b/src/pages/manage/boards/index.tsx @@ -18,34 +18,35 @@ import { IconDeviceFloppy, IconDotsVertical, IconFolderFilled, + IconLock, + IconLockOff, IconPlus, IconStack, IconStarFilled, IconTrash, } from '@tabler/icons-react'; -import { createServerSideHelpers } from '@trpc/react-query/server'; -import { GetServerSideProps } from 'next'; -import { useSession } from 'next-auth/react'; +import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next'; import { useTranslation } from 'next-i18next'; import Head from 'next/head'; import Link from 'next/link'; -import superjson from 'superjson'; import { openCreateBoardModal } from '~/components/Manage/Board/create-board.modal'; import { openDeleteBoardModal } from '~/components/Manage/Board/delete-board.modal'; import { ManageLayout } from '~/components/layout/Templates/ManageLayout'; import { boardRouter } from '~/server/api/routers/board'; import { getServerAuthSession } from '~/server/auth'; -import { prisma } from '~/server/db'; import { sleep } from '~/tools/client/time'; import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations'; import { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder'; import { manageNamespaces } from '~/tools/server/translation-namespaces'; import { api } from '~/utils/api'; -const BoardsPage = () => { - const { data: sessionData } = useSession(); +// Infer return type from the `getServerSideProps` function +export default function BoardsPage({ + boards, + session, +}: InferGetServerSidePropsType) { const { data, refetch } = api.boards.all.useQuery(undefined, { - staleTime: 0, + initialData: boards, cacheTime: 1000 * 60 * 5, // Cache for 5 minutes }); const { mutateAsync } = api.user.makeDefaultDashboard.useMutation({ @@ -68,7 +69,7 @@ const BoardsPage = () => { {t('pageTitle')} - {sessionData?.user.isAdmin && ( + {session?.user.isAdmin && ( + + + + + + + + } + onClick={async () => { + void mutateAsync({ + board: board.name, + }); + }} + > + {t('cards.menu.setAsDefault')} + + {session?.user.isAdmin && ( + <> + + { + openDeleteBoardModal({ + boardName: board.name, + onConfirm: async () => { + append(board.name); + // give user feedback, that it's being deleted + await sleep(500); + filter((item, _) => item !== board.name); + }, + }); + }} + disabled={board.name === 'default'} + icon={} + color="red" + > + {t('cards.menu.delete.label')} + {board.name === 'default' && ( + {t('cards.menu.delete.disabled')} + )} + + )} - - - - - - - - {t('cards.statistics.apps')} - - {board.countApps} - - - - - - {t('cards.statistics.widgets')} - - {board.countWidgets} - - - - - - {t('cards.statistics.categories')} - - {board.countCategories} - - - - - - - - - - - - - } - onClick={async () => { - void mutateAsync({ - board: board.name, - }); - }} - > - {t('cards.menu.setAsDefault')} - - {sessionData?.user.isAdmin && ( - <> - - { - openDeleteBoardModal({ - boardName: board.name, - onConfirm: async () => { - append(board.name); - // give user feedback, that it's being deleted - await sleep(500); - filter((item, _) => item !== board.name); - }, - }); - }} - disabled={board.name === 'default'} - icon={} - color="red" - > - {t('cards.menu.delete.label')} - {board.name === 'default' && ( - {t('cards.menu.delete.disabled')} - )} - - - )} - - - - - ))} - - )} + + + + + ))} + ); -}; +} -export const getServerSideProps: GetServerSideProps = async (ctx) => { - const session = await getServerAuthSession(ctx); - - const result = checkForSessionOrAskForLogin(ctx, session, () => true); - if (result) { +export const getServerSideProps = async (context: GetServerSidePropsContext) => { + const session = await getServerAuthSession({ req: context.req, res: context.res }); + const result = checkForSessionOrAskForLogin( + context, + session, + () => session?.user.isAdmin == true + ); + if (result !== undefined) { return result; } - const helpers = createServerSideHelpers({ - router: boardRouter, - ctx: { - session, - cookies: ctx.req.cookies, - prisma: prisma, - }, - transformer: superjson, + const caller = boardRouter.createCaller({ + session: session, + cookies: context.req.cookies, }); - await helpers.all.prefetch(); + const boards = await caller.all(); const translations = await getServerSideTranslations( manageNamespaces, - ctx.locale, - ctx.req, - ctx.res + context.locale, + context.req, + context.res ); + return { props: { + boards, + session, ...translations, - trpcState: helpers.dehydrate(), }, }; }; - -export default BoardsPage; diff --git a/src/server/api/routers/board.ts b/src/server/api/routers/board.ts index ce244302d..05c74c2e4 100644 --- a/src/server/api/routers/board.ts +++ b/src/server/api/routers/board.ts @@ -25,6 +25,7 @@ export const boardRouter = createTRPCRouter({ return { name: name, + allowGuests: config.settings.access.allowGuests, countApps: countApps, countWidgets: config.widgets.length, countCategories: config.categories.length, diff --git a/src/tools/server/loginBuilder.ts b/src/tools/server/loginBuilder.ts index 9f9a3a2cd..44b8da848 100644 --- a/src/tools/server/loginBuilder.ts +++ b/src/tools/server/loginBuilder.ts @@ -1,8 +1,8 @@ import { - GetServerSideProps, GetServerSidePropsContext, GetServerSidePropsResult, PreviewData, + Redirect } from 'next'; import { Session } from 'next-auth'; @@ -13,13 +13,12 @@ export const checkForSessionOrAskForLogin = ( context: GetServerSidePropsContext, session: Session | null, accessCallback: () => boolean -): GetServerSidePropsResult | undefined => { +): GetServerSidePropsResult | undefined => { const permitted = accessCallback(); // user is logged in but does not have the required access if (session?.user && !permitted) { return { - props: {}, redirect: { destination: '/401', permanent: false @@ -34,7 +33,6 @@ export const checkForSessionOrAskForLogin = ( // user is logged out and needs to sign in return { - props: {}, redirect: { destination: `/auth/login?redirectAfterLogin=${context.resolvedUrl}`, permanent: false,