fuse-importer 0.26.7 → 0.26.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +13 -11
  2. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +3 -2
  3. package/lib/esm/Importer/Review/ReviewContextProvider.js +20 -20
  4. package/lib/esm/Importer/Stepper/index.js +14 -13
  5. package/lib/esm/Importer/Uploader/HeadersPreview.js +16 -8
  6. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +5 -0
  7. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +67 -0
  8. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.d.ts → SpreadsheetContextProvider/index.d.ts} +12 -8
  9. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.js → SpreadsheetContextProvider/index.js} +23 -17
  10. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.d.ts +14 -0
  11. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.js +45 -0
  12. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.d.ts +2 -0
  13. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +14 -0
  14. package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -2
  15. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +5 -2
  16. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.d.ts +2 -1
  17. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +9 -4
  18. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.d.ts +1 -2
  19. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +18 -13
  20. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +1 -3
  21. package/lib/esm/Importer/common/Spreadsheet/hooks.js +7 -4
  22. package/lib/esm/Importer/common/Spreadsheet/index.js +1 -1
  23. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -1
  24. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +7 -0
  25. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +25 -0
  26. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -0
  27. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +106 -0
  28. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +6 -2
  29. package/lib/esm/Importer/contexts/ImporterContextProvider.js +26 -22
  30. package/lib/esm/Importer/data/index.d.ts +19 -3
  31. package/lib/esm/Importer/data/index.js +27 -30
  32. package/lib/esm/Importer/index.js +1 -1
  33. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +9 -5
  34. package/lib/esm/common/Table/TableActions/RowFilters.d.ts +1 -0
  35. package/lib/esm/common/Table/TableActions/RowFilters.js +42 -0
  36. package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
  37. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -2
  38. package/lib/esm/common/Table/TableActions/hooks.js +0 -39
  39. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +2 -2
  40. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +4 -4
  41. package/lib/esm/common/Table/TableView/TableRows/index.js +7 -4
  42. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  43. package/lib/esm/common/Table/TableView/index.js +1 -2
  44. package/lib/esm/common/Table/TableView/types.d.ts +0 -1
  45. package/lib/esm/common/columnsTransformations.d.ts +15 -0
  46. package/lib/esm/common/columnsTransformations.js +92 -0
  47. package/lib/esm/common/columnsValidations.js +83 -3
  48. package/lib/esm/common/index.d.ts +1 -0
  49. package/lib/esm/common/index.js +1 -0
  50. package/lib/esm/common/inputs/Autocomplete.js +1 -1
  51. package/lib/esm/common/inputs/Checkbox.js +1 -1
  52. package/lib/esm/index.d.ts +2 -1
  53. package/lib/esm/index.js +3 -0
  54. package/lib/esm/locales/de.d.ts +5 -0
  55. package/lib/esm/locales/de.js +6 -1
  56. package/lib/esm/locales/en.d.ts +5 -0
  57. package/lib/esm/locales/en.js +6 -1
  58. package/lib/esm/locales/es.d.ts +5 -0
  59. package/lib/esm/locales/es.js +6 -1
  60. package/lib/esm/locales/fr.d.ts +5 -0
  61. package/lib/esm/locales/fr.js +6 -1
  62. package/lib/esm/types.d.ts +33 -2
  63. package/lib/esm/types.js +15 -0
  64. package/lib/main.js +24 -24
  65. package/package.json +1 -1
@@ -21,7 +21,7 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  return t;
22
22
  };
23
23
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
- import React, { useCallback, useMemo, useRef } from "react";
24
+ import React, { useCallback, useEffect, useMemo, useRef } from "react";
25
25
  import { areEqual } from "react-window";
26
26
  import { Div } from "../../../../styled/utils";
27
27
  import { getTableHeight } from "../../../common";
@@ -37,13 +37,17 @@ import { TableActions } from "../../../../common/Table/TableActions";
37
37
  import { useImporterContext } from "../../../../Importer/contexts/ImporterContextProvider";
38
38
  import useWindowDimensions from "../../../../utils/hooks/useWindowSize";
39
39
  var getItemKey = function (record) { return record._meta.id; };
40
- var SpreadsheetData = function () {
41
- var _a = useSpreadsheetContext(), fields = _a.fields, data = _a.data, isLoading = _a.isLoading, isReadOnly = _a.isReadOnly, totalErrors = _a.totalErrors, validationPercentage = _a.validationPercentage, setSortByFieldErrors = _a.setSortByFieldErrors, options = _a.options, setSortByFieldWarnings = _a.setSortByFieldWarnings, selectedRows = _a.selectedRows, checkboxColumnWidth = _a.checkboxColumnWidth, isFiltering = _a.isFiltering;
40
+ var SpreadsheetData = function (props) {
41
+ var _a = useSpreadsheetContext(), fields = _a.fields, data = _a.data, isLoading = _a.isLoading, isReadOnly = _a.isReadOnly, totalErrors = _a.totalErrors, validationPercentage = _a.validationPercentage, setSortByFieldErrors = _a.setSortByFieldErrors, options = _a.options, setSortByFieldWarnings = _a.setSortByFieldWarnings, selectedRows = _a.selectedRows, setSelectedRows = _a.setSelectedRows, checkboxColumnWidth = _a.checkboxColumnWidth, isFiltering = _a.isFiltering;
42
42
  var currentStepIndex = useImporterContext().currentStepIndex;
43
43
  var isOnSmallScreens = useWindowDimensions().isOnSmallScreens;
44
44
  var canShowCheckboxOnCheckboxRowHover = currentStepIndex === 2;
45
45
  var rowNumbersGridRef = useRef();
46
46
  var rowCheckboxesGridRef = useRef();
47
+ useEffect(function () {
48
+ if (data.length > 0 && options.withSingleRowSelect)
49
+ setSelectedRows([data === null || data === void 0 ? void 0 : data[0]._meta.id]);
50
+ }, [options.withSingleRowSelect]);
47
51
  var rowWidthScalingFactor = (function () {
48
52
  // Spreadsheet will display 6 columns on the viewport and a small portion of the
49
53
  // 7th column in the right side to let the user know they can scroll horizontally
@@ -100,6 +104,7 @@ var SpreadsheetData = function () {
100
104
  }, [dataLength]);
101
105
  var showValidationProgress = !isReadOnly && validationPercentage < 100;
102
106
  var isReviewStep = currentStepIndex === 2;
103
- return (_jsxs(S.SpreadSheetData, __assign({ h100: true, flexColumn: true }, { children: [_jsx(GlobalStyle, {}), showValidationProgress && (_jsx(Div, __assign({ h: 32 }, { children: _jsx(ValidationProgress, { totalErrors: totalErrors, validationPercentage: validationPercentage }) }))), _jsxs(S.SpreadSheetContainer, __assign({ flexColumn: true, w100: true, h100: true }, { children: [_jsx(Div, __assign({ w100: true, justifyCenter: true }, { children: isReviewStep && _jsx(TableActions, {}) })), _jsxs(S.SpreadSheetWrapper, __assign({ canShowCheckboxOnHover: !showValidationProgress && canShowCheckboxOnCheckboxRowHover, shouldShowOnlyCheckbox: !showValidationProgress && selectedRows.length > 0, dflex: true, h100: true }, { children: [(options === null || options === void 0 ? void 0 : options.showCheckboxColumn) && (_jsx(SpreadsheetRowCheckboxes, { gridRef: rowCheckboxesGridRef, height: spreadsheetHeight, firstRowIsHeader: options === null || options === void 0 ? void 0 : options.firstRowIsHeader, isLoadingData: showValidationProgress })), _jsx(S.TableView, { tableHeadersHeight: spreadsheetHeaderHeightPx, highlightFirstRow: isReadOnly, rowHeight: spreadsheetRowHeightPx, h: null, rowWidthScalingFactor: rowWidthScalingFactor, data: data, columns: columns, isLoading: isLoading, onTableScroll: onTableScroll, getItemKey: getItemKey, checkboxColumnWidth: checkboxColumnWidth, isFiltering: isFiltering })] }))] }))] })));
107
+ return (_jsxs(S.SpreadSheetData, __assign({ h100: true, flexColumn: true, className: props.className }, { children: [_jsx(GlobalStyle, {}), showValidationProgress && (_jsx(Div, __assign({ h: 32 }, { children: _jsx(ValidationProgress, { totalErrors: totalErrors, validationPercentage: validationPercentage }) }))), _jsxs(S.SpreadSheetContainer, __assign({ flexColumn: true, w100: true, h100: true }, { children: [_jsx(Div, __assign({ w100: true, justifyCenter: true }, { children: isReviewStep && _jsx(TableActions, {}) })), _jsxs(S.SpreadSheetWrapper, __assign({ canShowCheckboxOnHover: !showValidationProgress && canShowCheckboxOnCheckboxRowHover, shouldShowOnlyCheckbox: (!showValidationProgress && selectedRows.length > 0) ||
108
+ currentStepIndex === 0, dflex: true, h100: true }, { children: [(options === null || options === void 0 ? void 0 : options.showCheckboxColumn) && (_jsx(SpreadsheetRowCheckboxes, { gridRef: rowCheckboxesGridRef, height: spreadsheetHeight, isLoadingData: showValidationProgress })), _jsx(S.TableView, { tableHeadersHeight: spreadsheetHeaderHeightPx, rowHeight: spreadsheetRowHeightPx, h: null, rowWidthScalingFactor: rowWidthScalingFactor, data: data, columns: columns, isLoading: isLoading, onTableScroll: onTableScroll, getItemKey: getItemKey, checkboxColumnWidth: checkboxColumnWidth, isFiltering: isFiltering })] }))] }))] })));
104
109
  };
105
110
  export default React.memo(SpreadsheetData, areEqual);
@@ -3,8 +3,7 @@ import { DivCSSProps } from "../../../../styled/utils";
3
3
  type Props = {
4
4
  height?: number;
5
5
  gridRef: React.MutableRefObject<any>;
6
- firstRowIsHeader?: boolean;
7
6
  isLoadingData?: boolean;
8
7
  } & DivCSSProps;
9
- export declare const SpreadsheetRowCheckboxes: ({ height, gridRef, firstRowIsHeader, isLoadingData, ...props }: Props) => JSX.Element;
8
+ export declare const SpreadsheetRowCheckboxes: ({ height, gridRef, isLoadingData, ...props }: Props) => JSX.Element;
10
9
  export {};
@@ -62,27 +62,31 @@ var rowIsEmpty = function (row) {
62
62
  });
63
63
  };
64
64
  export var SpreadsheetRowCheckboxes = function (_a) {
65
- var height = _a.height, gridRef = _a.gridRef, _b = _a.firstRowIsHeader, firstRowIsHeader = _b === void 0 ? false : _b, isLoadingData = _a.isLoadingData, props = __rest(_a, ["height", "gridRef", "firstRowIsHeader", "isLoadingData"]);
66
- var _c = useSpreadsheetContext(), data = _c.data, selectedRows = _c.selectedRows, lastClickedIndexRef = _c.lastClickedIndexRef, setSelectedRows = _c.setSelectedRows, checkboxColumnWidth = _c.checkboxColumnWidth;
65
+ var height = _a.height, gridRef = _a.gridRef, isLoadingData = _a.isLoadingData, props = __rest(_a, ["height", "gridRef", "isLoadingData"]);
66
+ var _b = useSpreadsheetContext(), data = _b.data, selectedRows = _b.selectedRows, options = _b.options, lastClickedIndexRef = _b.lastClickedIndexRef, setSelectedRows = _b.setSelectedRows, checkboxColumnWidth = _b.checkboxColumnWidth;
67
67
  var currentStepIndex = useImporterContext().currentStepIndex;
68
68
  var nonEmptyRows = useMemo(function () { return data.filter(function (row) { return !rowIsEmpty(row); }); }, [
69
69
  data,
70
70
  ]);
71
71
  var isIndeterminate = selectedRows.length > 0 && selectedRows.length < nonEmptyRows.length;
72
72
  var handleRowSelect = function (checked, rowIndex, rowMetaId) {
73
+ var _a, _b;
73
74
  var lastRowMetaId = data[data.length - 1]._meta.id;
74
75
  var isLastRow = rowMetaId === lastRowMetaId;
75
76
  var isLastRowAndEmpty = isLastRow && rowIsEmpty(data[rowIndex]);
76
77
  if (isLastRowAndEmpty)
77
78
  return;
78
- // If the first row is a header, we need to adjust the rowIndex
79
- var adjustedRowIndex = firstRowIsHeader ? rowIndex - 1 : rowIndex;
79
+ if (options.withSingleRowSelect) {
80
+ if (!rowIsEmpty(data[rowIndex]))
81
+ setSelectedRows([(_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id]);
82
+ return;
83
+ }
80
84
  if (checked) {
81
- setSelectedRows(function (prev) { var _a, _b; return __spreadArray(__spreadArray([], prev, true), [(_b = (_a = data[adjustedRowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id], false); });
85
+ setSelectedRows(function (prev) { var _a, _b; return __spreadArray(__spreadArray([], prev, true), [(_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id], false); });
82
86
  }
83
87
  else {
84
88
  setSelectedRows(function (prev) {
85
- return prev.filter(function (row) { var _a, _b; return row !== ((_b = (_a = data[adjustedRowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id); });
89
+ return prev.filter(function (row) { var _a, _b; return row !== ((_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id); });
86
90
  });
87
91
  }
88
92
  lastClickedIndexRef.current = rowIndex;
@@ -144,12 +148,14 @@ export var SpreadsheetRowCheckboxes = function (_a) {
144
148
  };
145
149
  var CheckboxCell = function (_a) {
146
150
  var _b, _c;
147
- var rowIndex = _a.rowIndex, adjustedRowIndex = _a.adjustedRowIndex;
148
- var currentDataIndex = rowIndex === 0 ? 0 : adjustedRowIndex;
149
- var rowMetaId = (_c = (_b = data[currentDataIndex]) === null || _b === void 0 ? void 0 : _b._meta) === null || _c === void 0 ? void 0 : _c.id;
150
- return (_jsx(Div, __assign({ className: "checkbox-cell" }, { children: firstRowIsHeader && rowIndex === 0 ? ("") : (_jsx(Checkbox, { isChecked: rowMetaId && selectedRows.includes(rowMetaId), onChange: function (checked) {
151
+ var rowIndex = _a.rowIndex;
152
+ var rowMetaId = (_c = (_b = data[rowIndex]) === null || _b === void 0 ? void 0 : _b._meta) === null || _c === void 0 ? void 0 : _c.id;
153
+ return (_jsx(Div, __assign({ className: "checkbox-cell", "data-test-id": "checkbox-cell-".concat(rowIndex) }, { children: _jsx(Checkbox, { isChecked: rowMetaId && selectedRows.includes(rowMetaId), onChange: function (checked) {
151
154
  return !isLoadingData && handleRowSelect(checked, rowIndex, rowMetaId);
152
- }, onShiftKeyPressed: function () { return handleSelectMultipleRows(rowIndex); }, style: { cursor: "pointer" }, isDisabled: isLoadingData })) })));
155
+ }, onShiftKeyPressed: function () {
156
+ if (!options.withSingleRowSelect)
157
+ handleSelectMultipleRows(rowIndex);
158
+ }, style: { cursor: "pointer" }, isDisabled: isLoadingData }) })));
153
159
  };
154
160
  var RowNumbersCell = function (_a) {
155
161
  var rowIndex = _a.rowIndex;
@@ -157,8 +163,7 @@ export var SpreadsheetRowCheckboxes = function (_a) {
157
163
  };
158
164
  var Cell = function (_a) {
159
165
  var rowIndex = _a.rowIndex, style = _a.style;
160
- var adjustedRowIndex = firstRowIsHeader ? rowIndex - 1 : rowIndex;
161
- return (_jsxs(RowCheckbox, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: adjustedRowIndex === data.length - 1 }, { children: [_jsx(CheckboxCell, { rowIndex: rowIndex, adjustedRowIndex: adjustedRowIndex }), _jsx(RowNumbersCell, { rowIndex: rowIndex })] }), adjustedRowIndex));
166
+ return (_jsxs(RowCheckbox, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: rowIndex === data.length - 1 }, { children: [_jsx(CheckboxCell, { rowIndex: rowIndex }), _jsx(RowNumbersCell, { rowIndex: rowIndex })] }), rowIndex));
162
167
  };
163
168
  var isSelectAllRowsChekboxChecked = (selectedRows === null || selectedRows === void 0 ? void 0 : selectedRows.length) > 0 &&
164
169
  (data === null || data === void 0 ? void 0 : data.length) > 0 &&
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { SpreadsheetOptions } from "../../..";
3
3
  import { BatchValidationErrors, Field, OnValidateRecord, Record, RecordDataSet } from "../../../types";
4
- import { DeleteRecords, FilterRecordsByError, FilterRecordsBySearchValue } from "../../../common/Table/TableActions/hooks";
4
+ import { DeleteRecords } from "../../../common/Table/TableActions/hooks";
5
5
  type UseValidationStateArgs = {
6
6
  onValidateRecord?: OnValidateRecord;
7
7
  setDataSet: React.Dispatch<React.SetStateAction<RecordDataSet>>;
@@ -28,8 +28,6 @@ export type ValidationState = {
28
28
  };
29
29
  type UseValidationStateReturnValue = ValidationState & {
30
30
  deleteRecords: DeleteRecords;
31
- filterRecordsBySearchValue: FilterRecordsBySearchValue;
32
- filterRecordsByError: FilterRecordsByError;
33
31
  updateRecordAndRevalidate: (record: Record) => Promise<void>;
34
32
  };
35
33
  export declare const useValidationState: ({ initialDataSet, dataSet, fields, options, isReadOnly, setDataSet, setIsLoading, onValidateRecord, }: UseValidationStateArgs) => UseValidationStateReturnValue;
@@ -61,7 +61,11 @@ export var useValidationState = function (_a) {
61
61
  var _c = useState({}), warnings = _c[0], setWarnings = _c[1];
62
62
  var _d = useState(0), validationPercentage = _d[0], setValidationPercentage = _d[1];
63
63
  var validatorsCache = useMemo(function () { return selectValidatorsFor(fields); }, [fields]);
64
- var _e = useTableActions({ setDataSet: setDataSet, setErrors: setErrors, setWarnings: setWarnings }), deleteRecords = _e.deleteRecords, filterRecordsByError = _e.filterRecordsByError, filterRecordsBySearchValue = _e.filterRecordsBySearchValue;
64
+ var deleteRecords = useTableActions({
65
+ setDataSet: setDataSet,
66
+ setErrors: setErrors,
67
+ setWarnings: setWarnings,
68
+ }).deleteRecords;
65
69
  // Validate record and update dataSet
66
70
  var updateRecordAndRevalidate = useCallback(function (record) { return __awaiter(void 0, void 0, void 0, function () {
67
71
  var recordId, newDataSet, data, _a, recordErrors, recordWarnings, hasError, hasWarning;
@@ -71,6 +75,8 @@ export var useValidationState = function (_a) {
71
75
  case 0:
72
76
  recordId = record._meta.id;
73
77
  newDataSet = __assign(__assign({}, dataSet), (_b = {}, _b[recordId] = __assign({}, record), _b));
78
+ // 'touched' should be set before validation
79
+ newDataSet[recordId]._meta.touched = true;
74
80
  data = Object.values(newDataSet);
75
81
  return [4 /*yield*/, validateRecord({
76
82
  validatorsCache: validatorsCache,
@@ -85,7 +91,6 @@ export var useValidationState = function (_a) {
85
91
  hasWarning = checkIfHasErrors(recordWarnings);
86
92
  newDataSet[recordId]._meta.isInvalid = hasError;
87
93
  newDataSet[recordId]._meta.hasWarning = hasWarning;
88
- newDataSet[recordId]._meta.touched = true;
89
94
  setErrors(function (errors) {
90
95
  var newErrors = __assign({}, errors);
91
96
  var newState = hasError
@@ -225,7 +230,5 @@ export var useValidationState = function (_a) {
225
230
  isValid: isValid,
226
231
  updateRecordAndRevalidate: updateRecordAndRevalidate,
227
232
  deleteRecords: deleteRecords,
228
- filterRecordsBySearchValue: filterRecordsBySearchValue,
229
- filterRecordsByError: filterRecordsByError,
230
233
  };
231
234
  };
@@ -118,7 +118,7 @@ var SpreadsheetWrapper = function (_a) {
118
118
  };
119
119
  var Spreadsheet = function (props) {
120
120
  var getDefaultSortCompareFn = useFieldSorting().getDefaultSortCompareFn;
121
- return (_jsx(SpreadsheetContextProvider, __assign({}, props, { getSortCompareFn: getDefaultSortCompareFn }, { children: _jsx(SpreadsheetData, {}) })));
121
+ return (_jsx(SpreadsheetContextProvider, __assign({}, props, { getSortCompareFn: getDefaultSortCompareFn }, { children: _jsx(SpreadsheetData, { className: props.className }) })));
122
122
  };
123
123
  export default React.memo(SpreadsheetWrapper, areEqual);
124
124
  export * from "./SpreadsheetContextProvider";
@@ -6,5 +6,5 @@ interface SpreadSheetWrapperProps {
6
6
  export declare const SpreadSheetData: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps, never>;
7
7
  export declare const SpreadSheetWrapper: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps & SpreadSheetWrapperProps, never>;
8
8
  export declare const SpreadSheetContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps, never>;
9
- export declare const TableView: import("styled-components").StyledComponent<import("react").MemoExoticComponent<({ data, columns, pageSize, onRowClick, sortBy, isLoading, highlightFirstRow, setSortBy, rowWidthScalingFactor, onSectionRendered, tableHeadersHeight, rowHeight, h, onTableScroll, getItemKey, isDraggable, checkboxColumnWidth, isFiltering, ...props }: import("../../../common/Table/TableView/types").TableViewProps) => JSX.Element>, import("styled-components").DefaultTheme, {}, never>;
9
+ export declare const TableView: import("styled-components").StyledComponent<import("react").MemoExoticComponent<({ data, columns, pageSize, onRowClick, sortBy, isLoading, setSortBy, rowWidthScalingFactor, onSectionRendered, tableHeadersHeight, rowHeight, h, onTableScroll, getItemKey, isDraggable, checkboxColumnWidth, isFiltering, ...props }: import("../../../common/Table/TableView/types").TableViewProps) => JSX.Element>, import("styled-components").DefaultTheme, {}, never>;
10
10
  export {};
@@ -0,0 +1,7 @@
1
+ import { Field, Record } from "../../../../types";
2
+ type TransformRecordArgs = {
3
+ record: Record;
4
+ fields: Field[];
5
+ };
6
+ export declare function transformRecord({ record, fields }: TransformRecordArgs): void;
7
+ export {};
@@ -0,0 +1,25 @@
1
+ import { fieldTransformations } from "./transformators";
2
+ var runTransformation = function (record, transformation, field) {
3
+ var transformationType = transformation.transformation_type;
4
+ var transformerFunction = fieldTransformations[transformationType];
5
+ return transformerFunction(record, transformation, field);
6
+ };
7
+ export function transformRecord(_a) {
8
+ var record = _a.record, fields = _a.fields;
9
+ for (var key in fields) {
10
+ var currentField = fields[key];
11
+ var fieldTransformations_1 = currentField === null || currentField === void 0 ? void 0 : currentField.transformations;
12
+ var fieldToBeTransformed = record === null || record === void 0 ? void 0 : record[currentField === null || currentField === void 0 ? void 0 : currentField.name];
13
+ if (!fieldTransformations_1 ||
14
+ (fieldTransformations_1 === null || fieldTransformations_1 === void 0 ? void 0 : fieldTransformations_1.length) === 0 ||
15
+ !fieldToBeTransformed) {
16
+ continue;
17
+ }
18
+ var transformedField = fieldToBeTransformed;
19
+ for (var i = 0; i < fieldTransformations_1.length; i++) {
20
+ var currentTransformation = fieldTransformations_1[i];
21
+ transformedField = runTransformation(transformedField, currentTransformation, currentField);
22
+ }
23
+ record[currentField.name] = transformedField;
24
+ }
25
+ }
@@ -0,0 +1,8 @@
1
+ import { Field, FieldTransformation } from "../../../../types";
2
+ export type FieldValidator = (fieldValue: any, transformation?: FieldTransformation, fieldOptions?: Field) => null | any;
3
+ export type FieldTransformations = Partial<{
4
+ [key: string]: FieldValidator;
5
+ }>;
6
+ export declare const fieldTransformations: {
7
+ [x: string]: FieldValidator;
8
+ };
@@ -0,0 +1,106 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { DateTime } from "luxon";
13
+ var stringFieldTransformations = {
14
+ sentence_case: function (fieldValue) {
15
+ var _a, _b;
16
+ if (typeof fieldValue !== "string")
17
+ return fieldValue;
18
+ return (((_b = (_a = fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.toLowerCase()) === null || _a === void 0 ? void 0 : _a.charAt(0)) === null || _b === void 0 ? void 0 : _b.toUpperCase()) +
19
+ (fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.slice(1).toLowerCase()));
20
+ },
21
+ capitalize: function (fieldValue) {
22
+ var _a;
23
+ if (typeof fieldValue !== "string")
24
+ return fieldValue;
25
+ return ((_a = fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.charAt(0)) === null || _a === void 0 ? void 0 : _a.toUpperCase()) + (fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.slice(1));
26
+ },
27
+ uppercase: function (fieldValue) {
28
+ if (typeof fieldValue !== "string")
29
+ return fieldValue;
30
+ return fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.toUpperCase();
31
+ },
32
+ lowercase: function (fieldValue) {
33
+ if (typeof fieldValue !== "string")
34
+ return fieldValue;
35
+ return fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.toLowerCase();
36
+ },
37
+ trim_whitespace: function (fieldValue) {
38
+ if (typeof fieldValue !== "string")
39
+ return fieldValue;
40
+ return fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.trim();
41
+ },
42
+ };
43
+ var datesDateTimesAndTimesTransformations = {
44
+ autoformat: function (fieldValue, _, fieldOptions) {
45
+ var JSDate = new Date(fieldValue);
46
+ if (!fieldValue || isNaN(JSDate.getTime())) {
47
+ return fieldValue;
48
+ }
49
+ var luxonDate = DateTime.fromJSDate(JSDate);
50
+ return luxonDate.toFormat(fieldOptions.pattern);
51
+ },
52
+ };
53
+ var urlTransformations = {
54
+ prefix: function (fieldValue, transformation) {
55
+ var _a;
56
+ var prefixValue = (_a = transformation === null || transformation === void 0 ? void 0 : transformation.options) === null || _a === void 0 ? void 0 : _a.prefix;
57
+ if (!prefixValue)
58
+ return fieldValue;
59
+ return "".concat(prefixValue).concat(fieldValue);
60
+ },
61
+ };
62
+ var floatTransformations = {
63
+ number_of_decimals: function (fieldValue, transformation) {
64
+ var _a;
65
+ var numberOfDecimalsValue = Number((_a = transformation === null || transformation === void 0 ? void 0 : transformation.options) === null || _a === void 0 ? void 0 : _a.number_of_decimals);
66
+ if (isNaN(numberOfDecimalsValue) || isNaN(fieldValue))
67
+ return fieldValue;
68
+ return Number(fieldValue.toFixed(numberOfDecimalsValue));
69
+ },
70
+ };
71
+ var integerTransformations = {
72
+ round: function (fieldValue) {
73
+ if (isNaN(fieldValue))
74
+ return fieldValue;
75
+ return Math.round(fieldValue);
76
+ },
77
+ floor: function (fieldValue) {
78
+ if (isNaN(fieldValue))
79
+ return fieldValue;
80
+ return Math.floor(fieldValue);
81
+ },
82
+ ceiling: function (fieldValue) {
83
+ if (isNaN(fieldValue))
84
+ return fieldValue;
85
+ return Math.ceil(fieldValue);
86
+ },
87
+ };
88
+ var enumTransformations = {
89
+ autodetect: function (fieldValue, _, fieldOptions) {
90
+ var options = fieldOptions.options.map(function (option) {
91
+ return option.toLowerCase();
92
+ });
93
+ if (!fieldValue || options.length === 0)
94
+ return fieldValue;
95
+ var parsedRecord = String(fieldValue).toLowerCase();
96
+ var trueOptionIndex = options.findIndex(function (option) { return option === "true" || option === "1"; });
97
+ var falseOptionIndex = options.findIndex(function (option) { return option === "false" || option === "0"; });
98
+ if (trueOptionIndex !== -1 && falseOptionIndex !== -1) {
99
+ return parsedRecord === options[trueOptionIndex]
100
+ ? fieldOptions.options[trueOptionIndex]
101
+ : fieldOptions.options[falseOptionIndex];
102
+ }
103
+ return fieldOptions.options[0];
104
+ },
105
+ };
106
+ export var fieldTransformations = __assign(__assign(__assign(__assign(__assign(__assign({}, stringFieldTransformations), datesDateTimesAndTimesTransformations), urlTransformations), floatTransformations), integerTransformations), enumTransformations);
@@ -1,6 +1,6 @@
1
1
  import Fuse from "fuse.js";
2
2
  import React from "react";
3
- import { FormatRecord, ImporterOptions, Integration, OnSubmit, OnValidateRecord, TemplateHeader } from "../../types";
3
+ import { FormatRecord, ImporterOptions, Integration, OnSubmit, OnValidateRecord, Record, TemplateHeader } from "../../types";
4
4
  import { FuseApi } from "../common/FuseApi";
5
5
  export declare const fusejsOptions: Fuse.IFuseOptions<string>;
6
6
  export type HeaderMatchings = {
@@ -22,6 +22,7 @@ export type State = {
22
22
  currentStepIndex: number;
23
23
  templateError: string | null;
24
24
  uploadedData: any[];
25
+ initialRecords: Record[];
25
26
  enumFieldValueMatchings: EnumFieldValueMatchings;
26
27
  templateHeaders: TemplateHeader[];
27
28
  templateHeaderMatchings: HeaderMatchings;
@@ -38,6 +39,8 @@ export type State = {
38
39
  logoURL: string;
39
40
  integrations: Integration[];
40
41
  onSubmit: OnSubmit;
42
+ headerRowIndex: number;
43
+ setHeaderRowIndex: React.Dispatch<React.SetStateAction<number>>;
41
44
  resetImport: () => void;
42
45
  onClose: () => void;
43
46
  setCurrentStepIndex: React.Dispatch<number>;
@@ -57,6 +60,7 @@ export type State = {
57
60
  export type Props = {
58
61
  templateSlug: string;
59
62
  apiToken: string;
63
+ initialRecords?: Record[];
60
64
  options: ImporterOptions;
61
65
  children: JSX.Element;
62
66
  onClose: () => void;
@@ -65,5 +69,5 @@ export type Props = {
65
69
  onValidateRecord?: OnValidateRecord;
66
70
  dynamicColumns: TemplateHeader[] | null;
67
71
  };
68
- export declare const ImporterContextProvider: ({ templateSlug, apiToken, children, options, onSubmit, onClose, formatRecord, onValidateRecord, dynamicColumns, }: Props) => JSX.Element;
72
+ export declare const ImporterContextProvider: ({ templateSlug, initialRecords, apiToken, children, options, onSubmit, onClose, formatRecord, onValidateRecord, dynamicColumns, }: Props) => JSX.Element;
69
73
  export declare const useImporterContext: () => State;
@@ -67,8 +67,8 @@ export var fusejsOptions = {
67
67
  };
68
68
  var ImporterContext = createContext({});
69
69
  export var ImporterContextProvider = function (_a) {
70
- var templateSlug = _a.templateSlug, apiToken = _a.apiToken, children = _a.children, options = _a.options, onSubmit = _a.onSubmit, onClose = _a.onClose, formatRecord = _a.formatRecord, onValidateRecord = _a.onValidateRecord, dynamicColumns = _a.dynamicColumns;
71
- var _b = useState(0), currentStepIndex = _b[0], setCurrentStepIndex = _b[1];
70
+ var templateSlug = _a.templateSlug, initialRecords = _a.initialRecords, apiToken = _a.apiToken, children = _a.children, options = _a.options, onSubmit = _a.onSubmit, onClose = _a.onClose, formatRecord = _a.formatRecord, onValidateRecord = _a.onValidateRecord, dynamicColumns = _a.dynamicColumns;
71
+ var _b = useState(initialRecords ? 2 : 0), currentStepIndex = _b[0], setCurrentStepIndex = _b[1];
72
72
  var _c = useState(0), matcherSubstep = _c[0], setMatcherSubstep = _c[1];
73
73
  var _d = useState(null), templateError = _d[0], setTemplateError = _d[1];
74
74
  var _e = useState(null), templateHeaders = _e[0], setTemplateHeaders = _e[1];
@@ -85,6 +85,7 @@ export var ImporterContextProvider = function (_a) {
85
85
  var _o = useState(null), uploadedDataEnumFieldValues = _o[0], setUploadedDataEnumFieldValues = _o[1];
86
86
  var _p = useState([]), selectedRows = _p[0], setSelectedRows = _p[1];
87
87
  var isUsingManualImport = useRef(false);
88
+ var _q = useState(0), headerRowIndex = _q[0], setHeaderRowIndex = _q[1];
88
89
  var fuseApi = useMemo(function () { return new FuseApi(options.env, apiToken); }, [
89
90
  options.env,
90
91
  apiToken,
@@ -99,12 +100,27 @@ export var ImporterContextProvider = function (_a) {
99
100
  return acc;
100
101
  }, []);
101
102
  }
102
- return (_a = uploadedData[0]) === null || _a === void 0 ? void 0 : _a.map(function (ud) {
103
+ return (_a = uploadedData[headerRowIndex]) === null || _a === void 0 ? void 0 : _a.map(function (ud) {
103
104
  return typeof ud === "number" ? ud.toString() : ud;
104
105
  });
105
- }, [uploadedData]);
106
+ }, [uploadedData, headerRowIndex]);
106
107
  useEffect(function () {
107
- if (!templateHeaderMatchings)
108
+ var setHeadersFromDataset = function () {
109
+ var _templateHeaderMatchings = {};
110
+ var fuse = new Fuse(uploadedDataHeaders, fusejsOptions);
111
+ templateHeaders.forEach(function (templateHeader, _index) {
112
+ var _a;
113
+ var fuseResults = fuse.search(templateHeader.label);
114
+ _templateHeaderMatchings[templateHeader.label] = (_a = fuseResults[0]) === null || _a === void 0 ? void 0 : _a.item;
115
+ });
116
+ setTemplateHeaderMatchings(_templateHeaderMatchings);
117
+ };
118
+ if (uploadedDataHeaders) {
119
+ setHeadersFromDataset();
120
+ }
121
+ }, [uploadedDataHeaders]);
122
+ useEffect(function () {
123
+ if (!templateHeaderMatchings || !uploadedDataHeaders)
108
124
  return;
109
125
  var _uploadedDataEnumFieldValues = {};
110
126
  var templateLabels = Object.keys(templateHeaderMatchings);
@@ -117,7 +133,7 @@ export var ImporterContextProvider = function (_a) {
117
133
  var columnIndex = uploadedDataHeaders.indexOf(uploadedDataHeader);
118
134
  if (columnIndex === -1)
119
135
  return;
120
- uploadedData.slice(1).forEach(function (row) {
136
+ uploadedData === null || uploadedData === void 0 ? void 0 : uploadedData.slice(headerRowIndex + 1).forEach(function (row) {
121
137
  var uploadedValue = row[columnIndex];
122
138
  enumFieldValues.add(uploadedValue);
123
139
  });
@@ -126,12 +142,7 @@ export var ImporterContextProvider = function (_a) {
126
142
  });
127
143
  });
128
144
  setUploadedDataEnumFieldValues(_uploadedDataEnumFieldValues);
129
- }, [templateHeaderMatchings]);
130
- useEffect(function () {
131
- if (uploadedData) {
132
- setHeadersFromDataset();
133
- }
134
- }, [uploadedData]);
145
+ }, [templateHeaderMatchings, uploadedDataHeaders]);
135
146
  useEffect(function () {
136
147
  (function () { return __awaiter(void 0, void 0, void 0, function () {
137
148
  var _a, organization_1, columns_1, importer_style_preferences, integrations_1, preview_first_time, error_1, errorMsg;
@@ -191,18 +202,9 @@ export var ImporterContextProvider = function (_a) {
191
202
  setCurrentStepIndex(2);
192
203
  }
193
204
  };
194
- var setHeadersFromDataset = function () {
195
- var _templateHeaderMatchings = {};
196
- var fuse = new Fuse(uploadedDataHeaders, fusejsOptions);
197
- templateHeaders.forEach(function (templateHeader, _index) {
198
- var _a;
199
- var fuseResults = fuse.search(templateHeader.label);
200
- _templateHeaderMatchings[templateHeader.label] = (_a = fuseResults[0]) === null || _a === void 0 ? void 0 : _a.item;
201
- });
202
- setTemplateHeaderMatchings(_templateHeaderMatchings);
203
- };
204
205
  var inTrialMode = organization === null || organization === void 0 ? void 0 : organization.trial_mode;
205
206
  var value = {
207
+ initialRecords: initialRecords,
206
208
  currentStepIndex: currentStepIndex,
207
209
  templateHeaders: templateHeaders,
208
210
  enumFieldValueMatchings: enumFieldValueMatchings,
@@ -221,6 +223,8 @@ export var ImporterContextProvider = function (_a) {
221
223
  logoURL: style.logoURL,
222
224
  integrations: integrations,
223
225
  previewFirstTime: previewFirstTime,
226
+ headerRowIndex: headerRowIndex,
227
+ setHeaderRowIndex: setHeaderRowIndex,
224
228
  setUploadedData: setUploadedData,
225
229
  formatRecord: formatRecord,
226
230
  setCurrentStepIndex: setCurrentStepIndex,
@@ -1,11 +1,11 @@
1
1
  import { Field, FieldTypes, FormatRecord, Record, RecordDataSet, TemplateHeader } from "../../types";
2
2
  import { EnumFieldValueMatchings, HeaderMatchings } from "../contexts/ImporterContextProvider";
3
- export declare const addEmptyRows: (data: Record[], fields: Field[]) => {
3
+ export declare const addEmptyRows: (data: Record[], fields: Field[]) => (Record | {
4
4
  _meta: {
5
5
  id: string;
6
6
  rowIndex: number;
7
7
  };
8
- }[];
8
+ })[];
9
9
  export declare const addMeta: (record: any, index: number, uploadedRow?: any) => Record;
10
10
  export declare const recordListToDataSet: (data: Record[], fields: Field[]) => RecordDataSet;
11
11
  type transformToRecordsArgs = {
@@ -16,6 +16,7 @@ type transformToRecordsArgs = {
16
16
  templateHeaders: TemplateHeader[];
17
17
  formatRecord: FormatRecord;
18
18
  };
19
+ export declare const transformToRecords: ({ templateHeaderMatchings, enumFieldValueMatchings, templateHeaders, uploadedDataHeaders, uploadedData, formatRecord, }: transformToRecordsArgs) => Record[];
19
20
  export declare const getPreviewDataSet: ({ uploadedData, }: {
20
21
  uploadedData: any[];
21
22
  }) => {
@@ -27,8 +28,23 @@ export declare const getPreviewDataSet: ({ uploadedData, }: {
27
28
  }[];
28
29
  initialDataSet: RecordDataSet;
29
30
  };
30
- export declare const getReviewDataSet: ({ templateHeaderMatchings, enumFieldValueMatchings, templateHeaders, uploadedDataHeaders, uploadedData, formatRecord, }: transformToRecordsArgs) => {
31
+ export declare const getTemplateFields: ({ templateHeaders, }: {
32
+ templateHeaders: TemplateHeader[];
33
+ }) => {
34
+ label: string;
35
+ name: string;
36
+ type: any;
37
+ isRequired: boolean;
38
+ options: string[];
39
+ pattern: string;
40
+ validations: import("../../types").FieldValidation[];
41
+ transformations: import("../../types").FieldTransformation[];
42
+ }[];
43
+ type GetReviewDataSetArgs = {
44
+ records: Record[];
31
45
  fields: Field[];
46
+ };
47
+ export declare const getReviewDataSet: ({ records, fields }: GetReviewDataSetArgs) => {
32
48
  initialDataSet: {
33
49
  [x: string]: Record;
34
50
  };