diff --git a/apps/web/app/(app)/environments/[environmentId]/(people)/people/components/PersonDataView.tsx b/apps/web/app/(app)/environments/[environmentId]/(people)/people/components/PersonDataView.tsx index 421e3abdee..cf5ee88777 100644 --- a/apps/web/app/(app)/environments/[environmentId]/(people)/people/components/PersonDataView.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/(people)/people/components/PersonDataView.tsx @@ -1,14 +1,11 @@ "use client"; -import { - getPersonAttributesAction, - getPersonsAction, -} from "@/app/(app)/environments/[environmentId]/(people)/people/actions"; +import { getPersonsAction } from "@/app/(app)/environments/[environmentId]/(people)/people/actions"; import { PersonTable } from "@/app/(app)/environments/[environmentId]/(people)/people/components/PersonTable"; import { useEffect, useState } from "react"; import React from "react"; import { TEnvironment } from "@formbricks/types/environment"; -import { TPerson, TPersonTableData } from "@formbricks/types/people"; +import { TPersonWithAttributes } from "@formbricks/types/people"; interface PersonDataViewProps { environment: TEnvironment; @@ -17,8 +14,7 @@ interface PersonDataViewProps { } export const PersonDataView = ({ environment, personCount, itemsPerPage }: PersonDataViewProps) => { - const [persons, setPersons] = useState([]); - const [personTableData, setPersonTableData] = useState([]); + const [persons, setPersons] = useState([]); const [pageNumber, setPageNumber] = useState(1); const [totalPersons, setTotalPersons] = useState(0); const [isDataLoaded, setIsDataLoaded] = useState(false); @@ -40,41 +36,13 @@ export const PersonDataView = ({ environment, personCount, itemsPerPage }: Perso } } catch (error) { console.error("Error fetching people data:", error); - } - }; - - fetchData(); - }, [pageNumber, personCount, itemsPerPage, environment.id]); - - // Fetch additional person attributes and update table data - useEffect(() => { - const fetchAttributes = async () => { - try { - const updatedPersonTableData = await Promise.all( - persons.map(async (person) => { - const attributes = await getPersonAttributesAction({ - environmentId: environment.id, - personId: person.id, - }); - return { - createdAt: person.createdAt, - personId: person.id, - userId: person.userId, - email: attributes?.data?.email ?? "", - attributes: attributes?.data ?? {}, - }; - }) - ); - setPersonTableData(updatedPersonTableData); - } catch (error) { - console.error("Error fetching person attributes:", error); } finally { setIsDataLoaded(true); } }; - fetchAttributes(); - }, [persons, environment.id]); + fetchData(); + }, [pageNumber, personCount, itemsPerPage, environment.id]); const fetchNextPage = async () => { if (hasMore && !loadingNextPage) { @@ -97,6 +65,15 @@ export const PersonDataView = ({ environment, personCount, itemsPerPage }: Perso setPersons((prevPersons) => prevPersons.filter((p) => !personIds.includes(p.id))); }; + const personTableData = persons.map((person) => ({ + id: person.id, + userId: person.userId, + email: person.attributes.email, + createdAt: person.createdAt, + attributes: person.attributes, + personId: person.id, + })); + return ( -
+
@@ -189,8 +190,9 @@ export const PersonTable = ({ if (cell.column.id === "select") return; router.push(`/environments/${environmentId}/people/${row.id}`); }} + style={cell.column.id === "select" ? getCommonPinningStyles(cell.column) : {}} className={cn( - "border-slate-300 bg-white shadow-none group-hover:bg-slate-100", + "border-slate-200 bg-white shadow-none group-hover:bg-slate-100", row.getIsSelected() && "bg-slate-100", { "border-r": !cell.column.getIsLastColumn(), diff --git a/apps/web/app/(app)/environments/[environmentId]/(people)/people/page.tsx b/apps/web/app/(app)/environments/[environmentId]/(people)/people/page.tsx index c14eba358a..f0204b65f6 100644 --- a/apps/web/app/(app)/environments/[environmentId]/(people)/people/page.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/(people)/people/page.tsx @@ -1,6 +1,7 @@ import { PersonDataView } from "@/app/(app)/environments/[environmentId]/(people)/people/components/PersonDataView"; import { PersonSecondaryNavigation } from "@/app/(app)/environments/[environmentId]/(people)/people/components/PersonSecondaryNavigation"; import { CircleHelpIcon } from "lucide-react"; +import { ITEMS_PER_PAGE } from "@formbricks/lib/constants"; import { getEnvironment } from "@formbricks/lib/environment/service"; import { getPersonCount } from "@formbricks/lib/person/service"; import { Button } from "@formbricks/ui/Button"; @@ -31,7 +32,7 @@ const Page = async ({ params }: { params: { environmentId: string } }) => { - + ); }; diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx index 7891975e81..203df28c64 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx @@ -176,7 +176,7 @@ export const ResponseTable = ({ deleteRows={deleteResponses} type="response" /> -
+
{ +export const transformPrismaPerson = (person: TransformPersonInput): TPersonWithAttributes => { const attributes = person.attributes.reduce( (acc, attr) => { acc[attr.attributeClass.name] = attr.value; @@ -49,7 +59,7 @@ export const transformPrismaPerson = (person: TransformPersonInput): TPerson => environmentId: person.environmentId, createdAt: new Date(person.createdAt), updatedAt: new Date(person.updatedAt), - } as TPerson; + } as TPersonWithAttributes; }; export const getPerson = reactCache( @@ -81,13 +91,13 @@ export const getPerson = reactCache( ); export const getPeople = reactCache( - (environmentId: string, page?: number): Promise => + (environmentId: string, page?: number): Promise => cache( async () => { validateInputs([environmentId, ZId], [page, ZOptionalNumber]); try { - return await prisma.person.findMany({ + const persons = await prisma.person.findMany({ where: { environmentId: environmentId, }, @@ -95,6 +105,8 @@ export const getPeople = reactCache( take: page ? ITEMS_PER_PAGE : undefined, skip: page ? ITEMS_PER_PAGE * (page - 1) : undefined, }); + + return persons.map((person) => transformPrismaPerson(person)); } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); diff --git a/packages/types/people.ts b/packages/types/people.ts index e79e1f4859..3b1bc00487 100644 --- a/packages/types/people.ts +++ b/packages/types/people.ts @@ -16,6 +16,12 @@ export const ZPersonTableData = z.object({ attributes: ZAttributes, }); +export const ZPersonWithAttributes = ZPerson.extend({ + attributes: ZAttributes, +}); + +export type TPersonWithAttributes = z.infer; + export type TPersonTableData = z.infer; export type TPerson = z.infer; diff --git a/packages/ui/DataTable/components/DataTableHeader.tsx b/packages/ui/DataTable/components/DataTableHeader.tsx index e2214c0b29..153d70d7ab 100644 --- a/packages/ui/DataTable/components/DataTableHeader.tsx +++ b/packages/ui/DataTable/components/DataTableHeader.tsx @@ -36,7 +36,7 @@ export const DataTableHeader = ({ header, setIsTableSettingsModalOpen }: Dat ref={setNodeRef} style={style} key={header.id} - className={cn("group relative h-10 border-b border-slate-300 bg-white px-4 text-center", { + className={cn("group relative h-10 border-b border-slate-200 bg-white px-4 text-center", { "border-r": !header.column.getIsLastColumn(), "border-l": !header.column.getIsFirstColumn(), })}>