From cd6775da325eac6b5d0a45594af85ccde870c5c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Wed, 26 Jun 2024 15:37:37 +0200 Subject: [PATCH] Don't display unmatched columns in csv import (#6037) Adding a toggle so that, by default, we don't see dozens of fields but only the field we matched, during the data validation step in csv export Screenshot 2024-06-26 at 13 25 36 --- .../steps/components/UploadFlow.tsx | 5 +- .../ValidationStep/ValidationStep.tsx | 35 +++++++++- .../__stories__/Validation.stories.tsx | 2 + .../spreadsheet-import/tests/mockRsiValues.ts | 28 ++++++++ .../twenty-front/src/testing/graphqlMocks.ts | 67 ++++++++++--------- 5 files changed, 102 insertions(+), 35 deletions(-) diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx index 7e79ed33f..052082fe2 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx @@ -12,7 +12,7 @@ import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/Snac import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { Modal } from '@/ui/layout/modal/components/Modal'; -import { MatchColumnsStep } from './MatchColumnsStep/MatchColumnsStep'; +import { Columns, MatchColumnsStep } from './MatchColumnsStep/MatchColumnsStep'; import { SelectHeaderStep } from './SelectHeaderStep/SelectHeaderStep'; import { SelectSheetStep } from './SelectSheetStep/SelectSheetStep'; import { UploadStep } from './UploadStep/UploadStep'; @@ -52,6 +52,7 @@ export type StepState = | { type: StepType.validateData; data: any[]; + importedColumns: Columns; } | { type: StepType.loading; @@ -216,6 +217,7 @@ export const UploadFlow = ({ nextStep, prevStep }: UploadFlowProps) => { setState({ type: StepType.validateData, data, + importedColumns: columns, }); setPreviousState(state); nextStep(); @@ -233,6 +235,7 @@ export const UploadFlow = ({ nextStep, prevStep }: UploadFlowProps) => { return ( setState({ diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx index e9b6ebe8b..35430fcce 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx @@ -8,6 +8,10 @@ import { Heading } from '@/spreadsheet-import/components/Heading'; import { StepNavigationButton } from '@/spreadsheet-import/components/StepNavigationButton'; import { Table } from '@/spreadsheet-import/components/Table'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; +import { + Columns, + ColumnType, +} from '@/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep'; import { Data } from '@/spreadsheet-import/types'; import { addErrorsAndRunHooks } from '@/spreadsheet-import/utils/dataMutations'; import { useDialogManager } from '@/ui/feedback/dialog-manager/hooks/useDialogManager'; @@ -62,6 +66,7 @@ const StyledNoRowsContainer = styled.div` type ValidationStepProps = { initialData: Data[]; + importedColumns: Columns; file: File; onSubmitStart?: () => void; onBack: () => void; @@ -69,6 +74,7 @@ type ValidationStepProps = { export const ValidationStep = ({ initialData, + importedColumns, file, onSubmitStart, onBack, @@ -88,6 +94,7 @@ export const ValidationStep = ({ ReadonlySet >(new Set()); const [filterByErrors, setFilterByErrors] = useState(false); + const [showUnmatchedColumns, setShowUnmatchedColumns] = useState(false); const updateData = useCallback( (rows: typeof data) => { @@ -127,7 +134,24 @@ export const ValidationStep = ({ [data, updateData], ); - const columns = useMemo(() => generateColumns(fields), [fields]); + const columns = useMemo( + () => + generateColumns(fields) + .map((column) => { + const hasBeenImported = + importedColumns.filter( + (importColumn) => + (importColumn.type === ColumnType.matched && + importColumn.value === column.key) || + column.key === 'select-row', + ).length > 0; + + if (!hasBeenImported && !showUnmatchedColumns) return null; + return column; + }) + .filter(Boolean), + [fields, importedColumns, showUnmatchedColumns], + ); const tableData = useMemo(() => { if (filterByErrors) { @@ -212,6 +236,15 @@ export const ValidationStep = ({ Show only rows with errors + + setShowUnmatchedColumns(!showUnmatchedColumns)} + /> + + Show unmatched columns + +