fuse-importer 0.1.4-testing → 0.1.6-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.js +38 -7
- package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +1 -1
- package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +4 -3
- package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +14 -9
- package/lib/esm/Importer/PreviewFirstTime.js +1 -1
- package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +6 -6
- package/lib/esm/Importer/Review/ReviewContextProvider.js +51 -223
- package/lib/esm/Importer/Review/ReviewWithContext.js +2 -2
- package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +2 -1
- package/lib/esm/Importer/Stepper/StepperSubmitModal.js +4 -2
- package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +1 -1
- package/lib/esm/Importer/Stepper/index.js +20 -69
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.d.ts +2 -1
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +14 -86
- package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +11 -3
- package/lib/esm/Importer/Uploader/HeadersPreview.js +1 -1
- package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.d.ts +16 -0
- package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.js +63 -0
- package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +18 -0
- package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +101 -0
- package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +29 -0
- package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +150 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +6 -4
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +37 -37
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +6 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +138 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +7 -29
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +11 -193
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +72 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +4 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +46 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +2 -1
- package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +31 -0
- package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +304 -0
- package/lib/esm/Importer/common/Spreadsheet/common/index.js +5 -4
- package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -3
- package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.d.ts +0 -2
- package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +26 -11
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +21 -13
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +35 -36
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowNumbers.js +3 -3
- package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +5 -1
- package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +44 -18
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.js +1 -2
- package/lib/esm/Importer/common/Spreadsheet/index.d.ts +0 -1
- package/lib/esm/Importer/common/Spreadsheet/index.js +1 -84
- package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -2
- package/lib/esm/Importer/common/Spreadsheet/styles.js +13 -1
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +2 -1
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +9 -5
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -2
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +4 -16
- package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
- package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
- package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
- package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
- package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +16 -7
- package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +4 -2
- package/lib/esm/Importer/contexts/ImporterContextProvider.js +121 -13
- package/lib/esm/Importer/data/index.d.ts +1 -0
- package/lib/esm/Importer/data/index.js +44 -5
- package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
- package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
- package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
- package/lib/esm/Importer/hooks/useSubmitToServer.js +192 -0
- package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
- package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
- package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
- package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +108 -0
- package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
- package/lib/esm/common/FileUploadDropzone/index.js +1 -0
- package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +55 -41
- package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -16
- package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
- package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +38 -9
- package/lib/esm/common/Table/TableActions/RowFilters.js +53 -5
- package/lib/esm/common/Table/TableActions/SearchRows.js +3 -1
- package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
- package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
- package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +1 -0
- package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +25 -17
- package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
- package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
- package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
- package/lib/esm/common/Table/TableView/TableRows/TableRow.js +2 -2
- package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
- package/lib/esm/common/Table/TableView/index.d.ts +1 -1
- package/lib/esm/common/Table/TableView/index.js +6 -15
- package/lib/esm/common/Table/TableView/types.d.ts +8 -9
- package/lib/esm/common/Table/index.d.ts +2 -1
- package/lib/esm/common/Table/index.js +2 -2
- package/lib/esm/common/Toast.js +3 -2
- package/lib/esm/common/TooltipProvider.d.ts +2 -0
- package/lib/esm/common/TooltipProvider.js +12 -9
- package/lib/esm/common/buttons.d.ts +5 -1
- package/lib/esm/common/buttons.js +13 -7
- package/lib/esm/common/columnsTransformations.js +1 -1
- package/lib/esm/common/datePatterns.d.ts +1 -0
- package/lib/esm/common/datePatterns.js +10 -0
- package/lib/esm/common/icons/index.d.ts +1 -0
- package/lib/esm/common/icons/index.js +1 -0
- 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/locales/de.d.ts +1 -1
- package/lib/esm/locales/de.js +1 -1
- package/lib/esm/locales/en.d.ts +1 -1
- package/lib/esm/locales/en.js +4 -4
- package/lib/esm/locales/es.d.ts +1 -1
- package/lib/esm/locales/es.js +1 -1
- package/lib/esm/locales/fr.d.ts +1 -1
- package/lib/esm/locales/fr.js +1 -1
- package/lib/esm/types.d.ts +20 -5
- package/lib/main.js +2 -2
- package/package.json +6 -4
- package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
- package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -36
- package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
- package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
- package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -33
- package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -256
- package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
- package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
- package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
- package/lib/esm/common/Table/TableActions/hooks.js +0 -41
|
@@ -13,47 +13,13 @@ 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
|
-
};
|
|
52
16
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
53
|
-
import {
|
|
17
|
+
import { useEffect, useState } from "react";
|
|
54
18
|
import { useTranslation } from "react-i18next";
|
|
55
19
|
import styled, { css } from "styled-components";
|
|
20
|
+
import { useValidationContext } from "../../Importer/common/Spreadsheet/ValidationContextProvider";
|
|
56
21
|
import { Button, ChevronRightIcon, closeIconCondensed } from "../../common";
|
|
22
|
+
import { useEventManagerContext } from "../../common/EventManagerContextProvider";
|
|
57
23
|
import { Div } from "../../styled/utils";
|
|
58
24
|
import { ColumnType } from "../Matcher/common/types";
|
|
59
25
|
import { useReviewContext } from "../Review/ReviewContextProvider";
|
|
@@ -62,8 +28,6 @@ import { ConfirmCloseModal } from "./ConfirmCloseModal";
|
|
|
62
28
|
import { Step } from "./Step";
|
|
63
29
|
import { StepperSubmitModal } from "./StepperSubmitModal";
|
|
64
30
|
import { UnmatchedHeadersModal } from "./UnmatchedHeadersModal";
|
|
65
|
-
import { getEnumFieldValueMatchingsInitialValue } from "./common/getEnumFieldValueMatchingsInitialValue";
|
|
66
|
-
import { useAppLoadingContext } from "../../common/AppLoadingContextProvider";
|
|
67
31
|
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; });
|
|
68
32
|
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"])));
|
|
69
33
|
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"])));
|
|
@@ -80,43 +44,30 @@ export var Stepper = function (_a) {
|
|
|
80
44
|
var t = useTranslation("general").t;
|
|
81
45
|
var _c = useState(false), isSubmitModalOpen = _c[0], setIsSubmitModalOpen = _c[1];
|
|
82
46
|
var _d = useState(false), isConfirmCloseModalOpen = _d[0], setIsConfirmCloseModalOpen = _d[1];
|
|
83
|
-
var
|
|
84
|
-
var
|
|
85
|
-
var
|
|
47
|
+
var _e = useState(false), isSubmitDisabled = _e[0], setIsSubmitDisabled = _e[1];
|
|
48
|
+
var _f = useReviewContext(), appResponse = _f.appResponse, onSubmit = _f.onSubmit;
|
|
49
|
+
var totalErrorCount = useValidationContext().totalErrorCount;
|
|
50
|
+
var _g = useEventManagerContext(), on = _g.on, off = _g.off, EVENTS = _g.EVENTS;
|
|
86
51
|
useEffect(function () {
|
|
87
|
-
|
|
88
|
-
var
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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]);
|
|
52
|
+
var listener = function () {
|
|
53
|
+
var isDisabled = totalErrorCount.current > 0;
|
|
54
|
+
setIsSubmitDisabled(isDisabled);
|
|
55
|
+
};
|
|
56
|
+
on(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
|
|
57
|
+
return function () {
|
|
58
|
+
off(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
|
|
59
|
+
};
|
|
60
|
+
}, [appResponse]);
|
|
61
|
+
var _h = useImporterContext(), initialRecords = _h.initialRecords, currentStepIndex = _h.currentStepIndex, templateHeaderMatchings = _h.templateHeaderMatchings, matcherSubstep = _h.matcherSubstep, templateHeaders = _h.templateHeaders, enumFieldValueMatchings = _h.enumFieldValueMatchings, setMatcherSubstep = _h.setMatcherSubstep, setCurrentStepIndex = _h.setCurrentStepIndex, onClose = _h.onClose, isUsingManualImport = _h.isUsingManualImport, resetImporterWhenUsingManualImport = _h.resetImporterWhenUsingManualImport, uploadedData = _h.uploadedData;
|
|
107
62
|
var templateHeaderLabels = Object.keys(templateHeaderMatchings || []);
|
|
108
63
|
var unmatchedHeadersCount = templateHeaderLabels.filter(function (templateHeaderLabel) { return !templateHeaderMatchings[templateHeaderLabel]; }).length;
|
|
109
64
|
var isLastSubMatchStep = matcherSubstep === 1;
|
|
110
65
|
var setStep = function () {
|
|
111
66
|
var templateHasEnumFields = !!(templateHeaders === null || templateHeaders === void 0 ? void 0 : templateHeaders.find(function (header) { return header.column_type === ColumnType.enum; }));
|
|
112
67
|
if (templateHasEnumFields) {
|
|
113
|
-
var
|
|
114
|
-
|
|
115
|
-
templateHeaders: templateHeaders,
|
|
116
|
-
});
|
|
117
|
-
var anyTemplateEnumFieldsMatched = Object.keys(_enumFieldValueMatchings).length > 0;
|
|
68
|
+
var anyTemplateEnumFieldsMatched = !!enumFieldValueMatchings &&
|
|
69
|
+
Object.keys(enumFieldValueMatchings).length > 0;
|
|
118
70
|
if (anyTemplateEnumFieldsMatched) {
|
|
119
|
-
setEnumFieldValueMatchings(_enumFieldValueMatchings);
|
|
120
71
|
setMatcherSubstep(1);
|
|
121
72
|
}
|
|
122
73
|
else {
|
|
@@ -169,7 +120,7 @@ export var Stepper = function (_a) {
|
|
|
169
120
|
return (_jsxs(Div, __assign({ centered: true }, { children: [_jsx(Step, { index: index, label: label, isCompleted: isCompleted, isSelected: index === currentStepIndex }), !isLast && (_jsx(Div, __assign({ ml: 18, mr: 18, dflex: true }, { children: _jsx(ChevronRightIcon, {}) })))] }), index));
|
|
170
121
|
}) })));
|
|
171
122
|
var leftButtonUI = (_jsx(Div, __assign({ style: { flex: 1 } }, { children: !initialRecords && (_jsxs(StepperButtonContainer, __assign({ align: "left" }, { children: [logoURL && (_jsx(Div, __assign({ forDesktop: true }, { children: _jsx(Logo, { src: logoURL, alt: "" }) }))), currentStepIndex > 0 && !appResponse && (_jsx(GoBackButtonWrapper, { children: _jsx(Button, __assign({ variant: "secondary", onClick: goBack }, { children: t("stepper.go_back") })) }))] }))) })));
|
|
172
|
-
var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
|
|
123
|
+
var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ "data-cy": "continue-button", variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, "data-cy": "submit_disabled_" + isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
|
|
173
124
|
return (_jsxs(_Fragment, { children: [_jsx(StepperWrapper, __assign({ pRelative: true, alignCenter: true, w100: true, h: 72, centered: true }, { children: _jsxs(StepperContainer, { children: [leftButtonUI, _jsx(Steps, __assign({ alignCenter: true }, { children: stepsUI })), rightButtonUI] }) })), _jsx(UnmatchedHeadersModal, { isUnmatchedHeadersModalOpen: isUnmatchedHeadersModalOpen, unmatchedHeadersCount: unmatchedHeadersCount, onSetStep: function () { return setStep(); }, onCloseUnmatchedHeadersModal: function () {
|
|
174
125
|
return setIsUnmatchedHeadersModalOpen(false);
|
|
175
126
|
} }), _jsx(StepperSubmitModal, { isSubmitModalOpen: isSubmitModalOpen, onCloseModal: function () { return setIsSubmitModalOpen(false); }, onSubmit: onSubmit }), _jsx(ConfirmCloseModal, { isOpen: isConfirmCloseModalOpen, onClose: function () { return setIsConfirmCloseModalOpen(false); }, onCloseImporter: onClose })] }));
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { DropzoneProps as ImporterDropzoneProps } from "../../../common";
|
|
2
|
+
declare const ImporterDropzone: ({ onComplete, setIsLoading, saveFileName, }: ImporterDropzoneProps) => JSX.Element;
|
|
2
3
|
export { ImporterDropzone };
|
|
@@ -14,35 +14,29 @@ var __assign = (this && this.__assign) || function () {
|
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
-
import { useDropzone } from "react-dropzone";
|
|
18
17
|
import styled, { css } from "styled-components";
|
|
19
|
-
import {
|
|
20
|
-
import { useImporterContext } from "../../contexts/ImporterContextProvider";
|
|
18
|
+
import { useImporterContext } from "../../../Importer/contexts/ImporterContextProvider";
|
|
21
19
|
import { Div } from "../../../styled/utils";
|
|
22
20
|
import { theme } from "../../../styled/theme";
|
|
23
|
-
import {
|
|
24
|
-
import { Button } from "../../../common/buttons";
|
|
25
|
-
import { DragAndDropSvg, UploadIndicatorSvg } from "./backgrounds";
|
|
21
|
+
import { DragAndDropSvg, UploadIndicatorSvg, } from "../../../Importer/Uploader/DragAndDropImporter/backgrounds";
|
|
26
22
|
import { useTranslation } from "react-i18next";
|
|
27
|
-
import
|
|
28
|
-
import * as XLSX from "xlsx";
|
|
23
|
+
import { Button, addToast, useDragAndDrop, } from "../../../common";
|
|
29
24
|
var DragAndDropCard = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n border-radius: 8px;\n margin-right: ", ";\n width: 100%;\n height: 100%;\n display: flex;\n background: ", ";\n border: 1px dashed ", ";\n\n @media (max-width: 1050px) {\n padding: 24px;\n width: auto;\n }\n\n ", "\n"], ["\n border-radius: 8px;\n margin-right: ", ";\n width: 100%;\n height: 100%;\n display: flex;\n background: ", ";\n border: 1px dashed ", ";\n\n @media (max-width: 1050px) {\n padding: 24px;\n width: auto;\n }\n\n ", "\n"])), function (props) { return (props.isDragActive ? "-10px" : "revert"); }, theme.colors.white, theme.colors.red50, function (props) {
|
|
30
25
|
return props.isDragActive && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n border: 1px solid ", ";\n justify-content: center;\n "], ["\n background: ", ";\n border: 1px solid ", ";\n justify-content: center;\n "])), function (p) { return p.theme.colors.blue100; }, function (p) { return p.theme.colors.blue500; });
|
|
31
26
|
});
|
|
32
27
|
var DropzoneUploadingContainer = styled(Div)(function (_a) {
|
|
33
|
-
var
|
|
34
|
-
return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "], ["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "])),
|
|
28
|
+
var colors = _a.theme.colors;
|
|
29
|
+
return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "], ["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "])), colors.blue100, colors.blue500);
|
|
35
30
|
});
|
|
36
31
|
var dropzoneUploadingUI = (_jsx(DropzoneUploadingContainer, __assign({ centered: true }, { children: _jsxs(Div, { children: [_jsx(Div, __assign({ centered: true, mb: 12 }, { children: UploadIndicatorSvg })), _jsx(Div, __assign({ h5: true }, { children: " Drop your file here to upload!" }))] }) })));
|
|
37
32
|
var DragAndDropComponent = function (_a) {
|
|
38
33
|
var openUploadFileDialog = _a.openUploadFileDialog;
|
|
39
34
|
var t = useTranslation("upload").t;
|
|
40
35
|
var manualDataImportSelected = useImporterContext().manualDataImportSelected;
|
|
41
|
-
return (_jsxs(Div, __assign({ centered: true, flexColumn: true }, { children: [_jsx(Div, __assign({ mb: 12 }, { children: DragAndDropSvg })), _jsx(Div, __assign({ h5: true }, { children: t("dropzone.title") })), _jsx(Button, __assign({ mt: 20, variant: "secondary", w: "fit-content", p: 12, isSmall: true, onClick: openUploadFileDialog }, { children: t("dropzone.button") })), _jsx(Div, __assign({ body1: true, textAlignCenter: true, m: 4, mt: 24 }, { children: t("dropzone.description") })), _jsx(Div, { children: _jsx(Button, __assign({ variant: "link", w: "fit-content", p: 12, isSmall: true, onClick: manualDataImportSelected }, { children: t("dropzone.enter_data_manually") })) })] })));
|
|
36
|
+
return (_jsxs(Div, __assign({ centered: true, flexColumn: true }, { children: [_jsx(Div, __assign({ mb: 12 }, { children: DragAndDropSvg })), _jsx(Div, __assign({ h5: true }, { children: t("dropzone.title") })), _jsx(Button, __assign({ mt: 20, variant: "secondary", w: "fit-content", p: 12, isSmall: true, onClick: openUploadFileDialog }, { children: t("dropzone.button") })), _jsx(Div, __assign({ body1: true, textAlignCenter: true, m: 4, mt: 24 }, { children: t("dropzone.description") })), _jsx(Div, { children: _jsx(Button, __assign({ "data-cy": "enter-manually", variant: "link", w: "fit-content", p: 12, isSmall: true, onClick: manualDataImportSelected }, { children: t("dropzone.enter_data_manually") })) })] })));
|
|
42
37
|
};
|
|
43
|
-
var ImporterDropzone = function () {
|
|
44
|
-
var
|
|
45
|
-
var setUploadedData = useImporterContext().setUploadedData;
|
|
38
|
+
var ImporterDropzone = function (_a) {
|
|
39
|
+
var onComplete = _a.onComplete, setIsLoading = _a.setIsLoading, saveFileName = _a.saveFileName;
|
|
46
40
|
var validHeadersCount = function (headersLength) {
|
|
47
41
|
var headersCountLimit = 70;
|
|
48
42
|
if (headersLength > headersCountLimit) {
|
|
@@ -53,78 +47,12 @@ var ImporterDropzone = function () {
|
|
|
53
47
|
return true;
|
|
54
48
|
}
|
|
55
49
|
};
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
reader.onabort = function () { return console.log("file reading was aborted"); };
|
|
63
|
-
reader.onerror = function () { return console.log("file reading has failed"); };
|
|
64
|
-
reader.onload = function (event) {
|
|
65
|
-
var _a;
|
|
66
|
-
var results = event.target.result;
|
|
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
|
-
}
|
|
77
|
-
var getDataFromFile = function (fileResults) {
|
|
78
|
-
// rounded value to 20MB
|
|
79
|
-
var isLargeFile = file.size > 20000000;
|
|
80
|
-
var workBook = XLSX.read(fileResults, {
|
|
81
|
-
type: "array",
|
|
82
|
-
codepage: 65001,
|
|
83
|
-
raw: true,
|
|
84
|
-
dense: isLargeFile,
|
|
85
|
-
});
|
|
86
|
-
var workBookName = workBook.SheetNames[0];
|
|
87
|
-
var sheet = workBook.Sheets[workBookName];
|
|
88
|
-
return XLSX.utils.sheet_to_json(sheet, { header: 1, raw: false });
|
|
89
|
-
};
|
|
90
|
-
var fileData = getDataFromFile(results);
|
|
91
|
-
var headersCount = (_a = fileData[0]) === null || _a === void 0 ? void 0 : _a.length;
|
|
92
|
-
if (validHeadersCount(headersCount)) {
|
|
93
|
-
setUploadedData(fileData);
|
|
94
|
-
}
|
|
95
|
-
setIsUploading(false);
|
|
96
|
-
};
|
|
97
|
-
if (isCsvFile) {
|
|
98
|
-
reader.readAsText(file);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
reader.readAsArrayBuffer(file);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
var onDropRejected = function (rejectedFiles) {
|
|
106
|
-
var errorMessages = rejectedFiles.map(function (file) {
|
|
107
|
-
if (file.errors[0].code === "file-too-large") {
|
|
108
|
-
return "Maximum file size is 200MB";
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return file.errors[0].message;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
var uniqueMessages = Array.from(new Set(errorMessages));
|
|
115
|
-
uniqueMessages.forEach(function (message) {
|
|
116
|
-
addToast(message, "error");
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
var _b = useDropzone({
|
|
120
|
-
onDrop: onDrop,
|
|
121
|
-
onDropRejected: onDropRejected,
|
|
122
|
-
noClick: true,
|
|
123
|
-
noKeyboard: true,
|
|
124
|
-
accept: ".csv, .xls, .xlsx",
|
|
125
|
-
maxFiles: 1,
|
|
126
|
-
maxSize: 200000000, // 200MB
|
|
127
|
-
}), getRootProps = _b.getRootProps, getInputProps = _b.getInputProps, open = _b.open, isDragActive = _b.isDragActive;
|
|
50
|
+
var _b = useDragAndDrop({
|
|
51
|
+
onComplete: onComplete,
|
|
52
|
+
saveFileName: saveFileName,
|
|
53
|
+
setIsLoading: setIsLoading,
|
|
54
|
+
validHeadersCount: validHeadersCount,
|
|
55
|
+
}), getInputProps = _b.getInputProps, getRootProps = _b.getRootProps, isDragActive = _b.isDragActive, open = _b.open;
|
|
128
56
|
return (_jsxs(DragAndDropCard, __assign({ isDragActive: isDragActive, centered: true, pRelative: true }, getRootProps(), { children: [_jsx("input", __assign({}, getInputProps())), isDragActive && dropzoneUploadingUI, _jsx(DragAndDropComponent, { openUploadFileDialog: open })] })));
|
|
129
57
|
};
|
|
130
58
|
export { ImporterDropzone };
|
|
@@ -15,10 +15,10 @@ import { Div } from "../../../styled/utils";
|
|
|
15
15
|
import { closeIconWithCircle, errorIcon, fileExtensionIcon, } from "../../common/icons";
|
|
16
16
|
import { useImporterContext } from "../../contexts/ImporterContextProvider";
|
|
17
17
|
import { useUploaderContext } from "../UploaderContextProvider";
|
|
18
|
-
import { ImporterDropzone } from "./ImporterDropzone";
|
|
19
18
|
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { HeaderCard } from "./ImporterSectionHeader";
|
|
21
20
|
import * as S from "./DragAndDropImporter.styles";
|
|
21
|
+
import { ImporterDropzone } from "./ImporterDropzone";
|
|
22
22
|
export var ErrorCard = function () {
|
|
23
23
|
var templateError = useImporterContext().templateError;
|
|
24
24
|
var t = useTranslation("upload").t;
|
|
@@ -33,8 +33,16 @@ var LoadingCard = function () {
|
|
|
33
33
|
return (_jsxs(S.LoadingCardWrapper, __assign({ spaceBetween: true, centered: true }, { children: [fileExtensionUI, _jsxs(Div, __assign({ mr: 30, ml: 30 }, { children: [_jsx(Div, __assign({ label2: true }, { children: fileName })), _jsx(Div, __assign({ helperText: true, c: colors.gray500 }, { children: t("loading.title") }))] })), _jsx(Div, __assign({ clickable: true, onClick: resetImport }, { children: closeIconWithCircle }))] })));
|
|
34
34
|
};
|
|
35
35
|
var ImporterSection = function () {
|
|
36
|
-
var _a = useImporterContext(), templateHeaders = _a.templateHeaders, templateError = _a.templateError;
|
|
37
|
-
|
|
36
|
+
var _a = useImporterContext(), templateHeaders = _a.templateHeaders, templateError = _a.templateError, setUploadedData = _a.setUploadedData;
|
|
37
|
+
var _b = useUploaderContext(), setIsUploading = _b.setIsUploading, setFileName = _b.setFileName;
|
|
38
|
+
var onComplete = function (data) {
|
|
39
|
+
setUploadedData(data);
|
|
40
|
+
setIsUploading(false);
|
|
41
|
+
};
|
|
42
|
+
var saveFileName = function (fileName) {
|
|
43
|
+
setFileName(fileName);
|
|
44
|
+
};
|
|
45
|
+
return templateError ? (_jsx(ErrorCard, {})) : (_jsx(_Fragment, { children: templateHeaders && (_jsxs(S.ImporterSectionContainer, { children: [_jsx(ImporterDropzone, { onComplete: onComplete, saveFileName: saveFileName, setIsLoading: setIsUploading }), _jsx(HeaderCard, { templateHeaders: templateHeaders })] })) }));
|
|
38
46
|
};
|
|
39
47
|
var DragAndDropImporter = function () {
|
|
40
48
|
var isUploading = useUploaderContext().isUploading;
|
|
@@ -14,6 +14,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
+
import { useEffect } from "react";
|
|
17
18
|
import { useTranslation } from "react-i18next";
|
|
18
19
|
import styled, { css } from "styled-components";
|
|
19
20
|
import { Div } from "../../styled/utils";
|
|
@@ -21,7 +22,6 @@ import { useReviewContext } from "../Review/ReviewContextProvider";
|
|
|
21
22
|
import SpreadsheetBase from "../common/Spreadsheet";
|
|
22
23
|
import { useImporterContext } from "../contexts/ImporterContextProvider";
|
|
23
24
|
import { HeaderButtons } from "./HeaderButtons";
|
|
24
|
-
import { useEffect } from "react";
|
|
25
25
|
var Spreadsheet = styled(SpreadsheetBase)(function () { return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n /* rows will be removed for match and review steps */\n .before-selected-row {\n opacity: 0.2;\n }\n "], ["\n /* rows will be removed for match and review steps */\n .before-selected-row {\n opacity: 0.2;\n }\n "]))); });
|
|
26
26
|
var HeaderContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n margin-left: 32px;\n\n @media (max-width: 1050px) {\n margin-left: 0px;\n\n > div:first-of-type {\n text-align: center;\n }\n\n div:last-of-type {\n margin-left: 0px;\n }\n }\n"], ["\n margin-left: 32px;\n\n @media (max-width: 1050px) {\n margin-left: 0px;\n\n > div:first-of-type {\n text-align: center;\n }\n\n div:last-of-type {\n margin-left: 0px;\n }\n }\n"])));
|
|
27
27
|
var DescriptionAndButtons = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n @media (max-width: 1050px) {\n flex-direction: column;\n gap: 16px;\n }\n"], ["\n @media (max-width: 1050px) {\n flex-direction: column;\n gap: 16px;\n }\n"])));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { Record, RecordDataSet } from "../../../../types";
|
|
3
|
+
export type State = {
|
|
4
|
+
getRecord: (recordId: string) => Record;
|
|
5
|
+
setRecord: (recordId: string, record: Record) => Record;
|
|
6
|
+
deleteRecord: (recordId: string) => void;
|
|
7
|
+
dataSet: MutableRefObject<RecordDataSet>;
|
|
8
|
+
dataSetLength: MutableRefObject<number>;
|
|
9
|
+
emptyRecordIds: MutableRefObject<Set<string>>;
|
|
10
|
+
};
|
|
11
|
+
export declare const DataSetContext: React.Context<State>;
|
|
12
|
+
export declare const DataSetContextProvider: ({ initialDataSet, children }: {
|
|
13
|
+
initialDataSet: any;
|
|
14
|
+
children: any;
|
|
15
|
+
}) => JSX.Element;
|
|
16
|
+
export declare const useDataSetContext: () => State;
|
|
@@ -0,0 +1,63 @@
|
|
|
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 { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { createContext, useContext, useEffect, useRef, } from "react";
|
|
14
|
+
import { rowIsEmpty } from "../SpreadsheetContextProvider/utils";
|
|
15
|
+
export var DataSetContext = createContext({});
|
|
16
|
+
export var DataSetContextProvider = function (_a) {
|
|
17
|
+
var initialDataSet = _a.initialDataSet, children = _a.children;
|
|
18
|
+
var dataSet = useRef(initialDataSet);
|
|
19
|
+
var dataSetLength = useRef(Object.keys(dataSet.current).length);
|
|
20
|
+
var emptyRecordIds = useRef(new Set());
|
|
21
|
+
var reset = function () {
|
|
22
|
+
emptyRecordIds.current = new Set();
|
|
23
|
+
};
|
|
24
|
+
useEffect(function () {
|
|
25
|
+
reset();
|
|
26
|
+
// without the hook, with the changes on where the context would
|
|
27
|
+
// live, the dataSet was not being correctly updated for the Match step
|
|
28
|
+
dataSet.current = initialDataSet;
|
|
29
|
+
dataSetLength.current = Object.keys(initialDataSet).length;
|
|
30
|
+
}, [initialDataSet]);
|
|
31
|
+
var getRecord = function (recordId) {
|
|
32
|
+
return dataSet.current[recordId];
|
|
33
|
+
};
|
|
34
|
+
var deleteRecord = function (recordId) {
|
|
35
|
+
if (dataSet.current[recordId]) {
|
|
36
|
+
dataSetLength.current -= 1;
|
|
37
|
+
}
|
|
38
|
+
delete dataSet.current[recordId];
|
|
39
|
+
};
|
|
40
|
+
var setRecord = function (recordId, record) {
|
|
41
|
+
if (!dataSet.current[recordId]) {
|
|
42
|
+
dataSetLength.current += 1;
|
|
43
|
+
}
|
|
44
|
+
if (rowIsEmpty(record)) {
|
|
45
|
+
emptyRecordIds.current.add(recordId);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
emptyRecordIds.current.delete(recordId);
|
|
49
|
+
}
|
|
50
|
+
dataSet.current[recordId] = record;
|
|
51
|
+
return getRecord(recordId);
|
|
52
|
+
};
|
|
53
|
+
var value = {
|
|
54
|
+
getRecord: getRecord,
|
|
55
|
+
setRecord: setRecord,
|
|
56
|
+
deleteRecord: deleteRecord,
|
|
57
|
+
dataSet: dataSet,
|
|
58
|
+
dataSetLength: dataSetLength,
|
|
59
|
+
emptyRecordIds: emptyRecordIds,
|
|
60
|
+
};
|
|
61
|
+
return (_jsx(DataSetContext.Provider, __assign({ value: value }, { children: children })));
|
|
62
|
+
};
|
|
63
|
+
export var useDataSetContext = function () { return useContext(DataSetContext); };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { DuplicateValuesCollection, Field, RecordDataSet } from "../../../../types";
|
|
3
|
+
type DuplicateDataProps = {
|
|
4
|
+
fields: Field[];
|
|
5
|
+
isReadOnly: boolean;
|
|
6
|
+
children: any;
|
|
7
|
+
};
|
|
8
|
+
export type State = {
|
|
9
|
+
duplicateRecordIds: Set<string>;
|
|
10
|
+
duplicateValues: MutableRefObject<DuplicateValuesCollection>;
|
|
11
|
+
fieldsWithUniquenessConstraints: MutableRefObject<Field[]>;
|
|
12
|
+
calculateDuplicateRecords: () => void;
|
|
13
|
+
updateDuplicateValues: (oldRecord: RecordDataSet, newRecord: RecordDataSet, initialValidation: boolean, updateRecordAndRevalidate: (record: RecordDataSet) => void) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare const DuplicateDataContext: React.Context<State>;
|
|
16
|
+
export declare const DuplicateDataContextProvider: ({ fields, isReadOnly, children, }: DuplicateDataProps) => JSX.Element;
|
|
17
|
+
export declare const useDuplicateDataContext: () => State;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
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 { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { useMemo, useRef, useState, createContext, useContext, } from "react";
|
|
14
|
+
import { RecordHashCalculator } from "../SpreadsheetContextProvider/hashCalculators";
|
|
15
|
+
import { useDataSetContext } from "../DataSetContextProvider";
|
|
16
|
+
export var DuplicateDataContext = createContext({});
|
|
17
|
+
export var DuplicateDataContextProvider = function (_a) {
|
|
18
|
+
var fields = _a.fields, isReadOnly = _a.isReadOnly, children = _a.children;
|
|
19
|
+
var _b = useState(new Set()), duplicateRecordIds = _b[0], setDuplicateRecordIds = _b[1];
|
|
20
|
+
var _c = useDataSetContext(), dataSet = _c.dataSet, getRecord = _c.getRecord;
|
|
21
|
+
var duplicateValues = useRef({});
|
|
22
|
+
var fieldsWithUniquenessConstraints = useRef([]);
|
|
23
|
+
var reset = function () {
|
|
24
|
+
fieldsWithUniquenessConstraints.current = [];
|
|
25
|
+
duplicateValues.current = {};
|
|
26
|
+
setDuplicateRecordIds(new Set());
|
|
27
|
+
};
|
|
28
|
+
var calculateFieldsWithUniquenessConstraints = function () {
|
|
29
|
+
var uniqueFields = fields.filter(function (f) {
|
|
30
|
+
if (!f.validations)
|
|
31
|
+
return;
|
|
32
|
+
return (f.validations.find(function (v) {
|
|
33
|
+
return (["unique_case_sensitive", "unique_case_insensitive"].indexOf(v.validation_type) >= 0);
|
|
34
|
+
}) !== undefined);
|
|
35
|
+
});
|
|
36
|
+
fieldsWithUniquenessConstraints.current = uniqueFields;
|
|
37
|
+
};
|
|
38
|
+
var updateDuplicateValues = function (oldRecord, newRecord, initialValidation, updateRecordAndRevalidate) {
|
|
39
|
+
fieldsWithUniquenessConstraints.current.forEach(function (f) {
|
|
40
|
+
duplicateValues.current[f.name] = duplicateValues.current[f.name] || {};
|
|
41
|
+
var duplicatesForField = duplicateValues.current[f.name];
|
|
42
|
+
var isCaseInsensitive = f.validations.find(function (v) { return v.validation_type === "unique_case_insensitive"; }) !== undefined;
|
|
43
|
+
var recordId = oldRecord._meta.id;
|
|
44
|
+
var oldValue = oldRecord[f.name];
|
|
45
|
+
var newValue = newRecord[f.name];
|
|
46
|
+
if (newValue === oldValue && !initialValidation) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (oldValue && !initialValidation) {
|
|
50
|
+
var oldValueAccessor = isCaseInsensitive
|
|
51
|
+
? oldValue.toLowerCase()
|
|
52
|
+
: oldValue;
|
|
53
|
+
if (duplicatesForField[oldValueAccessor]) {
|
|
54
|
+
var oldIndex = duplicatesForField[oldValueAccessor].indexOf(recordId);
|
|
55
|
+
if (oldIndex >= 0) {
|
|
56
|
+
duplicatesForField[oldValueAccessor].splice(oldIndex, 1);
|
|
57
|
+
}
|
|
58
|
+
if (duplicatesForField[oldValueAccessor].length === 1) {
|
|
59
|
+
var remainingRecordId = duplicatesForField[oldValueAccessor][0];
|
|
60
|
+
updateRecordAndRevalidate(getRecord(remainingRecordId));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (newValue) {
|
|
65
|
+
var newValueAccessor = isCaseInsensitive
|
|
66
|
+
? newValue.toLowerCase()
|
|
67
|
+
: newValue;
|
|
68
|
+
duplicatesForField[newValueAccessor] =
|
|
69
|
+
duplicatesForField[newValueAccessor] || [];
|
|
70
|
+
duplicatesForField[newValueAccessor].push(recordId);
|
|
71
|
+
if (duplicatesForField[newValueAccessor].length === 2) {
|
|
72
|
+
var firstRecordIdToHaveValue = duplicatesForField[newValueAccessor][0];
|
|
73
|
+
updateRecordAndRevalidate(getRecord(firstRecordIdToHaveValue));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
var calculateDuplicateRecords = function () {
|
|
79
|
+
var computeHashesForRecords = RecordHashCalculator().computeHashesForRecords;
|
|
80
|
+
computeHashesForRecords(dataSet.current, fields, function (hashes) {
|
|
81
|
+
var duplicateIds = hashes.map(function (hash) { return hash["id"]; });
|
|
82
|
+
setDuplicateRecordIds(new Set(duplicateIds));
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
useMemo(function () {
|
|
86
|
+
if (dataSet.current && !isReadOnly) {
|
|
87
|
+
reset();
|
|
88
|
+
calculateDuplicateRecords();
|
|
89
|
+
calculateFieldsWithUniquenessConstraints();
|
|
90
|
+
}
|
|
91
|
+
}, [dataSet.current]);
|
|
92
|
+
var value = {
|
|
93
|
+
duplicateRecordIds: duplicateRecordIds,
|
|
94
|
+
duplicateValues: duplicateValues,
|
|
95
|
+
fieldsWithUniquenessConstraints: fieldsWithUniquenessConstraints,
|
|
96
|
+
calculateDuplicateRecords: calculateDuplicateRecords,
|
|
97
|
+
updateDuplicateValues: updateDuplicateValues,
|
|
98
|
+
};
|
|
99
|
+
return (_jsx(DuplicateDataContext.Provider, __assign({ value: value }, { children: children })));
|
|
100
|
+
};
|
|
101
|
+
export var useDuplicateDataContext = function () { return useContext(DuplicateDataContext); };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { SpreadsheetFilter } from "../SpreadsheetContextProvider/useSpreadsheetFilter";
|
|
3
|
+
import { SortBy } from "../common/types";
|
|
4
|
+
export type State = {
|
|
5
|
+
filteredDataIds: string[];
|
|
6
|
+
filteredInputValue: string;
|
|
7
|
+
setFilteredInputValue: (value: string) => void;
|
|
8
|
+
sortByFieldErrors: string;
|
|
9
|
+
sortByFieldWarnings: string;
|
|
10
|
+
handleSortByFieldErrors: (field: string) => void;
|
|
11
|
+
handleSortByFieldWarnings: (field: string) => void;
|
|
12
|
+
resetSpreadsheetFilter: () => void;
|
|
13
|
+
filterRecordsByRowType: (filterByRow: string) => void;
|
|
14
|
+
filterRecordsByFieldErrors: (filterByColumn: string) => void;
|
|
15
|
+
sortBy: SortBy;
|
|
16
|
+
setSortBy: React.Dispatch<React.SetStateAction<SortBy>>;
|
|
17
|
+
spreadsheetFilter: SpreadsheetFilter;
|
|
18
|
+
isFiltering: boolean;
|
|
19
|
+
lastFilteredRecordId: MutableRefObject<string>;
|
|
20
|
+
setRecalculateFilters: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
|
+
};
|
|
22
|
+
type ContextArgs = {
|
|
23
|
+
getSortCompareFn: any;
|
|
24
|
+
children: any;
|
|
25
|
+
};
|
|
26
|
+
export declare const FilteredDataContext: React.Context<State>;
|
|
27
|
+
export declare const FilteredDataContextProvider: ({ getSortCompareFn, children, }: ContextArgs) => JSX.Element;
|
|
28
|
+
export declare const useFilteredDataContext: () => State;
|
|
29
|
+
export {};
|