From 2a2cb14f6c3495ff7cfa00c5ab63bba03fd196c8 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Sep 2023 17:25:17 -0700 Subject: [PATCH] Handle children on event types, managed events, readonly and team count --- apps/web/pages/event-types/index.tsx | 74 ++++++++++--------- .../migration.sql | 12 +++ packages/prisma/schema.prisma | 6 ++ .../eventTypes/infiniteEventTypes.handler.ts | 21 ++++-- .../routers/viewer/teams/list.handler.ts | 12 +++ 5 files changed, 85 insertions(+), 40 deletions(-) create mode 100644 packages/prisma/migrations/202309061610320_create_team_member_count_view/migration.sql diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx index fa6142d746..2ec6ddd4d9 100644 --- a/apps/web/pages/event-types/index.tsx +++ b/apps/web/pages/event-types/index.tsx @@ -29,7 +29,6 @@ import { useTypedQuery } from "@calcom/lib/hooks/useTypedQuery"; import { HttpError } from "@calcom/lib/http-error"; import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML"; import { SchedulingType } from "@calcom/prisma/enums"; -import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc, TRPCClientError } from "@calcom/trpc/react"; import { @@ -92,10 +91,12 @@ type EventType = EventTypeList[number]; interface EventTypeListProps { data: EventTypeList; + readonly?: boolean; } interface MobileTeamsTabProps { teamEventTypes: EventTypeList[]; + readonly?: boolean; } const querySchema = z.object({ @@ -103,7 +104,7 @@ const querySchema = z.object({ }); const MobileTeamsTab: FC = (props: MobileTeamsTabProps) => { - const { teamEventTypes } = props; + const { teamEventTypes, readonly } = props; const orgBranding = useOrgBranding(); const tabs = teamEventTypes .filter((item) => item !== undefined) @@ -130,7 +131,7 @@ const MobileTeamsTab: FC = (props: MobileTeamsTabProps) => return (
- {events && events.length && } + {events && events.length && }
); }; @@ -147,9 +148,8 @@ const getEventTypeSlug = (eventType: EventType, t: TFunction) => { } }; -const Item = ({ eventType }: { eventType: EventType }) => { +const Item = ({ eventType, readonly }: { eventType: EventType; readonly?: boolean }) => { const { t } = useLocale(); - const readOnly = false; const content = () => (
@@ -165,7 +165,7 @@ const Item = ({ eventType }: { eventType: EventType }) => { {getEventTypeSlug(eventType, t)} - {readOnly && ( + {readonly && ( {t("readonly")} @@ -173,7 +173,7 @@ const Item = ({ eventType }: { eventType: EventType }) => {
); - return readOnly ? ( + return readonly ? (
{content()} { {getEventTypeSlug(eventType, t)} - {readOnly && ( + {readonly && ( {t("readonly")} @@ -220,7 +220,7 @@ const Item = ({ eventType }: { eventType: EventType }) => { const MemoizedItem = memo(Item); -export const EventTypeList = ({ data }: EventTypeListProps): JSX.Element => { +export const EventTypeList = ({ data, readonly }: EventTypeListProps): JSX.Element => { const { t } = useLocale(); const router = useRouter(); const pathname = usePathname(); @@ -391,11 +391,10 @@ export const EventTypeList = ({ data }: EventTypeListProps): JSX.Element => { const calLink = `${orgBranding?.fullDomain ?? CAL_URL}/${embedLink}`; const isManagedEventType = eventType.schedulingType === SchedulingType.MANAGED; - const eventTypeMetadata = EventTypeMetaDataSchema.safeParse(eventType.metadata); - const isChildrenManagedEventType = - eventTypeMetadata.success && - eventTypeMetadata.data?.managedEventConfig !== undefined && - eventType.schedulingType !== SchedulingType.MANAGED; + + const isChildrenManagedEventType = !!eventType.parentId; + const isReadOnly = readonly || isChildrenManagedEventType; + return (
  • @@ -406,7 +405,7 @@ export const EventTypeList = ({ data }: EventTypeListProps): JSX.Element => { {!(lastItem && lastItem.id === eventType.id) && ( moveEventType(index, 1)} arrowDirection="down" /> )} - +
    {eventType.team && !isManagedEventType && ( @@ -425,16 +424,20 @@ export const EventTypeList = ({ data }: EventTypeListProps): JSX.Element => { )} /> )} - {isManagedEventType && type?.children && type.children?.length > 0 && ( + {isManagedEventType && eventType.children?.length > 0 && ( ) => ({ - alt: user.name || "", - image: `${orgBranding?.fullDomain ?? WEBAPP_URL}/${user.username}/avatar.png`, - title: user.name || "", - }))} + items={eventType.children.map( + ({ users }: { users: Pick[] }) => ({ + alt: users[0].name || "", + image: `${orgBranding?.fullDomain ?? WEBAPP_URL}/${ + users[0].username + }/avatar.png`, + title: users[0].name || "", + }) + )} /> )}
    @@ -485,7 +488,7 @@ export const EventTypeList = ({ data }: EventTypeListProps): JSX.Element => { )} - +