5425 - Introducing support for all Composite Fields Import (#5470)

Adding support for all Composite Fields while using the "import"
functionality. This includes:
- Currency
- Address

Edit : 
- Refactored a lot of types in the spreadsheet import module
- Renamed a lot of functions, hooks and types that were not
self-explanatory enough

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
Aryan Singh
2024-07-23 21:32:23 +05:30
committed by GitHub
parent 2cc0597ee4
commit 5c8fe027f9
46 changed files with 888 additions and 535 deletions

View File

@ -1,50 +1,57 @@
import { act, renderHook } from '@testing-library/react';
import { RecoilRoot, useRecoilState } from 'recoil';
import { useSpreadsheetImport } from '@/spreadsheet-import/hooks/useSpreadsheetImport';
import { spreadsheetImportState } from '@/spreadsheet-import/states/spreadsheetImportState';
import { useOpenSpreadsheetImportDialog } from '@/spreadsheet-import/hooks/useOpenSpreadsheetImportDialog';
import { spreadsheetImportDialogState } from '@/spreadsheet-import/states/spreadsheetImportDialogState';
import { StepType } from '@/spreadsheet-import/steps/components/UploadFlow';
import { RawData, SpreadsheetOptions } from '@/spreadsheet-import/types';
import {
ImportedRow,
SpreadsheetImportDialogOptions,
} from '@/spreadsheet-import/types';
const Wrapper = ({ children }: { children: React.ReactNode }) => (
<RecoilRoot>{children}</RecoilRoot>
);
type SpreadsheetKey = 'spreadsheet_key';
export const mockedSpreadsheetOptions: SpreadsheetOptions<SpreadsheetKey> = {
isOpen: true,
onClose: () => {},
fields: [],
uploadStepHook: async () => [],
selectHeaderStepHook: async (headerValues: RawData, data: RawData[]) => ({
headerValues,
data,
}),
matchColumnsStepHook: async () => [],
rowHook: () => ({ spreadsheet_key: 'rowHook' }),
tableHook: () => [{ spreadsheet_key: 'tableHook' }],
onSubmit: async () => {},
allowInvalidSubmit: false,
customTheme: {},
maxRecords: 10,
maxFileSize: 50,
autoMapHeaders: true,
autoMapDistance: 1,
initialStepState: {
type: StepType.upload,
},
dateFormat: 'MM/DD/YY',
parseRaw: true,
rtl: false,
selectHeader: true,
};
export const mockedSpreadsheetOptions: SpreadsheetImportDialogOptions<SpreadsheetKey> =
{
isOpen: true,
onClose: () => {},
fields: [],
uploadStepHook: async () => [],
selectHeaderStepHook: async (
headerValues: ImportedRow,
data: ImportedRow[],
) => ({
headerRow: headerValues,
importedRows: data,
}),
matchColumnsStepHook: async () => [],
rowHook: () => ({ spreadsheet_key: 'rowHook' }),
tableHook: () => [{ spreadsheet_key: 'tableHook' }],
onSubmit: async () => {},
allowInvalidSubmit: false,
customTheme: {},
maxRecords: 10,
maxFileSize: 50,
autoMapHeaders: true,
autoMapDistance: 1,
initialStepState: {
type: StepType.upload,
},
dateFormat: 'MM/DD/YY',
parseRaw: true,
rtl: false,
selectHeader: true,
};
describe('useSpreadsheetImport', () => {
it('should set isOpen to true, and update the options in the Recoil state', async () => {
const { result } = renderHook(
() => ({
useSpreadsheetImport: useSpreadsheetImport<SpreadsheetKey>(),
spreadsheetImportState: useRecoilState(spreadsheetImportState)[0],
useSpreadsheetImport: useOpenSpreadsheetImportDialog<SpreadsheetKey>(),
spreadsheetImportState: useRecoilState(spreadsheetImportDialogState)[0],
}),
{
wrapper: Wrapper,
@ -55,7 +62,7 @@ describe('useSpreadsheetImport', () => {
options: null,
});
act(() => {
result.current.useSpreadsheetImport.openSpreadsheetImport(
result.current.useSpreadsheetImport.openSpreadsheetImportDialog(
mockedSpreadsheetOptions,
);
});

View File

@ -0,0 +1,19 @@
import { useSetRecoilState } from 'recoil';
import { spreadsheetImportDialogState } from '@/spreadsheet-import/states/spreadsheetImportDialogState';
import { SpreadsheetImportDialogOptions } from '@/spreadsheet-import/types';
export const useOpenSpreadsheetImportDialog = <T extends string>() => {
const setSpreadSheetImport = useSetRecoilState(spreadsheetImportDialogState);
const openSpreadsheetImportDialog = (
options: Omit<SpreadsheetImportDialogOptions<T>, 'isOpen' | 'onClose'>,
) => {
setSpreadSheetImport({
isOpen: true,
options,
});
};
return { openSpreadsheetImportDialog };
};

View File

@ -1,19 +0,0 @@
import { useSetRecoilState } from 'recoil';
import { spreadsheetImportState } from '@/spreadsheet-import/states/spreadsheetImportState';
import { SpreadsheetOptions } from '@/spreadsheet-import/types';
export const useSpreadsheetImport = <T extends string>() => {
const setSpreadSheetImport = useSetRecoilState(spreadsheetImportState);
const openSpreadsheetImport = (
options: Omit<SpreadsheetOptions<T>, 'isOpen' | 'onClose'>,
) => {
setSpreadSheetImport({
isOpen: true,
options,
});
};
return { openSpreadsheetImport };
};

View File

@ -3,12 +3,12 @@ import { SetRequired } from 'type-fest';
import { RsiContext } from '@/spreadsheet-import/components/Providers';
import { defaultSpreadsheetImportProps } from '@/spreadsheet-import/provider/components/SpreadsheetImport';
import { SpreadsheetOptions } from '@/spreadsheet-import/types';
import { SpreadsheetImportDialogOptions } from '@/spreadsheet-import/types';
export const useSpreadsheetImportInternal = <T extends string>() =>
useContext<
SetRequired<
SpreadsheetOptions<T>,
SpreadsheetImportDialogOptions<T>,
keyof typeof defaultSpreadsheetImportProps
>
>(RsiContext);