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.
- package/lib/esm/Importer/ImporterWithContext.js +13 -11
- package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +3 -2
- package/lib/esm/Importer/Review/ReviewContextProvider.js +20 -20
- package/lib/esm/Importer/Stepper/index.js +14 -13
- package/lib/esm/Importer/Uploader/HeadersPreview.js +16 -8
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +67 -0
- package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.d.ts → SpreadsheetContextProvider/index.d.ts} +12 -8
- package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.js → SpreadsheetContextProvider/index.js} +23 -17
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.d.ts +14 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.js +45 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.d.ts +2 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +14 -0
- package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -2
- package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +5 -2
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.d.ts +2 -1
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +9 -4
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.d.ts +1 -2
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +18 -13
- package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +1 -3
- package/lib/esm/Importer/common/Spreadsheet/hooks.js +7 -4
- package/lib/esm/Importer/common/Spreadsheet/index.js +1 -1
- package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -1
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +7 -0
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +25 -0
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -0
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +106 -0
- package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +6 -2
- package/lib/esm/Importer/contexts/ImporterContextProvider.js +26 -22
- package/lib/esm/Importer/data/index.d.ts +19 -3
- package/lib/esm/Importer/data/index.js +27 -30
- package/lib/esm/Importer/index.js +1 -1
- package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +9 -5
- package/lib/esm/common/Table/TableActions/RowFilters.d.ts +1 -0
- package/lib/esm/common/Table/TableActions/RowFilters.js +42 -0
- package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
- package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -2
- package/lib/esm/common/Table/TableActions/hooks.js +0 -39
- package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +2 -2
- package/lib/esm/common/Table/TableView/TableRows/TableRow.js +4 -4
- package/lib/esm/common/Table/TableView/TableRows/index.js +7 -4
- package/lib/esm/common/Table/TableView/index.d.ts +1 -1
- package/lib/esm/common/Table/TableView/index.js +1 -2
- package/lib/esm/common/Table/TableView/types.d.ts +0 -1
- package/lib/esm/common/columnsTransformations.d.ts +15 -0
- package/lib/esm/common/columnsTransformations.js +92 -0
- package/lib/esm/common/columnsValidations.js +83 -3
- package/lib/esm/common/index.d.ts +1 -0
- package/lib/esm/common/index.js +1 -0
- package/lib/esm/common/inputs/Autocomplete.js +1 -1
- package/lib/esm/common/inputs/Checkbox.js +1 -1
- package/lib/esm/index.d.ts +2 -1
- package/lib/esm/index.js +3 -0
- package/lib/esm/locales/de.d.ts +5 -0
- package/lib/esm/locales/de.js +6 -1
- package/lib/esm/locales/en.d.ts +5 -0
- package/lib/esm/locales/en.js +6 -1
- package/lib/esm/locales/es.d.ts +5 -0
- package/lib/esm/locales/es.js +6 -1
- package/lib/esm/locales/fr.d.ts +5 -0
- package/lib/esm/locales/fr.js +6 -1
- package/lib/esm/types.d.ts +33 -2
- package/lib/esm/types.js +15 -0
- package/lib/main.js +24 -24
- 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
|
|
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,
|
|
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,
|
|
66
|
-
var
|
|
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
|
-
|
|
79
|
-
|
|
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[
|
|
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[
|
|
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
|
|
148
|
-
var
|
|
149
|
-
|
|
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 () {
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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,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[
|
|
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
|
-
|
|
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
|
|
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
|
};
|