fuse-importer 0.1.2-testing → 0.1.4-testing
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.d.ts +2 -0
- package/lib/esm/Importer/ImporterWithContext.js +12 -8
- package/lib/esm/Importer/Matcher/index.js +0 -11
- package/lib/esm/Importer/Review/ReviewContextProvider.js +55 -14
- package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +7 -4
- package/lib/esm/Importer/Stepper/index.js +61 -2
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +19 -11
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +2 -9
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +2 -3
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +66 -15
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.d.ts +1 -1
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.d.ts +1 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +7 -0
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +2 -2
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +1 -7
- package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +1 -1
- package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +16 -15
- package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +1 -2
- package/lib/esm/Importer/common/Spreadsheet/hooks.js +21 -39
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +1 -25
- package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +3 -3
- package/lib/esm/Importer/contexts/ImporterContextProvider.js +31 -20
- package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +81 -31
- package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +9 -1
- package/lib/esm/common/Table/TableActions/RowFilters.js +10 -6
- package/lib/esm/common/columnsTransformations.js +0 -8
- package/lib/esm/common/datePatterns.js +10 -10
- package/lib/esm/common/inputs/SelectMenu.js +6 -2
- package/lib/esm/common/inputs/TextInput.js +1 -1
- package/lib/esm/locales/de.d.ts +2 -1
- package/lib/esm/locales/de.js +2 -1
- package/lib/esm/locales/en.d.ts +2 -1
- package/lib/esm/locales/en.js +2 -1
- package/lib/esm/locales/es.d.ts +2 -1
- package/lib/esm/locales/es.js +2 -1
- package/lib/esm/locales/fr.d.ts +2 -1
- package/lib/esm/locales/fr.js +2 -1
- package/lib/esm/types.d.ts +17 -5
- package/lib/esm/types.js +0 -1
- package/lib/main.js +24 -24
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
type LayoutProps = {
|
|
2
2
|
zIndex: number;
|
|
3
|
+
isModal?: boolean;
|
|
3
4
|
};
|
|
4
5
|
export declare const Layout: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../styled").CSSProps & LayoutProps, never>;
|
|
6
|
+
export declare const Backdrop: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|
|
5
7
|
export declare const ImporterWithContext: () => JSX.Element;
|
|
6
8
|
export {};
|
|
@@ -32,17 +32,21 @@ import { Footer } from "./common/Footer";
|
|
|
32
32
|
import { GlobalStyle } from "./common/GlobalStyle";
|
|
33
33
|
import { ImporterFonts } from "./common/ImporterFonts";
|
|
34
34
|
import { useImporterContext } from "./contexts/ImporterContextProvider";
|
|
35
|
-
import { AppLoadingContextProvider } from "../common/AppLoadingContextProvider";
|
|
36
|
-
export var Layout = styled(Div)(
|
|
35
|
+
import { AppLoadingContextProvider, } from "../common/AppLoadingContextProvider";
|
|
36
|
+
export var Layout = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background: ", ";\n display: flex;\n flex-direction: column;\n position: fixed;\n z-index: ", ";\n ", ";\n ", "\n"], ["\n background: ", ";\n display: flex;\n flex-direction: column;\n position: fixed;\n z-index: ", ";\n ", ";\n ", "\n"])), function (_a) {
|
|
37
37
|
var theme = _a.theme;
|
|
38
38
|
return theme.colors.backgroundInterface;
|
|
39
|
-
}, function (p) { return p.zIndex; }, function (p) { return p.theme.css.scrollbarDark; })
|
|
40
|
-
|
|
39
|
+
}, function (p) { return p.zIndex; }, function (p) { return p.theme.css.scrollbarDark; }, function (p) {
|
|
40
|
+
return p.isModal
|
|
41
|
+
? css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n top: 27px;\n bottom: 27px;\n left: 29px;\n right: 29px;\n border-radius: 4px;\n overflow: hidden;\n "], ["\n top: 27px;\n bottom: 27px;\n left: 29px;\n right: 29px;\n border-radius: 4px;\n overflow: hidden;\n "]))) : css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n height: 100vh;\n width: 100vw;\n top: 0;\n left: 0;\n overflow-y: auto;\n "], ["\n height: 100vh;\n width: 100vw;\n top: 0;\n left: 0;\n overflow-y: auto;\n "])));
|
|
42
|
+
});
|
|
43
|
+
export var Backdrop = styled.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n background: rgba(0, 0, 0, 0.75); // Opaque black\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: -1;\n"], ["\n background: rgba(0, 0, 0, 0.75); // Opaque black\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: -1;\n"])));
|
|
44
|
+
var Content = styled(Div)(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), function (_a) {
|
|
41
45
|
var colors = _a.theme.colors, inTrialMode = _a.inTrialMode;
|
|
42
|
-
return css(
|
|
46
|
+
return css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n background-color: ", ";\n flex: ", ";\n "], ["\n background-color: ", ";\n flex: ", ";\n "])), colors.backgroundInterface, inTrialMode ? "none" : 1);
|
|
43
47
|
});
|
|
44
48
|
export var ImporterWithContext = function () {
|
|
45
|
-
var _a = useImporterContext(), inTrialMode = _a.inTrialMode, currentStepIndex = _a.currentStepIndex, matcherSubstep = _a.matcherSubstep, templateHeaders = _a.templateHeaders, theme = _a.theme, logoURL = _a.logoURL, previewFirstTime = _a.previewFirstTime, initialRecords = _a.initialRecords, _b = _a.importerOptions, zIndex = _b.zIndex, previewMode = _b.previewMode;
|
|
49
|
+
var _a = useImporterContext(), inTrialMode = _a.inTrialMode, currentStepIndex = _a.currentStepIndex, matcherSubstep = _a.matcherSubstep, templateHeaders = _a.templateHeaders, theme = _a.theme, logoURL = _a.logoURL, previewFirstTime = _a.previewFirstTime, initialRecords = _a.initialRecords, _b = _a.importerOptions, zIndex = _b.zIndex, previewMode = _b.previewMode, isModal = _b.modal;
|
|
46
50
|
var layoutRef = useRef(null);
|
|
47
51
|
var t = useTranslation().t;
|
|
48
52
|
useEffect(function () {
|
|
@@ -58,6 +62,6 @@ export var ImporterWithContext = function () {
|
|
|
58
62
|
return (_jsxs(_Fragment, { children: [_jsxs(Div, { children: [previewMode && _jsx(PreviewModeBanner, {}), !previewMode && _jsx(TrialModeBanner, {}), _jsx(Stepper, { stepLabels: stepLabels, logoURL: logoURL })] }), _jsxs(Content, { children: [currentStepIndex === 0 && _jsx(Uploader, {}), currentStepIndex === 1 && _jsx(Matcher, {}), currentStepIndex === 2 && templateHeaders && _jsx(Review, {})] }), inTrialMode && (_jsx(Content, __assign({ inTrialMode: inTrialMode }, { children: _jsx(Footer, {}) })))] }));
|
|
59
63
|
}
|
|
60
64
|
var shouldShowPreviewFirstTime = previewFirstTime && previewMode;
|
|
61
|
-
return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsxs(AppLoadingContextProvider, { children: [_jsx(Toast, {}), _jsx(GlobalStyle, {}), _jsx(ImporterFonts, {}), templateHeaders ? (_jsx(ReviewContextProvider, __assign({ initialRecords: initialRecords }, { children: _jsx(Layout, __assign({ zIndex: zIndex, ref: layoutRef }, { children: shouldShowPreviewFirstTime ? (_jsx(PreviewFirstTime, {})) : (renderContent()) })) }))) : (_jsx(AppLoading, {}))] }) })));
|
|
65
|
+
return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsxs(AppLoadingContextProvider, { children: [_jsx(Toast, {}), _jsx(GlobalStyle, {}), _jsx(ImporterFonts, {}), templateHeaders ? (_jsx(ReviewContextProvider, __assign({ initialRecords: initialRecords }, { children: _jsxs(_Fragment, { children: [isModal && _jsx(Backdrop, {}), _jsx(Layout, __assign({ zIndex: zIndex, ref: layoutRef, isModal: isModal }, { children: shouldShowPreviewFirstTime ? (_jsx(PreviewFirstTime, {})) : (renderContent()) }))] }) }))) : (_jsx(AppLoading, {}))] }) })));
|
|
62
66
|
};
|
|
63
|
-
var templateObject_1, templateObject_2, templateObject_3;
|
|
67
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;
|
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
2
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
3
|
-
return cooked;
|
|
4
|
-
};
|
|
5
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
2
|
import React from "react";
|
|
7
|
-
import styled, { css } from "styled-components";
|
|
8
|
-
import { Div } from "../../styled/utils";
|
|
9
3
|
import { useImporterContext } from "../contexts/ImporterContextProvider";
|
|
10
4
|
import { HeaderMatcher } from "./HeaderMatcher";
|
|
11
5
|
import { EnumFieldsMatchers } from "./EnumFieldsMatchers";
|
|
12
6
|
import { areEqual } from "react-window";
|
|
13
|
-
var Dot = styled(Div)(function (_a) {
|
|
14
|
-
var colors = _a.theme.colors, isSelected = _a.isSelected;
|
|
15
|
-
return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n height: 8px;\n width: 8px;\n border-radius: 100%;\n background: ", ";\n ", "\n "], ["\n height: 8px;\n width: 8px;\n border-radius: 100%;\n background: ", ";\n ", "\n "])), colors.outlineInputs, isSelected && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n height: 12px;\n width: 12px;\n background: ", ";\n "], ["\n height: 12px;\n width: 12px;\n background: ", ";\n "])), colors.highlight01));
|
|
16
|
-
});
|
|
17
7
|
var Matcher = function () {
|
|
18
8
|
var matcherSubstep = useImporterContext().matcherSubstep;
|
|
19
9
|
return (_jsxs(_Fragment, { children: [matcherSubstep === 0 && _jsx(HeaderMatcher, {}), matcherSubstep === 1 && _jsx(EnumFieldsMatchers, {})] }));
|
|
20
10
|
};
|
|
21
11
|
export default React.memo(Matcher, areEqual);
|
|
22
|
-
var templateObject_1, templateObject_2;
|
|
@@ -71,7 +71,7 @@ import Papa from "papaparse";
|
|
|
71
71
|
import { AppLoading } from "../common/AppLoading";
|
|
72
72
|
import { isRecordEmpty } from "../common/Spreadsheet/common";
|
|
73
73
|
import { sendRecordsToIntegrations } from "../common/utils";
|
|
74
|
-
import { useImporterContext } from "../contexts/ImporterContextProvider";
|
|
74
|
+
import { useImporterContext, } from "../contexts/ImporterContextProvider";
|
|
75
75
|
import { transformToRecords } from "../data/index";
|
|
76
76
|
import { getPreviewDataSet, getReviewDataSet, getTemplateFields, recordListToDataSet, } from "../data";
|
|
77
77
|
import { useAppLoadingContext } from "../../common/AppLoadingContextProvider";
|
|
@@ -98,6 +98,41 @@ var trackImportedRowsCount = function (fuseApi, templateSlug, rowCount) { return
|
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
100
|
}); };
|
|
101
|
+
var buildColumnMappingsFromHeaderMatchings = function (templateHeaders, templateHeaderMatchings, columnMappingsAttributes) {
|
|
102
|
+
return templateHeaders.map(function (column) {
|
|
103
|
+
var existingMatching = columnMappingsAttributes.find(function (matching) {
|
|
104
|
+
return matching.template_column_name === column.label &&
|
|
105
|
+
matching.matched_column_name === templateHeaderMatchings[column.label];
|
|
106
|
+
});
|
|
107
|
+
var mappedColumn = {
|
|
108
|
+
matched_column_name: templateHeaderMatchings[column.label],
|
|
109
|
+
template_column_name: column.label,
|
|
110
|
+
};
|
|
111
|
+
if (existingMatching) {
|
|
112
|
+
mappedColumn.id = existingMatching.id;
|
|
113
|
+
}
|
|
114
|
+
return mappedColumn;
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
var saveMappedColumns = function (columnMappings, fuseApi, templateSlug) { return __awaiter(void 0, void 0, void 0, function () {
|
|
118
|
+
var error_2;
|
|
119
|
+
return __generator(this, function (_a) {
|
|
120
|
+
switch (_a.label) {
|
|
121
|
+
case 0:
|
|
122
|
+
_a.trys.push([0, 2, , 3]);
|
|
123
|
+
return [4 /*yield*/, fuseApi.patch("/api/v1/templates/".concat(templateSlug), {
|
|
124
|
+
column_mappings_attributes: columnMappings,
|
|
125
|
+
})];
|
|
126
|
+
case 1:
|
|
127
|
+
_a.sent();
|
|
128
|
+
return [3 /*break*/, 3];
|
|
129
|
+
case 2:
|
|
130
|
+
error_2 = _a.sent();
|
|
131
|
+
throw new Error("There was an error trying to save column mappings");
|
|
132
|
+
case 3: return [2 /*return*/];
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}); };
|
|
101
136
|
var getImportWasSuccessful = function (response) {
|
|
102
137
|
return !response.errors || !Object.keys(response.errors).length;
|
|
103
138
|
};
|
|
@@ -132,7 +167,7 @@ function csvExport(data) {
|
|
|
132
167
|
}
|
|
133
168
|
export var ReviewContextProvider = function (_a) {
|
|
134
169
|
var initialRecords = _a.initialRecords, children = _a.children;
|
|
135
|
-
var _b = useImporterContext(), templateHeaderMatchings = _b.templateHeaderMatchings, enumFieldValueMatchings = _b.enumFieldValueMatchings, templateHeaders = _b.templateHeaders, uploadedDataHeaders = _b.uploadedDataHeaders, headerRowIndex = _b.headerRowIndex, uploadedData = _b.uploadedData, currentStepIndex = _b.currentStepIndex, integrations = _b.integrations, templateSlug = _b.templateSlug, fuseApi = _b.fuseApi, setSelectedRows = _b.setSelectedRows, _c = _b.importerOptions, disableSubmitIfInvalid = _c.disableSubmitIfInvalid, batchValidationDelayMs = _c.batchValidationDelayMs, batchValidationSize = _c.batchValidationSize, previewMode = _c.previewMode, loadingComponent = _c.loadingComponent, onSubmit = _b.onSubmit, onValidateRecord = _b.onValidateRecord, formatRecord = _b.formatRecord, selectedRows = _b.selectedRows;
|
|
170
|
+
var _b = useImporterContext(), templateHeaderMatchings = _b.templateHeaderMatchings, enumFieldValueMatchings = _b.enumFieldValueMatchings, templateHeaders = _b.templateHeaders, uploadedDataHeaders = _b.uploadedDataHeaders, headerRowIndex = _b.headerRowIndex, uploadedData = _b.uploadedData, currentStepIndex = _b.currentStepIndex, integrations = _b.integrations, templateSlug = _b.templateSlug, fuseApi = _b.fuseApi, setSelectedRows = _b.setSelectedRows, _c = _b.importerOptions, disableSubmitIfInvalid = _c.disableSubmitIfInvalid, batchValidationDelayMs = _c.batchValidationDelayMs, batchValidationSize = _c.batchValidationSize, previewMode = _c.previewMode, loadingComponent = _c.loadingComponent, onSubmit = _b.onSubmit, onValidateRecord = _b.onValidateRecord, formatRecord = _b.formatRecord, selectedRows = _b.selectedRows, columnMappingsAttributes = _b.columnMappingsAttributes;
|
|
136
171
|
var setIsLoadingApp = useAppLoadingContext().setIsLoadingApp;
|
|
137
172
|
var _d = useState(false), isSubmitting = _d[0], setIsSubmitting = _d[1];
|
|
138
173
|
var _e = useState(false), isSubmitDisabled = _e[0], setIsSubmitDisabled = _e[1];
|
|
@@ -166,11 +201,11 @@ export var ReviewContextProvider = function (_a) {
|
|
|
166
201
|
}
|
|
167
202
|
}, [reviewFields, selectedRows]);
|
|
168
203
|
var onSubmitData = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
169
|
-
var dataSet, dataSetValues, validDataSetValues, validDataSetLength, invalidRecords_1, applicationResponse, isAppResponseSuccessful, _a, errors, isDataValid, recordsToDisplayFiltered, invalidDataSet,
|
|
204
|
+
var dataSet, dataSetValues, validDataSetValues, validDataSetLength, invalidRecords_1, applicationResponse, isAppResponseSuccessful, _a, errors, isDataValid, recordsToDisplayFiltered, invalidDataSet, columnMappings, error_3;
|
|
170
205
|
return __generator(this, function (_b) {
|
|
171
206
|
switch (_b.label) {
|
|
172
207
|
case 0:
|
|
173
|
-
_b.trys.push([0,
|
|
208
|
+
_b.trys.push([0, 6, 7, 8]);
|
|
174
209
|
if (!reviewDataSetRef.current)
|
|
175
210
|
return [2 /*return*/];
|
|
176
211
|
setIsSubmitting(true);
|
|
@@ -202,23 +237,27 @@ export var ReviewContextProvider = function (_a) {
|
|
|
202
237
|
invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields);
|
|
203
238
|
setReviewInitialDataSet(invalidDataSet);
|
|
204
239
|
setInitialDataSetUpdatedAt(Date.now());
|
|
205
|
-
if (!!previewMode) return [3 /*break*/,
|
|
240
|
+
if (!!previewMode) return [3 /*break*/, 5];
|
|
206
241
|
return [4 /*yield*/, trackImportedRowsCount(fuseApi, templateSlug, validDataSetLength)];
|
|
207
242
|
case 2:
|
|
208
243
|
_b.sent();
|
|
209
244
|
return [4 /*yield*/, sendRecordsToIntegrations(dataSetValues, integrations)];
|
|
210
245
|
case 3:
|
|
211
246
|
_b.sent();
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
case
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
247
|
+
columnMappings = buildColumnMappingsFromHeaderMatchings(templateHeaders, templateHeaderMatchings, columnMappingsAttributes);
|
|
248
|
+
return [4 /*yield*/, saveMappedColumns(columnMappings, fuseApi, templateSlug)];
|
|
249
|
+
case 4:
|
|
250
|
+
_b.sent();
|
|
251
|
+
_b.label = 5;
|
|
252
|
+
case 5: return [3 /*break*/, 8];
|
|
218
253
|
case 6:
|
|
254
|
+
error_3 = _b.sent();
|
|
255
|
+
console.error(error_3);
|
|
256
|
+
return [3 /*break*/, 8];
|
|
257
|
+
case 7:
|
|
219
258
|
setIsSubmitting(false);
|
|
220
259
|
return [7 /*endfinally*/];
|
|
221
|
-
case
|
|
260
|
+
case 8: return [2 /*return*/];
|
|
222
261
|
}
|
|
223
262
|
});
|
|
224
263
|
}); }, [reviewFields, onSubmit]);
|
|
@@ -242,7 +281,9 @@ export var ReviewContextProvider = function (_a) {
|
|
|
242
281
|
reviewDataSetRef.current = null;
|
|
243
282
|
return;
|
|
244
283
|
}
|
|
245
|
-
var sleep = function (n) {
|
|
284
|
+
var sleep = function (n) {
|
|
285
|
+
return new Promise(function (resolve) { return setTimeout(resolve, n); });
|
|
286
|
+
};
|
|
246
287
|
if (currentStepIndex === 0) {
|
|
247
288
|
if (!previewInitialDataSet) {
|
|
248
289
|
//Uploader spreadsheet data
|
|
@@ -292,7 +333,7 @@ export var ReviewContextProvider = function (_a) {
|
|
|
292
333
|
});
|
|
293
334
|
}); })();
|
|
294
335
|
}
|
|
295
|
-
}, [
|
|
336
|
+
}, [currentStepIndex, templateHeaders, uploadedData]);
|
|
296
337
|
var value = {
|
|
297
338
|
previewInitialDataSet: previewInitialDataSet,
|
|
298
339
|
previewFields: previewFields,
|
|
@@ -10,7 +10,10 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
return __assign.apply(this, arguments);
|
|
11
11
|
};
|
|
12
12
|
import Fuse from "fuse.js";
|
|
13
|
-
|
|
13
|
+
var fusejsOptions = {
|
|
14
|
+
includeScore: true,
|
|
15
|
+
threshold: 0.35,
|
|
16
|
+
};
|
|
14
17
|
export var getEnumFieldValueMatchingsInitialValue = function (_a) {
|
|
15
18
|
var uploadedDataEnumFieldValues = _a.uploadedDataEnumFieldValues, templateHeaders = _a.templateHeaders;
|
|
16
19
|
var res = {};
|
|
@@ -18,11 +21,11 @@ export var getEnumFieldValueMatchingsInitialValue = function (_a) {
|
|
|
18
21
|
uploadedDataEnumFieldValues[templateLabel].forEach(function (uploadedValue, _index) {
|
|
19
22
|
var _a, _b;
|
|
20
23
|
var templateOptions = (_a = templateHeaders.find(function (th) { return th.label === templateLabel; })) === null || _a === void 0 ? void 0 : _a.values;
|
|
21
|
-
var
|
|
22
|
-
var
|
|
24
|
+
var fuzzySearch = new Fuse(templateOptions, fusejsOptions);
|
|
25
|
+
var fuzzySearchResults = fuzzySearch.search(uploadedValue);
|
|
23
26
|
var previousRes = __assign({}, (res[templateLabel] || {}));
|
|
24
27
|
res[templateLabel] = previousRes;
|
|
25
|
-
res[templateLabel][uploadedValue] = (_b =
|
|
28
|
+
res[templateLabel][uploadedValue] = (_b = fuzzySearchResults[0]) === null || _b === void 0 ? void 0 : _b.item;
|
|
26
29
|
});
|
|
27
30
|
};
|
|
28
31
|
var templateLabels = Object.keys(uploadedDataEnumFieldValues);
|
|
@@ -13,8 +13,44 @@ var __assign = (this && this.__assign) || function () {
|
|
|
13
13
|
};
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
26
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
27
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
28
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
29
|
+
function step(op) {
|
|
30
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
31
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
32
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
33
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
34
|
+
switch (op[0]) {
|
|
35
|
+
case 0: case 1: t = op; break;
|
|
36
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
37
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
38
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
39
|
+
default:
|
|
40
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
41
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
42
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
43
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
44
|
+
if (t[2]) _.ops.pop();
|
|
45
|
+
_.trys.pop(); continue;
|
|
46
|
+
}
|
|
47
|
+
op = body.call(thisArg, _);
|
|
48
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
49
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
16
52
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
17
|
-
import { useState } from "react";
|
|
53
|
+
import { useState, useEffect } from "react";
|
|
18
54
|
import { useTranslation } from "react-i18next";
|
|
19
55
|
import styled, { css } from "styled-components";
|
|
20
56
|
import { Button, ChevronRightIcon, closeIconCondensed } from "../../common";
|
|
@@ -27,6 +63,7 @@ import { Step } from "./Step";
|
|
|
27
63
|
import { StepperSubmitModal } from "./StepperSubmitModal";
|
|
28
64
|
import { UnmatchedHeadersModal } from "./UnmatchedHeadersModal";
|
|
29
65
|
import { getEnumFieldValueMatchingsInitialValue } from "./common/getEnumFieldValueMatchingsInitialValue";
|
|
66
|
+
import { useAppLoadingContext } from "../../common/AppLoadingContextProvider";
|
|
30
67
|
var StepperWrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"], ["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"])), function (p) { return p.theme.colors.white; }, function (p) { return p.theme.colors.gray300; });
|
|
31
68
|
var StepperContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"])));
|
|
32
69
|
var Steps = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n @media (max-width: 630px) {\n display: none;\n }\n"], ["\n @media (max-width: 630px) {\n display: none;\n }\n"])));
|
|
@@ -43,8 +80,30 @@ export var Stepper = function (_a) {
|
|
|
43
80
|
var t = useTranslation("general").t;
|
|
44
81
|
var _c = useState(false), isSubmitModalOpen = _c[0], setIsSubmitModalOpen = _c[1];
|
|
45
82
|
var _d = useState(false), isConfirmCloseModalOpen = _d[0], setIsConfirmCloseModalOpen = _d[1];
|
|
83
|
+
var setIsLoadingApp = useAppLoadingContext().setIsLoadingApp;
|
|
46
84
|
var _e = useReviewContext(), appResponse = _e.appResponse, isSubmitDisabled = _e.isSubmitDisabled, onSubmit = _e.onSubmit;
|
|
47
|
-
var _f = useImporterContext(), initialRecords = _f.initialRecords, currentStepIndex = _f.currentStepIndex, templateHeaderMatchings = _f.templateHeaderMatchings, matcherSubstep = _f.matcherSubstep, templateHeaders = _f.templateHeaders, uploadedDataEnumFieldValues = _f.uploadedDataEnumFieldValues, setEnumFieldValueMatchings = _f.setEnumFieldValueMatchings, setMatcherSubstep = _f.setMatcherSubstep, setCurrentStepIndex = _f.setCurrentStepIndex, onClose = _f.onClose, isUsingManualImport = _f.isUsingManualImport, resetImporterWhenUsingManualImport = _f.resetImporterWhenUsingManualImport, uploadedData = _f.uploadedData;
|
|
85
|
+
var _f = useImporterContext(), initialRecords = _f.initialRecords, currentStepIndex = _f.currentStepIndex, templateHeaderMatchings = _f.templateHeaderMatchings, matcherSubstep = _f.matcherSubstep, templateHeaders = _f.templateHeaders, uploadedDataEnumFieldValues = _f.uploadedDataEnumFieldValues, setEnumFieldValueMatchings = _f.setEnumFieldValueMatchings, setMatcherSubstep = _f.setMatcherSubstep, setCurrentStepIndex = _f.setCurrentStepIndex, onClose = _f.onClose, isUsingManualImport = _f.isUsingManualImport, resetImporterWhenUsingManualImport = _f.resetImporterWhenUsingManualImport, uploadedData = _f.uploadedData, setHeadersMappings = _f.setHeadersMappings, uploadedDataHeaders = _f.uploadedDataHeaders, fuseApi = _f.fuseApi, templateSlug = _f.templateSlug;
|
|
86
|
+
useEffect(function () {
|
|
87
|
+
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
88
|
+
var mappings;
|
|
89
|
+
return __generator(this, function (_a) {
|
|
90
|
+
switch (_a.label) {
|
|
91
|
+
case 0:
|
|
92
|
+
if (!uploadedDataHeaders) return [3 /*break*/, 2];
|
|
93
|
+
setIsLoadingApp(true);
|
|
94
|
+
return [4 /*yield*/, fuseApi.post("/api/v1/importer/templates/".concat(templateSlug, "/mappings"), {
|
|
95
|
+
file_headers: uploadedDataHeaders,
|
|
96
|
+
})];
|
|
97
|
+
case 1:
|
|
98
|
+
mappings = (_a.sent()).data.mappings;
|
|
99
|
+
setIsLoadingApp(false);
|
|
100
|
+
setHeadersMappings(mappings);
|
|
101
|
+
_a.label = 2;
|
|
102
|
+
case 2: return [2 /*return*/];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}); })();
|
|
106
|
+
}, [uploadedDataHeaders]);
|
|
48
107
|
var templateHeaderLabels = Object.keys(templateHeaderMatchings || []);
|
|
49
108
|
var unmatchedHeadersCount = templateHeaderLabels.filter(function (templateHeaderLabel) { return !templateHeaderMatchings[templateHeaderLabel]; }).length;
|
|
50
109
|
var isLastSubMatchStep = matcherSubstep === 1;
|
|
@@ -58,22 +58,25 @@ var ImporterDropzone = function () {
|
|
|
58
58
|
setIsUploading(true);
|
|
59
59
|
setFileName(file.name);
|
|
60
60
|
var reader = new FileReader();
|
|
61
|
+
var isCsvFile = file.type === "text/csv";
|
|
61
62
|
reader.onabort = function () { return console.log("file reading was aborted"); };
|
|
62
63
|
reader.onerror = function () { return console.log("file reading has failed"); };
|
|
63
64
|
reader.onload = function (event) {
|
|
64
65
|
var _a;
|
|
65
66
|
var results = event.target.result;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
if (isCsvFile) {
|
|
68
|
+
Papa.parse(results, {
|
|
69
|
+
worker: true,
|
|
70
|
+
complete: function (parserResults) {
|
|
71
|
+
setUploadedData(parserResults.data);
|
|
72
|
+
setIsUploading(false);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
69
77
|
var getDataFromFile = function (fileResults) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
? fileResults
|
|
73
|
-
: new TextEncoder().encode(fileResults));
|
|
74
|
-
var data = Papa.parse(csvString).data;
|
|
75
|
-
return data;
|
|
76
|
-
}
|
|
78
|
+
// rounded value to 20MB
|
|
79
|
+
var isLargeFile = file.size > 20000000;
|
|
77
80
|
var workBook = XLSX.read(fileResults, {
|
|
78
81
|
type: "array",
|
|
79
82
|
codepage: 65001,
|
|
@@ -91,7 +94,12 @@ var ImporterDropzone = function () {
|
|
|
91
94
|
}
|
|
92
95
|
setIsUploading(false);
|
|
93
96
|
};
|
|
94
|
-
|
|
97
|
+
if (isCsvFile) {
|
|
98
|
+
reader.readAsText(file);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
reader.readAsArrayBuffer(file);
|
|
102
|
+
}
|
|
95
103
|
});
|
|
96
104
|
};
|
|
97
105
|
var onDropRejected = function (rejectedFiles) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { rowIsEmpty } from "./utils";
|
|
1
2
|
//Filter records by search value
|
|
2
3
|
export var filterRecordsBySearchValue = function (obj, value) {
|
|
3
4
|
var isObject = function (value) {
|
|
@@ -28,18 +29,10 @@ export var filterRecordsBySearchValue = function (obj, value) {
|
|
|
28
29
|
};
|
|
29
30
|
export var filterRecordsByType = function (obj, filterType) {
|
|
30
31
|
var _a, _b;
|
|
31
|
-
var rowIsEmpty = function (row) {
|
|
32
|
-
return Object.keys(row).every(function (key) {
|
|
33
|
-
if (key === "_meta")
|
|
34
|
-
return true;
|
|
35
|
-
return !row[key];
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
32
|
var filteredObj = {};
|
|
39
33
|
for (var key in obj) {
|
|
40
34
|
if (filterType === "all" ||
|
|
41
|
-
(((_b = (_a = obj[key]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.isInvalid)
|
|
42
|
-
!rowIsEmpty(obj[key]))) {
|
|
35
|
+
(((_b = (_a = obj[key]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.isInvalid) && !rowIsEmpty(obj[key]))) {
|
|
43
36
|
filteredObj[key] = obj[key];
|
|
44
37
|
}
|
|
45
38
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { SpreadsheetOptions } from "../../../..";
|
|
3
|
-
import { BatchValidationErrors, Field, Record, RecordDataSet } from "../../../../types";
|
|
3
|
+
import { BatchValidationErrors, DuplicateRecords, Field, Record, RecordDataSet } from "../../../../types";
|
|
4
4
|
import { SortBy, SpreadsheetProps } from "../common/types";
|
|
5
5
|
import { ValidationState } from "../hooks";
|
|
6
6
|
import { SpreadsheetFilter } from "./useSpreadsheetFilter";
|
|
@@ -9,7 +9,6 @@ export type OnValidationStateChanged = (state: ValidationState) => void;
|
|
|
9
9
|
type State = {
|
|
10
10
|
data: Record[];
|
|
11
11
|
fields: Field[];
|
|
12
|
-
isLoading: boolean;
|
|
13
12
|
isReadOnly?: boolean;
|
|
14
13
|
errors: BatchValidationErrors;
|
|
15
14
|
warnings: BatchValidationErrors;
|
|
@@ -17,7 +16,6 @@ type State = {
|
|
|
17
16
|
sortByFieldErrors: string;
|
|
18
17
|
sortByFieldWarnings: string;
|
|
19
18
|
updateRecord: (record: Record) => void;
|
|
20
|
-
setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
19
|
setSortByFieldErrors: React.Dispatch<React.SetStateAction<string>>;
|
|
22
20
|
selectedRows: string[];
|
|
23
21
|
setSelectedRows: React.Dispatch<React.SetStateAction<string[]>>;
|
|
@@ -39,6 +37,7 @@ type State = {
|
|
|
39
37
|
setSortBy: React.Dispatch<React.SetStateAction<SortBy>>;
|
|
40
38
|
setIsTransformTooltipOpened: React.Dispatch<React.SetStateAction<boolean>>;
|
|
41
39
|
isTransformTooltipOpened: boolean;
|
|
40
|
+
duplicateRecords: DuplicateRecords;
|
|
42
41
|
} & ValidationState;
|
|
43
42
|
type Props = SpreadsheetProps & {
|
|
44
43
|
children: JSX.Element;
|
|
@@ -27,7 +27,7 @@ import { addMeta } from "../../../data";
|
|
|
27
27
|
import { useValidationState } from "../hooks";
|
|
28
28
|
import { useSpreadsheetFilter, } from "./useSpreadsheetFilter";
|
|
29
29
|
import { filterRecordsByType, filterRecordsByError, filterRecordsBySearchValue, } from "./filterMethods";
|
|
30
|
-
import { hasValueInAnyField } from "./utils";
|
|
30
|
+
import { hasValueInAnyField, rowIsEmpty } from "./utils";
|
|
31
31
|
var getDefaultSortCompareFn = function (sortBy) {
|
|
32
32
|
return function (a, b) {
|
|
33
33
|
var aField = get(a, sortBy.field);
|
|
@@ -47,24 +47,22 @@ var SpreadsheetContext = createContext({});
|
|
|
47
47
|
export var SpreadsheetContextProvider = function (_a) {
|
|
48
48
|
var initialDataSet = _a.initialDataSet, fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, children = _a.children, onValidateRecord = _a.onValidateRecord, onDataSetChanged = _a.onDataSetChanged, onValidationStateChanged = _a.onValidationStateChanged, selectedRows = _a.selectedRows, setSelectedRows = _a.setSelectedRows, _b = _a.getSortCompareFn, getSortCompareFn = _b === void 0 ? getDefaultSortCompareFn : _b;
|
|
49
49
|
var _c = useState(initialDataSet), dataSet = _c[0], setDataSet = _c[1];
|
|
50
|
-
var _d = useState(
|
|
51
|
-
var _e = useState(null),
|
|
52
|
-
var _f = useState(
|
|
53
|
-
var _g = useState(
|
|
54
|
-
var _h = useState(null), sortBy = _h[0], setSortBy = _h[1];
|
|
50
|
+
var _d = useState(null), sortByFieldErrors = _d[0], setSortByFieldErrors = _d[1];
|
|
51
|
+
var _e = useState(null), sortByFieldWarnings = _e[0], setSortByFieldWarnings = _e[1];
|
|
52
|
+
var _f = useState(""), filteredInputValue = _f[0], setFilteredInputValue = _f[1];
|
|
53
|
+
var _g = useState(null), sortBy = _g[0], setSortBy = _g[1];
|
|
55
54
|
var addRowTimeoutRef = useRef(null);
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
55
|
+
var _h = useState(false), isTransformTooltipOpened = _h[0], setIsTransformTooltipOpened = _h[1];
|
|
56
|
+
var _j = useSpreadsheetFilter(), spreadsheetFilter = _j.spreadsheetFilter, filterRecordsByRowType = _j.filterRecordsByRowType, filterRecordsByFieldErrors = _j.filterRecordsByFieldErrors, resetSpreadsheetFilter = _j.resetSpreadsheetFilter;
|
|
57
|
+
var _k = useValidationState({
|
|
59
58
|
dataSet: dataSet,
|
|
60
59
|
initialDataSet: initialDataSet,
|
|
61
60
|
fields: fields,
|
|
62
61
|
options: options,
|
|
63
62
|
isReadOnly: isReadOnly,
|
|
64
63
|
setDataSet: setDataSet,
|
|
65
|
-
setIsLoading: setIsLoading,
|
|
66
64
|
onValidateRecord: onValidateRecord,
|
|
67
|
-
}), updateRecordAndRevalidate =
|
|
65
|
+
}), updateRecordAndRevalidate = _k.updateRecordAndRevalidate, deleteRecords = _k.deleteRecords, warnings = _k.warnings, errors = _k.errors, validationState = __rest(_k, ["updateRecordAndRevalidate", "deleteRecords", "warnings", "errors"]);
|
|
68
66
|
var addNewRowsToSpreadsheet = function () {
|
|
69
67
|
addRowTimeoutRef.current = setTimeout(function () {
|
|
70
68
|
var _a, _b;
|
|
@@ -83,10 +81,62 @@ export var SpreadsheetContextProvider = function (_a) {
|
|
|
83
81
|
var handleDeleteErrors = function (selectedRows) {
|
|
84
82
|
deleteRecords(selectedRows, errors, warnings);
|
|
85
83
|
};
|
|
84
|
+
var duplicateRecords = useMemo(function () {
|
|
85
|
+
if (isReadOnly)
|
|
86
|
+
return { records: {}, count: 0 };
|
|
87
|
+
var uniqueRecords = new Map();
|
|
88
|
+
var duplicateGroups = [];
|
|
89
|
+
var _loop_1 = function (recordKey) {
|
|
90
|
+
if (Object.prototype.hasOwnProperty.call(dataSet, recordKey)) {
|
|
91
|
+
var record_1 = dataSet[recordKey];
|
|
92
|
+
if (rowIsEmpty(record_1))
|
|
93
|
+
return "continue";
|
|
94
|
+
var key = fields.map(function (field) { return record_1[field.name]; }).join("|");
|
|
95
|
+
if (uniqueRecords.has(key)) {
|
|
96
|
+
var saved_1 = uniqueRecords.get(key);
|
|
97
|
+
var existingGroup = duplicateGroups.find(function (group) {
|
|
98
|
+
return group.some(function (item) { return item._meta.id === saved_1._meta.id; });
|
|
99
|
+
});
|
|
100
|
+
if (existingGroup) {
|
|
101
|
+
existingGroup.push(record_1);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
duplicateGroups.push([saved_1, record_1]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
uniqueRecords.set(key, record_1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
for (var recordKey in dataSet) {
|
|
113
|
+
_loop_1(recordKey);
|
|
114
|
+
}
|
|
115
|
+
var count = duplicateGroups.length;
|
|
116
|
+
var records = {};
|
|
117
|
+
for (var i = 0; i < duplicateGroups.length; i++) {
|
|
118
|
+
var group = duplicateGroups[i];
|
|
119
|
+
for (var j = 0; j < group.length; j++) {
|
|
120
|
+
var record = group[j];
|
|
121
|
+
records[record._meta.id] = __assign({}, record);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { records: records, count: count };
|
|
125
|
+
}, [dataSet]);
|
|
86
126
|
var dataSnapshot = useMemo(function () {
|
|
87
|
-
var filteredData =
|
|
88
|
-
|
|
89
|
-
:
|
|
127
|
+
var filteredData = dataSet;
|
|
128
|
+
switch (spreadsheetFilter.type) {
|
|
129
|
+
case "rowBased":
|
|
130
|
+
if (spreadsheetFilter.byRow === "duplicates") {
|
|
131
|
+
filteredData = duplicateRecords.records;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
filteredData = filterRecordsByType(dataSet, spreadsheetFilter.byRow);
|
|
135
|
+
break;
|
|
136
|
+
case "columnBased":
|
|
137
|
+
filteredData = filterRecordsByError(dataSet, spreadsheetFilter.byColumn.field, errors);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
90
140
|
var filteredDatasetByString = filteredInputValue
|
|
91
141
|
? filterRecordsBySearchValue(filteredData, filteredInputValue)
|
|
92
142
|
: filteredData;
|
|
@@ -109,6 +159,7 @@ export var SpreadsheetContextProvider = function (_a) {
|
|
|
109
159
|
spreadsheetFilter,
|
|
110
160
|
sortBy,
|
|
111
161
|
Object.keys(dataSet).length,
|
|
162
|
+
duplicateRecords.count,
|
|
112
163
|
sortByFieldErrors,
|
|
113
164
|
sortByFieldWarnings,
|
|
114
165
|
]);
|
|
@@ -170,7 +221,7 @@ export var SpreadsheetContextProvider = function (_a) {
|
|
|
170
221
|
return updatedData;
|
|
171
222
|
});
|
|
172
223
|
}, [dataSet, dataSnapshot]);
|
|
173
|
-
var value = __assign(__assign({ data: updatedDataSnapshot, fields: fields
|
|
224
|
+
var value = __assign(__assign({ data: updatedDataSnapshot, fields: fields }, validationState), { isReadOnly: isReadOnly, sortByFieldErrors: sortByFieldErrors, sortByFieldWarnings: sortByFieldWarnings, options: options, recordsWithValuesCount: recordsWithValuesCount, filteredDataCount: filteredDataCount, sortBy: sortBy, warnings: warnings, errors: errors, setSortByFieldErrors: handleSortByFieldErrors, setSortByFieldWarnings: handleSortByFieldWarnings, onValidateRecord: onValidateRecord, updateRecord: updateRecordAndRevalidate, selectedRows: selectedRows, setSelectedRows: setSelectedRows, deleteRecords: handleDeleteErrors, filteredInputValue: filteredInputValue, setFilteredInputValue: setFilteredInputValue, lastClickedIndexRef: lastClickedIndexRef, addNewRowsToSpreadsheet: addNewRowsToSpreadsheet, spreadsheetFilter: spreadsheetFilter, resetSpreadsheetFilter: resetSpreadsheetFilter, filterRecordsByRowType: filterRecordsByRowType, filterRecordsByFieldErrors: filterRecordsByFieldErrors, checkboxColumnWidth: checkboxColumnWidth, setSortBy: setSortBy, isFiltering: isFiltering, setIsTransformTooltipOpened: setIsTransformTooltipOpened, isTransformTooltipOpened: isTransformTooltipOpened, duplicateRecords: duplicateRecords });
|
|
174
225
|
return (_jsx(SpreadsheetContext.Provider, __assign({ value: value }, { children: children })));
|
|
175
226
|
};
|
|
176
227
|
export var useSpreadsheetContext = function () { return useContext(SpreadsheetContext); };
|
|
@@ -12,3 +12,10 @@ export var hasValueInAnyField = function (record) {
|
|
|
12
12
|
return value !== null && value !== undefined;
|
|
13
13
|
});
|
|
14
14
|
};
|
|
15
|
+
export var rowIsEmpty = function (row) {
|
|
16
|
+
return Object.keys(row).every(function (key) {
|
|
17
|
+
if (key === "_meta")
|
|
18
|
+
return true;
|
|
19
|
+
return !row[key];
|
|
20
|
+
});
|
|
21
|
+
};
|
|
@@ -38,7 +38,7 @@ import { useImporterContext } from "../../../../Importer/contexts/ImporterContex
|
|
|
38
38
|
import useWindowDimensions from "../../../../utils/hooks/useWindowSize";
|
|
39
39
|
var getItemKey = function (record) { return record._meta.id; };
|
|
40
40
|
var SpreadsheetData = function (props) {
|
|
41
|
-
var _a = useSpreadsheetContext(), fields = _a.fields, data = _a.data,
|
|
41
|
+
var _a = useSpreadsheetContext(), fields = _a.fields, data = _a.data, 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;
|
|
@@ -105,6 +105,6 @@ var SpreadsheetData = function (props) {
|
|
|
105
105
|
var showValidationProgress = !isReadOnly && validationPercentage < 100;
|
|
106
106
|
var isReviewStep = currentStepIndex === 2;
|
|
107
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,
|
|
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, onTableScroll: onTableScroll, getItemKey: getItemKey, checkboxColumnWidth: checkboxColumnWidth, isFiltering: isFiltering })] }))] }))] })));
|
|
109
109
|
};
|
|
110
110
|
export default React.memo(SpreadsheetData, areEqual);
|