From 6c1e0fd345ba0d81f418236a85b20518ffa764bd Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Tue, 4 Jan 2022 15:50:56 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9A=97=EF=B8=8F=20Add=20export=20results?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/builder/.gitignore | 3 +- .../results/ResultsActionButtons.tsx | 81 +++++++++++ .../SubmissionsTable/SubmissionsTable.tsx | 35 ++--- .../shared/TypebotHeader/TypebotHeader.tsx | 1 + apps/builder/cypress/tests/results.ts | 47 +++++++ apps/builder/cypress/tsconfig.json | 2 +- .../layouts/results/SubmissionContent.tsx | 130 ++++++++---------- apps/builder/package.json | 2 + .../pages/api/typebots/[typebotId]/results.ts | 3 +- apps/builder/services/results.ts | 22 ++- yarn.lock | 12 ++ 11 files changed, 235 insertions(+), 103 deletions(-) create mode 100644 apps/builder/components/results/ResultsActionButtons.tsx diff --git a/apps/builder/.gitignore b/apps/builder/.gitignore index 5566491b960..a1359206b52 100644 --- a/apps/builder/.gitignore +++ b/apps/builder/.gitignore @@ -1,2 +1,3 @@ cypress/videos -cypress/screenshots \ No newline at end of file +cypress/screenshots +cypress/downloads \ No newline at end of file diff --git a/apps/builder/components/results/ResultsActionButtons.tsx b/apps/builder/components/results/ResultsActionButtons.tsx new file mode 100644 index 00000000000..9704036e9c1 --- /dev/null +++ b/apps/builder/components/results/ResultsActionButtons.tsx @@ -0,0 +1,81 @@ +import { + HStack, + Button, + Fade, + Tag, + Text, + useDisclosure, +} from '@chakra-ui/react' +import { DownloadIcon, TrashIcon } from 'assets/icons' +import { ConfirmModal } from 'components/modals/ConfirmModal' +import React from 'react' + +type ResultsActionButtonsProps = { + totalSelected: number + isDeleteLoading: boolean + isExportLoading: boolean + onDeleteClick: () => Promise + onExportClick: () => void +} + +export const ResultsActionButtons = ({ + totalSelected, + isDeleteLoading, + isExportLoading, + onDeleteClick, + onExportClick, +}: ResultsActionButtonsProps) => { + const { isOpen, onOpen, onClose } = useDisclosure() + return ( + + 0} unmountOnExit> + + + Export + + + {totalSelected} + + + + + 0} unmountOnExit> + + + Delete + {totalSelected > 0 && ( + + {totalSelected} + + )} + + + You are about to delete{' '} + + {totalSelected} submission + {totalSelected > 1 ? 's' : ''} + + . Are you sure you wish to continue? + + } + confirmButtonLabel={'Delete'} + /> + + + ) +} diff --git a/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx b/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx index 5de3b747f17..66ed2ae2085 100644 --- a/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx +++ b/apps/builder/components/results/SubmissionsTable/SubmissionsTable.tsx @@ -1,46 +1,33 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react/jsx-key */ import { Box, Checkbox, Flex } from '@chakra-ui/react' -import { Answer, Result } from 'bot-engine' import { useTypebot } from 'contexts/TypebotContext' -import React, { useEffect, useRef } from 'react' +import React, { useEffect, useMemo, useRef } from 'react' import { Hooks, useFlexLayout, useRowSelect, useTable } from 'react-table' import { parseSubmissionsColumns } from 'services/publicTypebot' -import { parseDateToReadable } from 'services/results' import { LoadingRows } from './LoadingRows' const defaultCellWidth = 180 type SubmissionsTableProps = { - results?: (Result & { answers: Answer[] })[] + data?: any hasMore?: boolean - onNewSelection: (selection: string[]) => void + onNewSelection: (indices: number[]) => void onScrollToBottom: () => void } export const SubmissionsTable = ({ - results, + data, hasMore, onNewSelection, onScrollToBottom, }: SubmissionsTableProps) => { const { publishedTypebot } = useTypebot() - const columns: any = React.useMemo( + const columns: any = useMemo( () => parseSubmissionsColumns(publishedTypebot), [publishedTypebot] ) - const data = React.useMemo( - () => - (results ?? []).map((result) => ({ - createdAt: parseDateToReadable(result.createdAt), - ...result.answers.reduce( - (o, answer) => ({ ...o, [answer.blockId]: answer.content }), - {} - ), - })), - // eslint-disable-next-line react-hooks/exhaustive-deps - [results?.length] - ) + const bottomElement = useRef(null) const tableWrapper = useRef(null) @@ -59,8 +46,7 @@ export const SubmissionsTable = ({ ) as any useEffect(() => { - if (!results) return - onNewSelection(selectedFlatRows.map((row: any) => results[row.index].id)) + onNewSelection(selectedFlatRows.map((row: any) => row.index)) // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedFlatRows]) @@ -130,8 +116,7 @@ export const SubmissionsTable = ({ as="tr" {...row.getRowProps()} ref={(ref) => { - if (results && idx === results.length - 10) - bottomElement.current = ref + if (idx === data.length - 10) bottomElement.current = ref }} > {row.cells.map((cell: any, idx: number) => { @@ -155,9 +140,7 @@ export const SubmissionsTable = ({ ) })} - {(results === undefined || hasMore === true) && ( - - )} + {hasMore === true && } diff --git a/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx b/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx index 330b77b23e8..241e4b48b8d 100644 --- a/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx +++ b/apps/builder/components/shared/TypebotHeader/TypebotHeader.tsx @@ -33,6 +33,7 @@ export const TypebotHeader = () => { h={`${headerHeight}px`} zIndex={2} bgColor="white" + flexShrink={0} >