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.
Files changed (129) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +38 -7
  2. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +1 -1
  3. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +4 -3
  4. package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +14 -9
  5. package/lib/esm/Importer/PreviewFirstTime.js +1 -1
  6. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +6 -6
  7. package/lib/esm/Importer/Review/ReviewContextProvider.js +51 -223
  8. package/lib/esm/Importer/Review/ReviewWithContext.js +2 -2
  9. package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +2 -1
  10. package/lib/esm/Importer/Stepper/StepperSubmitModal.js +4 -2
  11. package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +1 -1
  12. package/lib/esm/Importer/Stepper/index.js +20 -69
  13. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.d.ts +2 -1
  14. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +14 -86
  15. package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +11 -3
  16. package/lib/esm/Importer/Uploader/HeadersPreview.js +1 -1
  17. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.d.ts +16 -0
  18. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.js +63 -0
  19. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +18 -0
  20. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +101 -0
  21. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +29 -0
  22. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +150 -0
  23. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +6 -4
  24. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +37 -37
  25. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +6 -0
  26. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +138 -0
  27. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +7 -29
  28. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +11 -193
  29. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +5 -0
  30. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +72 -0
  31. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +4 -0
  32. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +46 -0
  33. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +2 -1
  34. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +31 -0
  35. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +304 -0
  36. package/lib/esm/Importer/common/Spreadsheet/common/index.js +5 -4
  37. package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -3
  38. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.d.ts +0 -2
  39. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +26 -11
  40. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +21 -13
  41. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +35 -36
  42. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowNumbers.js +3 -3
  43. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +5 -1
  44. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +44 -18
  45. package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.js +1 -2
  46. package/lib/esm/Importer/common/Spreadsheet/index.d.ts +0 -1
  47. package/lib/esm/Importer/common/Spreadsheet/index.js +1 -84
  48. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -2
  49. package/lib/esm/Importer/common/Spreadsheet/styles.js +13 -1
  50. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +2 -1
  51. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +9 -5
  52. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -2
  53. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +4 -16
  54. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.d.ts +5 -0
  55. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
  56. package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
  57. package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
  58. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
  59. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +16 -7
  60. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +4 -2
  61. package/lib/esm/Importer/contexts/ImporterContextProvider.js +121 -13
  62. package/lib/esm/Importer/data/index.d.ts +1 -0
  63. package/lib/esm/Importer/data/index.js +44 -5
  64. package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
  65. package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
  66. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
  67. package/lib/esm/Importer/hooks/useSubmitToServer.js +192 -0
  68. package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
  69. package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
  70. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
  71. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +108 -0
  72. package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
  73. package/lib/esm/common/FileUploadDropzone/index.js +1 -0
  74. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +55 -41
  75. package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -16
  76. package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
  77. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +38 -9
  78. package/lib/esm/common/Table/TableActions/RowFilters.js +53 -5
  79. package/lib/esm/common/Table/TableActions/SearchRows.js +3 -1
  80. package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
  81. package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
  82. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +1 -0
  83. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +25 -17
  84. package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
  85. package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
  86. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
  87. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +2 -2
  88. package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
  89. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  90. package/lib/esm/common/Table/TableView/index.js +6 -15
  91. package/lib/esm/common/Table/TableView/types.d.ts +8 -9
  92. package/lib/esm/common/Table/index.d.ts +2 -1
  93. package/lib/esm/common/Table/index.js +2 -2
  94. package/lib/esm/common/Toast.js +3 -2
  95. package/lib/esm/common/TooltipProvider.d.ts +2 -0
  96. package/lib/esm/common/TooltipProvider.js +12 -9
  97. package/lib/esm/common/buttons.d.ts +5 -1
  98. package/lib/esm/common/buttons.js +13 -7
  99. package/lib/esm/common/columnsTransformations.js +1 -1
  100. package/lib/esm/common/datePatterns.d.ts +1 -0
  101. package/lib/esm/common/datePatterns.js +10 -0
  102. package/lib/esm/common/icons/index.d.ts +1 -0
  103. package/lib/esm/common/icons/index.js +1 -0
  104. package/lib/esm/common/index.d.ts +1 -0
  105. package/lib/esm/common/index.js +1 -0
  106. package/lib/esm/common/inputs/Autocomplete.js +1 -1
  107. package/lib/esm/locales/de.d.ts +1 -1
  108. package/lib/esm/locales/de.js +1 -1
  109. package/lib/esm/locales/en.d.ts +1 -1
  110. package/lib/esm/locales/en.js +4 -4
  111. package/lib/esm/locales/es.d.ts +1 -1
  112. package/lib/esm/locales/es.js +1 -1
  113. package/lib/esm/locales/fr.d.ts +1 -1
  114. package/lib/esm/locales/fr.js +1 -1
  115. package/lib/esm/types.d.ts +20 -5
  116. package/lib/main.js +2 -2
  117. package/package.json +6 -4
  118. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
  119. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -36
  120. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
  121. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
  122. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
  123. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
  124. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -33
  125. package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -256
  126. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
  127. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
  128. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
  129. 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 { useState, useEffect } from "react";
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 setIsLoadingApp = useAppLoadingContext().setIsLoadingApp;
84
- var _e = useReviewContext(), appResponse = _e.appResponse, isSubmitDisabled = _e.isSubmitDisabled, onSubmit = _e.onSubmit;
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;
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
- (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]);
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 _enumFieldValueMatchings = getEnumFieldValueMatchingsInitialValue({
114
- uploadedDataEnumFieldValues: uploadedDataEnumFieldValues,
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
- declare const ImporterDropzone: () => JSX.Element;
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 { useUploaderContext } from "../UploaderContextProvider";
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 { addToast } from "../../../common/Toast";
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 Papa from "papaparse";
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 _b = _a.theme, colors = _b.colors, c = _b.css;
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 "])), theme.colors.blue100, theme.colors.blue500);
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 _a = useUploaderContext(), setIsUploading = _a.setIsUploading, setFileName = _a.setFileName;
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 onDrop = function (acceptedFiles) {
57
- acceptedFiles.forEach(function (file) {
58
- setIsUploading(true);
59
- setFileName(file.name);
60
- var reader = new FileReader();
61
- var isCsvFile = file.type === "text/csv";
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
- return templateError ? (_jsx(ErrorCard, {})) : (_jsx(_Fragment, { children: templateHeaders && (_jsxs(S.ImporterSectionContainer, { children: [_jsx(ImporterDropzone, {}), _jsx(HeaderCard, { templateHeaders: templateHeaders })] })) }));
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 {};