diff --git a/packages/features/bookings/components/EventTypeFilter.tsx b/packages/features/bookings/components/EventTypeFilter.tsx index 7427612258..7888a81851 100644 --- a/packages/features/bookings/components/EventTypeFilter.tsx +++ b/packages/features/bookings/components/EventTypeFilter.tsx @@ -1,5 +1,5 @@ import { useSession } from "next-auth/react"; -import { Fragment, useMemo } from "react"; +import { Fragment, useMemo, useState } from "react"; import { FilterCheckboxField, @@ -8,6 +8,7 @@ import { import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; +import { FilterSearchField } from "@calcom/ui"; import { AnimatedPopover, Divider, Icon } from "@calcom/ui"; import { groupBy } from "../groupBy"; @@ -33,6 +34,7 @@ export const EventTypeFilter = () => { const { t } = useLocale(); const { data: user } = useSession(); const { data: query, pushItemToKey, removeItemByKeyAndValue, removeAllQueryParams } = useFilterQuery(); + const [search, setSearch] = useState(""); const eventTypes = trpc.viewer.eventTypes.listWithTeam.useQuery(undefined, { enabled: !!user, @@ -68,6 +70,11 @@ export const EventTypeFilter = () => { {!isEmpty ? ( + setSearch(e.target.value)} + /> } @@ -82,20 +89,22 @@ export const EventTypeFilter = () => {
{teamName === "user_own_event_types" ? t("individual") : teamName}
- {groupedEventTypes[teamName].map((eventType) => ( - { - if (e.target.checked) { - pushItemToKey("eventTypeIds", eventType.id); - } else if (!e.target.checked) { - removeItemByKeyAndValue("eventTypeIds", eventType.id); - } - }} - label={eventType.title} - /> - ))} + {groupedEventTypes[teamName] + .filter((eventType) => eventType.title.toLowerCase().includes(search.toLowerCase())) + .map((eventType) => ( + { + if (e.target.checked) { + pushItemToKey("eventTypeIds", eventType.id); + } else if (!e.target.checked) { + removeItemByKeyAndValue("eventTypeIds", eventType.id); + } + }} + label={eventType.title} + /> + ))} ))}
diff --git a/packages/features/bookings/components/PeopleFilter.tsx b/packages/features/bookings/components/PeopleFilter.tsx index bf1588dbeb..dca96cdf1b 100644 --- a/packages/features/bookings/components/PeopleFilter.tsx +++ b/packages/features/bookings/components/PeopleFilter.tsx @@ -24,7 +24,7 @@ export const PeopleFilter = () => { const debouncedSearch = useDebounce(searchText, 500); const queryMembers = trpc.viewer.teams.legacyListMembers.useInfiniteQuery( - { limit: 10, searchText: debouncedSearch }, + { limit: 10, searchText: debouncedSearch, includeEmail: true }, { enabled: true, getNextPageParam: (lastPage) => lastPage.nextCursor, diff --git a/packages/trpc/server/routers/viewer/teams/_router.tsx b/packages/trpc/server/routers/viewer/teams/_router.tsx index 5ada9691b4..ad12d435da 100644 --- a/packages/trpc/server/routers/viewer/teams/_router.tsx +++ b/packages/trpc/server/routers/viewer/teams/_router.tsx @@ -15,7 +15,7 @@ import { ZGetUserConnectedAppsInputSchema } from "./getUserConnectedApps.schema" import { ZHasEditPermissionForUserSchema } from "./hasEditPermissionForUser.schema"; import { ZInviteMemberInputSchema } from "./inviteMember/inviteMember.schema"; import { ZInviteMemberByTokenSchemaInputSchema } from "./inviteMemberByToken.schema"; -import { ZListMembersInputSchema as ZLegegacyListMembers } from "./legacyListMembers.schema"; +import { ZLegacyListMembersInputSchema } from "./legacyListMembers.schema"; import { ZGetListSchema } from "./list.schema"; import { ZListMembersInputSchema } from "./listMembers.schema"; import { hasTeamPlan } from "./procedures/hasTeamPlan"; @@ -121,7 +121,7 @@ export const viewerTeamsRouter = router({ const handler = await importHandler(namespaced("listMembers"), () => import("./listMembers.handler")); return handler(opts); }), - legacyListMembers: authedProcedure.input(ZLegegacyListMembers).query(async (opts) => { + legacyListMembers: authedProcedure.input(ZLegacyListMembersInputSchema).query(async (opts) => { const handler = await importHandler( namespaced("legacyListMembers"), () => import("./legacyListMembers.handler") diff --git a/packages/trpc/server/routers/viewer/teams/legacyListMembers.handler.ts b/packages/trpc/server/routers/viewer/teams/legacyListMembers.handler.ts index 6f0b9ef368..7be2d5cfa9 100644 --- a/packages/trpc/server/routers/viewer/teams/legacyListMembers.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/legacyListMembers.handler.ts @@ -1,15 +1,17 @@ +import type { Prisma } from "@prisma/client"; + import { UserRepository } from "@calcom/lib/server/repository/user"; import type { PrismaClient } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; -import type { TListMembersInputSchema } from "./legacyListMembers.schema"; +import type { TLegacyListMembersInputSchema } from "./legacyListMembers.schema"; type ListMembersOptions = { ctx: { user: NonNullable; prisma: PrismaClient; }; - input: TListMembersInputSchema; + input: TLegacyListMembersInputSchema; }; export const legacyListMembers = async ({ ctx, input }: ListMembersOptions) => { @@ -57,6 +59,15 @@ export const legacyListMembers = async ({ ctx, input }: ListMembersOptions) => { }; } + const searchTextClauses: Prisma.UserWhereInput[] = [ + { name: { contains: input.searchText, mode: "insensitive" } }, + { username: { contains: input.searchText, mode: "insensitive" } }, + ]; + + if (input.includeEmail) { + searchTextClauses.push({ email: { contains: input.searchText, mode: "insensitive" } }); + } + // Fetch unique users through memberships const memberships = await prisma.membership.findMany({ where: { @@ -64,10 +75,7 @@ export const legacyListMembers = async ({ ctx, input }: ListMembersOptions) => { teamId: { in: teamsToQuery }, user: input.searchText?.trim()?.length ? { - OR: [ - { name: { contains: input.searchText, mode: "insensitive" } }, - { username: { contains: input.searchText, mode: "insensitive" } }, - ], + OR: searchTextClauses, } : undefined, }, @@ -80,6 +88,7 @@ export const legacyListMembers = async ({ ctx, input }: ListMembersOptions) => { name: true, username: true, avatarUrl: true, + email: true, }, }, }, diff --git a/packages/trpc/server/routers/viewer/teams/legacyListMembers.schema.ts b/packages/trpc/server/routers/viewer/teams/legacyListMembers.schema.ts index 62f24b551b..88f8370d20 100644 --- a/packages/trpc/server/routers/viewer/teams/legacyListMembers.schema.ts +++ b/packages/trpc/server/routers/viewer/teams/legacyListMembers.schema.ts @@ -7,4 +7,9 @@ export const ZListMembersInputSchema = z.object({ cursor: z.number().nullish(), }); +export const ZLegacyListMembersInputSchema = ZListMembersInputSchema.extend({ + includeEmail: z.boolean().optional(), +}); + export type TListMembersInputSchema = z.infer; +export type TLegacyListMembersInputSchema = z.infer;