From 12c33ea88e32b6617ad3f436229d508600a7b4d4 Mon Sep 17 00:00:00 2001 From: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Date: Thu, 21 Jul 2022 14:25:10 +0100 Subject: [PATCH] Hide button if readonly (#3471) Co-authored-by: Alex van Andel --- apps/web/pages/event-types/[type].tsx | 42 +++++++++++++++++---------- apps/web/pages/event-types/index.tsx | 33 ++++++++++++--------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/apps/web/pages/event-types/[type].tsx b/apps/web/pages/event-types/[type].tsx index 353d04c1fb..c960e094b3 100644 --- a/apps/web/pages/event-types/[type].tsx +++ b/apps/web/pages/event-types/[type].tsx @@ -77,6 +77,7 @@ import * as RadioArea from "@components/ui/form/radio-area"; import WebhookListContainer from "@components/webhook/WebhookListContainer"; import { getTranslation } from "@server/lib/i18n"; +import { TRPCClientError } from "@trpc/client"; interface Token { name?: string; @@ -302,6 +303,8 @@ const EventTypePage = (props: inferSSRProps) => { if (err instanceof HttpError) { const message = `${err.statusCode}: ${err.message}`; showToast(message, "error"); + } else if (err instanceof TRPCClientError) { + showToast(err.message, "error"); } }, }); @@ -351,7 +354,6 @@ const EventTypePage = (props: inferSSRProps) => { async function deleteEventTypeHandler(event: React.MouseEvent) { event.preventDefault(); - const payload = { id: eventType.id }; deleteMutation.mutate(payload); } @@ -1978,20 +1980,24 @@ const EventTypePage = (props: inferSSRProps) => { className="text-md flex items-center rounded-sm px-2 py-1 text-sm font-medium text-gray-700 hover:bg-gray-200 hover:text-gray-900" eventTypeId={eventType.id} /> - - - - {t("delete")} - - - {t("delete_event_type_description")} - - + {/* This will only show if the user is not a member (ADMIN,OWNER) and if there is no current membership + - meaning you are within an eventtype that does not belong to a team */} + {(props.currentUserMembership?.role !== "MEMBER" || !props.currentUserMembership) && ( + + + + {t("delete")} + + + {t("delete_event_type_description")} + + + )} @@ -2281,6 +2287,11 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => }) : []; + // Find the current users memebership so we can check role to enable/disable deletion. + // Sets to null if no membership is found - this must mean we are in a none team event type + const currentUserMembership = + eventTypeObject.team?.members.find((el) => el.user.id === session.user.id) ?? null; + return { props: { session, @@ -2292,6 +2303,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => hasPaymentIntegration, hasGiphyIntegration, currency, + currentUserMembership, }, }; }; diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx index b9bc4dcacb..2e28209fab 100644 --- a/apps/web/pages/event-types/index.tsx +++ b/apps/web/pages/event-types/index.tsx @@ -49,6 +49,8 @@ import Avatar from "@components/ui/Avatar"; import AvatarGroup from "@components/ui/AvatarGroup"; import Badge from "@components/ui/Badge"; +import { TRPCClientError } from "@trpc/react"; + type EventTypeGroups = inferQueryOutput<"viewer.eventTypes">["eventTypeGroups"]; type EventTypeGroupProfile = EventTypeGroups[number]["profile"]; interface EventTypeListHeadingProps { @@ -193,6 +195,8 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL const message = `${err.statusCode}: ${err.message}`; showToast(message, "error"); setDeleteDialogOpen(false); + } else if (err instanceof TRPCClientError) { + showToast(err.message, "error"); } }, }); @@ -332,19 +336,22 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL /> - - - + {/* readonly is only set when we are on a team - if we are on a user event type null will be the value. */} + {(group.metadata?.readOnly === false || group.metadata.readOnly === null) && ( + + + + )}