fuse-importer 0.27.0 → 0.30.0

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 (183) hide show
  1. package/lib/esm/Importer/ImporterWithContext.d.ts +2 -0
  2. package/lib/esm/Importer/ImporterWithContext.js +51 -13
  3. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +2 -2
  4. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +4 -3
  5. package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +14 -9
  6. package/lib/esm/Importer/Matcher/index.js +0 -11
  7. package/lib/esm/Importer/PreviewFirstTime.js +1 -1
  8. package/lib/esm/Importer/Review/AppResponseModal.js +2 -2
  9. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +8 -6
  10. package/lib/esm/Importer/Review/ReviewContextProvider.js +72 -195
  11. package/lib/esm/Importer/Review/ReviewWithContext.js +2 -2
  12. package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +2 -1
  13. package/lib/esm/Importer/Stepper/StepperSubmitModal.js +4 -2
  14. package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +1 -1
  15. package/lib/esm/Importer/Stepper/index.js +36 -13
  16. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.d.ts +2 -1
  17. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +15 -64
  18. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterSectionHeader/index.js +2 -2
  19. package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +11 -3
  20. package/lib/esm/Importer/Uploader/HeadersPreview.js +1 -1
  21. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.d.ts +16 -0
  22. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.js +63 -0
  23. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +19 -0
  24. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +155 -0
  25. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +29 -0
  26. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +150 -0
  27. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +6 -4
  28. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +38 -45
  29. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +7 -0
  30. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +152 -0
  31. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +7 -30
  32. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +10 -141
  33. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +5 -0
  34. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +81 -0
  35. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +5 -0
  36. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +119 -0
  37. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.d.ts +1 -1
  38. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.d.ts +1 -0
  39. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +8 -0
  40. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +31 -0
  41. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +324 -0
  42. package/lib/esm/Importer/common/Spreadsheet/common/index.js +18 -9
  43. package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -3
  44. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.d.ts +0 -2
  45. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +26 -11
  46. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.d.ts +6 -0
  47. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.js +88 -0
  48. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +25 -17
  49. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +48 -47
  50. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowNumbers.js +3 -3
  51. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.d.ts +1 -0
  52. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.js +7 -3
  53. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.d.ts +3 -1
  54. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +45 -11
  55. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.d.ts +12 -5
  56. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +81 -26
  57. package/lib/esm/Importer/common/Spreadsheet/components/fields/utils.d.ts +11 -0
  58. package/lib/esm/Importer/common/Spreadsheet/components/fields/utils.js +29 -0
  59. package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.js +1 -2
  60. package/lib/esm/Importer/common/Spreadsheet/index.d.ts +0 -1
  61. package/lib/esm/Importer/common/Spreadsheet/index.js +1 -84
  62. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -2
  63. package/lib/esm/Importer/common/Spreadsheet/styles.js +13 -1
  64. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +2 -2
  65. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +35 -13
  66. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.d.ts +5 -0
  67. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js +231 -0
  68. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/index.d.ts +18 -0
  69. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/index.js +179 -0
  70. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.d.ts +5 -0
  71. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
  72. package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
  73. package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
  74. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
  75. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +23 -7
  76. package/lib/esm/Importer/common/theme.d.ts +1 -0
  77. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +13 -4
  78. package/lib/esm/Importer/contexts/ImporterContextProvider.js +150 -21
  79. package/lib/esm/Importer/data/index.d.ts +7 -3
  80. package/lib/esm/Importer/data/index.js +49 -20
  81. package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
  82. package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
  83. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
  84. package/lib/esm/Importer/hooks/useSubmitToServer.js +214 -0
  85. package/lib/esm/Importer/index.d.ts +4 -3
  86. package/lib/esm/Importer/index.js +2 -2
  87. package/lib/esm/common/CircleSpinner.d.ts +1 -0
  88. package/lib/esm/common/CircleSpinner.js +13 -0
  89. package/lib/esm/common/ConfirmationModal.js +1 -1
  90. package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
  91. package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
  92. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
  93. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +143 -0
  94. package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
  95. package/lib/esm/common/FileUploadDropzone/index.js +1 -0
  96. package/lib/esm/common/Modal.js +2 -2
  97. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.d.ts +1 -0
  98. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +150 -0
  99. package/lib/esm/common/Table/TableActions/CustomActions/index.d.ts +1 -0
  100. package/lib/esm/common/Table/TableActions/CustomActions/index.js +1 -0
  101. package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -8
  102. package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
  103. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +41 -10
  104. package/lib/esm/common/Table/TableActions/RowFilters.js +63 -11
  105. package/lib/esm/common/Table/TableActions/SearchRows.js +28 -17
  106. package/lib/esm/common/Table/TableActions/TableActions.js +15 -4
  107. package/lib/esm/common/Table/TableActions/TableActions.styles.d.ts +1 -0
  108. package/lib/esm/common/Table/TableActions/TableActions.styles.js +4 -3
  109. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +6 -0
  110. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +71 -0
  111. package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
  112. package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
  113. package/lib/esm/common/Table/TableActions/icons.d.ts +3 -0
  114. package/lib/esm/common/Table/TableActions/icons.js +3 -0
  115. package/lib/esm/common/Table/TableActions/useFindAndReplace.d.ts +5 -0
  116. package/lib/esm/common/Table/TableActions/useFindAndReplace.js +45 -0
  117. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
  118. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +3 -3
  119. package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
  120. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  121. package/lib/esm/common/Table/TableView/index.js +7 -16
  122. package/lib/esm/common/Table/TableView/types.d.ts +9 -9
  123. package/lib/esm/common/Table/index.d.ts +2 -1
  124. package/lib/esm/common/Table/index.js +2 -2
  125. package/lib/esm/common/Toast.d.ts +42 -3
  126. package/lib/esm/common/Toast.js +56 -18
  127. package/lib/esm/common/TooltipProvider.d.ts +2 -0
  128. package/lib/esm/common/TooltipProvider.js +12 -9
  129. package/lib/esm/common/buttons.d.ts +5 -1
  130. package/lib/esm/common/buttons.js +19 -13
  131. package/lib/esm/common/columnsTransformations.d.ts +1 -0
  132. package/lib/esm/common/columnsTransformations.js +10 -16
  133. package/lib/esm/common/columnsValidations.d.ts +0 -26
  134. package/lib/esm/common/columnsValidations.js +1 -31
  135. package/lib/esm/common/datePatterns.d.ts +26 -0
  136. package/lib/esm/common/datePatterns.js +327 -0
  137. package/lib/esm/common/icons/index.d.ts +4 -0
  138. package/lib/esm/common/icons/index.js +6 -2
  139. package/lib/esm/common/index.d.ts +2 -0
  140. package/lib/esm/common/index.js +2 -0
  141. package/lib/esm/common/inputs/Autocomplete.js +2 -2
  142. package/lib/esm/common/inputs/Checkbox.d.ts +2 -1
  143. package/lib/esm/common/inputs/Checkbox.js +9 -7
  144. package/lib/esm/common/inputs/SelectMenu.d.ts +2 -1
  145. package/lib/esm/common/inputs/SelectMenu.js +14 -3
  146. package/lib/esm/common/inputs/TextInput.js +1 -1
  147. package/lib/esm/index.d.ts +3 -1
  148. package/lib/esm/index.js +9 -2
  149. package/lib/esm/locales/de.d.ts +13 -1
  150. package/lib/esm/locales/de.js +14 -2
  151. package/lib/esm/locales/en.d.ts +26 -1
  152. package/lib/esm/locales/en.js +30 -5
  153. package/lib/esm/locales/es.d.ts +13 -1
  154. package/lib/esm/locales/es.js +14 -2
  155. package/lib/esm/locales/fr.d.ts +13 -1
  156. package/lib/esm/locales/fr.js +14 -2
  157. package/lib/esm/styled/theme/colorPalette.d.ts +2 -0
  158. package/lib/esm/styled/theme/colorPalette.js +1 -0
  159. package/lib/esm/styled/theme/index.d.ts +1 -0
  160. package/lib/esm/styled/theme/textCss.js +1 -1
  161. package/lib/esm/types.d.ts +48 -5
  162. package/lib/esm/types.js +0 -1
  163. package/lib/esm/utils/index.d.ts +1 -0
  164. package/lib/esm/utils/index.js +4 -0
  165. package/lib/main.js +24 -24
  166. package/lib/main.js.LICENSE.txt +2 -0
  167. package/package.json +8 -6
  168. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
  169. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -33
  170. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
  171. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
  172. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
  173. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
  174. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -34
  175. package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -254
  176. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +0 -8
  177. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +0 -106
  178. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
  179. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
  180. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
  181. package/lib/esm/common/Table/TableActions/hooks.js +0 -41
  182. package/lib/esm/common/Table/TableView/CustomScrollbar.d.ts +0 -2
  183. package/lib/esm/common/Table/TableView/CustomScrollbar.js +0 -34
@@ -45,229 +45,79 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
45
45
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
46
  }
47
47
  };
48
- var __rest = (this && this.__rest) || function (s, e) {
49
- var t = {};
50
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
51
- t[p] = s[p];
52
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
53
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
54
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
55
- t[p[i]] = s[p[i]];
56
- }
57
- return t;
58
- };
59
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
60
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
61
- if (ar || !(i in from)) {
62
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
63
- ar[i] = from[i];
64
- }
65
- }
66
- return to.concat(ar || Array.prototype.slice.call(from));
67
- };
68
48
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
69
49
  import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
70
- import Papa from "papaparse";
50
+ import { useAppLoadingContext } from "../../common/AppLoadingContextProvider";
71
51
  import { AppLoading } from "../common/AppLoading";
72
- import { isRecordEmpty } from "../common/Spreadsheet/common";
73
- import { sendRecordsToIntegrations } from "../common/utils";
74
52
  import { useImporterContext } from "../contexts/ImporterContextProvider";
53
+ import { getPreviewDataSet, getReviewDataSet, getTemplateFields, } from "../data";
75
54
  import { transformToRecords } from "../data/index";
76
- import { getPreviewDataSet, getReviewDataSet, getTemplateFields, recordListToDataSet, } from "../data";
77
- import { useAppLoadingContext } from "../../common/AppLoadingContextProvider";
55
+ import { useSubmitToServer } from "../hooks/useSubmitToServer";
78
56
  var ReviewContext = createContext({});
79
- var trackImportedRowsCount = function (fuseApi, templateSlug, rowCount) { return __awaiter(void 0, void 0, void 0, function () {
80
- var error_1, errorMessage;
81
- var _a, _b;
82
- return __generator(this, function (_c) {
83
- switch (_c.label) {
84
- case 0:
85
- _c.trys.push([0, 2, , 3]);
86
- return [4 /*yield*/, fuseApi.post("/api/v1/importer/templates/".concat(templateSlug, "/imports"), {
87
- row_count: rowCount,
88
- })];
89
- case 1:
90
- _c.sent();
91
- return [3 /*break*/, 3];
92
- case 2:
93
- error_1 = _c.sent();
94
- errorMessage = ((_b = (_a = error_1 === null || error_1 === void 0 ? void 0 : error_1.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.error) ||
95
- "There was an error submitting your dataset";
96
- throw new Error(errorMessage);
97
- case 3: return [2 /*return*/];
98
- }
99
- });
100
- }); };
101
- var getImportWasSuccessful = function (response) {
102
- return !response.errors || !Object.keys(response.errors).length;
103
- };
104
- var filterAndMapWithBackendErrors = function (dataSet, errors) {
105
- return Object.keys(errors).map(function (rId) {
106
- var record = dataSet[rId];
107
- var meta = record === null || record === void 0 ? void 0 : record._meta;
108
- return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { isInvalid: true, backendErrors: errors[rId] }) });
109
- }, []);
110
- };
111
- function downloadCsv(data, fileName) {
112
- var blob = new Blob([data], { type: "text/csv;charset=utf-8;" });
113
- var link = document.createElement("a");
114
- link.href = URL.createObjectURL(blob);
115
- link.download = fileName;
116
- document.body.appendChild(link);
117
- link.click();
118
- document.body.removeChild(link);
119
- }
120
- function csvExport(data) {
121
- var valuesWithQuotesWhenNecessary = data.map(function (obj) {
122
- var newObj = {};
123
- for (var key in obj) {
124
- var value = obj[key];
125
- newObj[key] =
126
- typeof value === "string" && value.includes(",") ? "\"".concat(value, "\"") : value;
127
- }
128
- return newObj;
129
- });
130
- var csv = Papa.unparse(valuesWithQuotesWhenNecessary);
131
- downloadCsv(csv, "export.csv");
132
- }
133
57
  export var ReviewContextProvider = function (_a) {
134
58
  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;
59
+ var _b = useImporterContext(), templateHeaderMatchings = _b.templateHeaderMatchings, enumFieldValueMatchings = _b.enumFieldValueMatchings, templateHeaders = _b.templateHeaders, uploadedDataHeaders = _b.uploadedDataHeaders, headerRowIndex = _b.headerRowIndex, uploadedData = _b.uploadedData, currentStepIndex = _b.currentStepIndex, setSelectedRows = _b.setSelectedRows, _c = _b.importerOptions, disableSubmitIfInvalid = _c.disableSubmitIfInvalid, batchValidationDelayMs = _c.batchValidationDelayMs, batchValidationSize = _c.batchValidationSize, loadingComponent = _c.loadingComponent, onValidateRecord = _b.onValidateRecord, formatRecord = _b.formatRecord;
60
+ var _d = useState(false), hasTransformedRecords = _d[0], setHasTransformedRecords = _d[1];
61
+ var _e = useSubmitToServer(setHasTransformedRecords), appResponse = _e.appResponse, isSubmitting = _e.isSubmitting, importWasSuccessful = _e.importWasSuccessful, onSubmitToServer = _e.onSubmitToServer;
136
62
  var setIsLoadingApp = useAppLoadingContext().setIsLoadingApp;
137
- var _d = useState(false), isSubmitting = _d[0], setIsSubmitting = _d[1];
138
- var _e = useState(false), isSubmitDisabled = _e[0], setIsSubmitDisabled = _e[1];
139
- var _f = useState(false), importWasSuccessful = _f[0], setImportWasSuccessful = _f[1];
140
- var _g = useState(null), appResponse = _g[0], setAppResponse = _g[1];
141
- var _h = useState([]), previewFields = _h[0], setPreviewFields = _h[1];
142
- var _j = useState(null), previewInitialDataSet = _j[0], setPreviewInitialDataSet = _j[1];
143
- var _k = useState([]), reviewFields = _k[0], setReviewFields = _k[1];
144
- var _l = useState(null), reviewInitialDataSet = _l[0], setReviewInitialDataSet = _l[1];
145
- var _m = useState(null), initialDataSetUpdatedAt = _m[0], setInitialDataSetUpdatedAt = _m[1];
63
+ var _f = useState([]), previewFields = _f[0], setPreviewFields = _f[1];
64
+ var _g = useState(null), previewInitialDataSet = _g[0], setPreviewInitialDataSet = _g[1];
65
+ var _h = useState([]), reviewFields = _h[0], setReviewFields = _h[1];
66
+ var reviewInitialDataSet = useRef(null);
67
+ var _j = useState(null), initialDataSetUpdatedAt = _j[0], setInitialDataSetUpdatedAt = _j[1];
68
+ var _k = useState(false), _ = _k[0], setInefficientRerender = _k[1];
69
+ var setReviewInitialDataSetDeprecated = function (dataSet) {
70
+ reviewInitialDataSet.current = dataSet;
71
+ setInefficientRerender(function (prev) { return !prev; });
72
+ };
146
73
  useEffect(function () {
147
74
  if (currentStepIndex === 1)
148
- setReviewInitialDataSet(null);
75
+ setReviewInitialDataSetDeprecated(null);
149
76
  }, [currentStepIndex]);
150
77
  var reviewDataSetRef = useRef(null);
151
78
  var options = useMemo(function () { return ({
152
79
  batchValidationDelayMs: batchValidationDelayMs,
153
80
  batchValidationSize: batchValidationSize,
154
81
  }); }, [batchValidationDelayMs, batchValidationSize]);
155
- var onExport = useCallback(function (dataType) {
156
- if (!reviewDataSetRef.current)
157
- return;
158
- var dataSet = reviewDataSetRef.current;
159
- var dataSetValues = Object.values(dataSet);
160
- if (dataType === "csv") {
161
- var valuesWithoutMeta = dataSetValues.map(function (_a) {
162
- var _meta = _a._meta, rest = __rest(_a, ["_meta"]);
163
- return rest;
164
- });
165
- csvExport(valuesWithoutMeta);
166
- }
167
- }, [reviewFields, selectedRows]);
168
- 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, error_2;
170
- return __generator(this, function (_b) {
171
- switch (_b.label) {
172
- case 0:
173
- _b.trys.push([0, 5, 6, 7]);
174
- if (!reviewDataSetRef.current)
175
- return [2 /*return*/];
176
- setIsSubmitting(true);
177
- dataSet = reviewDataSetRef.current;
178
- dataSetValues = Object.values(dataSet);
179
- validDataSetValues = dataSetValues.filter(function (record) {
180
- return !record._meta.isInvalid && !isRecordEmpty(record, reviewFields);
181
- });
182
- validDataSetLength = validDataSetValues.length;
183
- invalidRecords_1 = dataSetValues.filter(function (v) { return v._meta.isInvalid; });
184
- return [4 /*yield*/, onSubmit(validDataSetValues)];
185
- case 1:
186
- applicationResponse = _b.sent();
187
- isAppResponseSuccessful = getImportWasSuccessful(applicationResponse);
188
- if (!isAppResponseSuccessful) {
189
- _a = (applicationResponse !== null && applicationResponse !== void 0 ? applicationResponse : {}).errors, errors = _a === void 0 ? {} : _a;
190
- invalidRecords_1 = __spreadArray(__spreadArray([], filterAndMapWithBackendErrors(dataSet, errors), true), invalidRecords_1, true);
191
- }
192
- isDataValid = invalidRecords_1.length === 0;
193
- setImportWasSuccessful(isDataValid && isAppResponseSuccessful);
194
- setAppResponse(applicationResponse);
195
- if (applicationResponse.recordsToDisplay) {
196
- recordsToDisplayFiltered = applicationResponse.recordsToDisplay.filter(function (record) {
197
- var recordId = record._meta.id;
198
- return !invalidRecords_1.some(function (invalidRecord) { return invalidRecord._meta.id === recordId; });
199
- });
200
- invalidRecords_1 = __spreadArray(__spreadArray([], invalidRecords_1, true), (recordsToDisplayFiltered || []), true);
201
- }
202
- invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields);
203
- setReviewInitialDataSet(invalidDataSet);
204
- if (!!previewMode) return [3 /*break*/, 4];
205
- return [4 /*yield*/, trackImportedRowsCount(fuseApi, templateSlug, validDataSetLength)];
206
- case 2:
207
- _b.sent();
208
- return [4 /*yield*/, sendRecordsToIntegrations(dataSetValues, integrations)];
209
- case 3:
210
- _b.sent();
211
- _b.label = 4;
212
- case 4: return [3 /*break*/, 7];
213
- case 5:
214
- error_2 = _b.sent();
215
- console.error(error_2);
216
- return [3 /*break*/, 7];
217
- case 6:
218
- setIsSubmitting(false);
219
- return [7 /*endfinally*/];
220
- case 7: return [2 /*return*/];
221
- }
222
- });
223
- }); }, [reviewFields, onSubmit]);
224
82
  var onDataSetChanged = useCallback(function (dataSet) {
225
83
  reviewDataSetRef.current = dataSet;
226
84
  }, []);
227
- var onValidationStateChanged = useCallback(function (state) {
228
- var isInvalid = !state.isValid;
229
- var isValidating = !state.isValidationCompleted;
230
- var disableSubmitIfInvalidFromOption = disableSubmitIfInvalid === undefined ? true : false;
231
- var isDisabled = (disableSubmitIfInvalidFromOption && isInvalid) || isValidating;
232
- setIsSubmitDisabled(isDisabled);
233
- }, [disableSubmitIfInvalid]);
234
85
  useEffect(function () {
235
86
  if (!uploadedData && currentStepIndex === 0) {
236
87
  //Reset data to clean the memory
237
88
  setPreviewFields([]);
238
- setPreviewInitialDataSet(null);
239
89
  setReviewFields([]);
240
- setReviewInitialDataSet(null);
90
+ setReviewInitialDataSetDeprecated(null);
241
91
  reviewDataSetRef.current = null;
242
92
  return;
243
93
  }
244
- var sleep = function (n) { return new Promise(function (resolve) { return setTimeout(resolve, n); }); };
94
+ var sleep = function (n) {
95
+ return new Promise(function (resolve) { return setTimeout(resolve, n); });
96
+ };
245
97
  if (currentStepIndex === 0) {
246
- if (!previewInitialDataSet) {
247
- //Uploader spreadsheet data
248
- var _a = getPreviewDataSet({ uploadedData: uploadedData }), fields = _a.fields, initialDataSet = _a.initialDataSet;
249
- setPreviewFields(fields);
250
- setPreviewInitialDataSet(initialDataSet);
251
- }
98
+ //Uploader spreadsheet data
99
+ var _a = getPreviewDataSet({ uploadedData: uploadedData }), fields = _a.fields, initialDataSet = _a.initialDataSet;
100
+ setPreviewFields(fields);
101
+ setPreviewInitialDataSet(initialDataSet);
102
+ setInitialDataSetUpdatedAt(Date.now());
252
103
  }
253
104
  else if (currentStepIndex === 2) {
254
105
  setIsLoadingApp(true);
255
106
  (function () { return __awaiter(void 0, void 0, void 0, function () {
256
- var fields, _records, initialDataSet;
257
- return __generator(this, function (_a) {
258
- switch (_a.label) {
107
+ var generateRecords, fields, records, _a, isDatasetTransformed, initialDataSet;
108
+ return __generator(this, function (_b) {
109
+ switch (_b.label) {
259
110
  case 0:
260
- if (!(uploadedData.length > 10000)) return [3 /*break*/, 2];
111
+ if (!(uploadedData && uploadedData.length > 1000)) return [3 /*break*/, 2];
261
112
  // wait for the first render to complete before blocking main thread with review step logic
262
113
  return [4 /*yield*/, sleep(200)];
263
114
  case 1:
264
115
  // wait for the first render to complete before blocking main thread with review step logic
265
- _a.sent();
266
- _a.label = 2;
116
+ _b.sent();
117
+ _b.label = 2;
267
118
  case 2:
268
- fields = getTemplateFields({ templateHeaders: templateHeaders });
269
- _records = initialRecords ||
270
- transformToRecords({
119
+ generateRecords = function () {
120
+ return transformToRecords({
271
121
  templateHeaderMatchings: templateHeaderMatchings,
272
122
  enumFieldValueMatchings: enumFieldValueMatchings,
273
123
  templateHeaders: templateHeaders,
@@ -275,37 +125,64 @@ export var ReviewContextProvider = function (_a) {
275
125
  uploadedData: uploadedData.slice(headerRowIndex + 1),
276
126
  formatRecord: formatRecord,
277
127
  });
278
- initialDataSet = getReviewDataSet({
279
- records: _records,
128
+ };
129
+ fields = getTemplateFields({ templateHeaders: templateHeaders });
130
+ records = initialRecords !== null && initialRecords !== void 0 ? initialRecords : generateRecords();
131
+ _a = getReviewDataSet({
132
+ records: records,
280
133
  fields: fields,
281
- }).initialDataSet;
134
+ }), isDatasetTransformed = _a.isDatasetTransformed, initialDataSet = _a.initialDataSet;
135
+ if (isDatasetTransformed)
136
+ setHasTransformedRecords(true);
282
137
  setSelectedRows([]);
283
138
  setReviewFields(fields);
284
- setReviewInitialDataSet(initialDataSet);
139
+ setReviewInitialDataSetDeprecated(initialDataSet);
285
140
  setInitialDataSetUpdatedAt(Date.now());
286
- setIsLoadingApp(false);
287
141
  return [2 /*return*/];
288
142
  }
289
143
  });
290
144
  }); })();
291
145
  }
292
- }, [uploadedData, currentStepIndex, templateHeaders, uploadedData]);
146
+ }, [currentStepIndex, templateHeaders, uploadedData]);
147
+ var onSubmit = useCallback(function (dataSet) { return __awaiter(void 0, void 0, void 0, function () {
148
+ return __generator(this, function (_a) {
149
+ switch (_a.label) {
150
+ case 0:
151
+ // passing a callback to the onSubmit function (from hook) to get
152
+ // access to the functions declared inside the context provider
153
+ return [4 /*yield*/, onSubmitToServer(dataSet, function (invalidDataSet) {
154
+ setReviewInitialDataSetDeprecated(invalidDataSet);
155
+ setInitialDataSetUpdatedAt(Date.now());
156
+ })];
157
+ case 1:
158
+ // passing a callback to the onSubmit function (from hook) to get
159
+ // access to the functions declared inside the context provider
160
+ _a.sent();
161
+ return [2 /*return*/];
162
+ }
163
+ });
164
+ }); }, [
165
+ setReviewInitialDataSetDeprecated,
166
+ setInitialDataSetUpdatedAt,
167
+ onSubmitToServer,
168
+ ]);
293
169
  var value = {
294
170
  previewInitialDataSet: previewInitialDataSet,
295
171
  previewFields: previewFields,
296
- reviewInitialDataSet: reviewInitialDataSet,
172
+ reviewInitialDataSet: reviewInitialDataSet.current,
297
173
  reviewFields: reviewFields,
298
- isSubmitDisabled: isSubmitDisabled,
299
174
  importWasSuccessful: importWasSuccessful,
300
175
  appResponse: appResponse,
301
176
  isSubmitting: isSubmitting,
302
177
  options: options,
303
178
  initialDataSetUpdatedAt: initialDataSetUpdatedAt,
304
- onSubmit: onSubmitData,
305
- onExport: onExport,
179
+ onSubmit: onSubmit,
306
180
  onValidateRecord: onValidateRecord,
307
181
  onDataSetChanged: onDataSetChanged,
308
- onValidationStateChanged: onValidationStateChanged,
182
+ setReviewInitialDataSetDeprecated: setReviewInitialDataSetDeprecated,
183
+ setInitialDataSetUpdatedAt: setInitialDataSetUpdatedAt,
184
+ hasTransformedRecords: hasTransformedRecords,
185
+ setHasTransformedRecords: setHasTransformedRecords,
309
186
  };
310
187
  function renderLoading() {
311
188
  return isSubmitting ? (loadingComponent ? (loadingComponent()) : (_jsx(AppLoading, {}))) : null;
@@ -23,10 +23,10 @@ import { AppResponseModal } from "./AppResponseModal";
23
23
  import { useReviewContext } from "./ReviewContextProvider";
24
24
  var TitleContainer = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject([""], [""])));
25
25
  var ReviewWithContext = function () {
26
- var _a = useReviewContext(), fields = _a.reviewFields, initialDataSet = _a.reviewInitialDataSet, options = _a.options, initialDataSetUpdatedAt = _a.initialDataSetUpdatedAt, onValidateRecord = _a.onValidateRecord, onDataSetChanged = _a.onDataSetChanged, onValidationStateChanged = _a.onValidationStateChanged;
26
+ var _a = useReviewContext(), fields = _a.reviewFields, initialDataSet = _a.reviewInitialDataSet, options = _a.options, initialDataSetUpdatedAt = _a.initialDataSetUpdatedAt, onValidateRecord = _a.onValidateRecord, onDataSetChanged = _a.onDataSetChanged;
27
27
  var _b = useImporterContext(), selectedRows = _b.selectedRows, setSelectedRows = _b.setSelectedRows, isUsingManualImport = _b.isUsingManualImport;
28
28
  var t = useTranslation("review").t;
29
- var spreadsheetUI = initialDataSet && (_jsx(Spreadsheet, { initialDataSetUpdatedAt: initialDataSetUpdatedAt, options: __assign(__assign({}, options), { showCheckboxColumn: true }), selectedRows: selectedRows, setSelectedRows: setSelectedRows, initialDataSet: initialDataSet, fields: fields, onDataSetChanged: onDataSetChanged, onValidateRecord: onValidateRecord, onValidationStateChanged: onValidationStateChanged }));
29
+ var spreadsheetUI = initialDataSet && (_jsx(Spreadsheet, { initialDataSetUpdatedAt: initialDataSetUpdatedAt, options: __assign(__assign({}, options), { showCheckboxColumn: true }), selectedRows: selectedRows, setSelectedRows: setSelectedRows, initialDataSet: initialDataSet, fields: fields, onDataSetChanged: onDataSetChanged, onValidateRecord: onValidateRecord }));
30
30
  return (_jsxs(Div, __assign({ centered: true, flexColumn: true, h100: true }, { children: [_jsx(AppResponseModal, {}), _jsxs(Div, __assign({ w100: true, h100: true, flexColumn: true }, { children: [_jsx(TitleContainer, __assign({ flexColumn: true, ml: 32 }, { children: _jsx(Div, __assign({ h2: true, mt: 40, mb: 40 }, { children: t(isUsingManualImport.current ? "manual_importer_title" : "title") })) })), _jsx(Div, __assign({ h100: true, w100: true, justifyCenter: true }, { children: spreadsheetUI }))] }))] })));
31
31
  };
32
32
  export default ReviewWithContext;
@@ -1,7 +1,8 @@
1
+ import { RecordDataSet } from "../../types";
1
2
  type StepperSubmitModalProps = {
2
3
  isSubmitModalOpen: boolean;
3
4
  onCloseModal: () => void;
4
- onSubmit: () => void;
5
+ onSubmit: (dataSet: RecordDataSet) => void;
5
6
  };
6
7
  export declare const StepperSubmitModal: ({ isSubmitModalOpen, onCloseModal, onSubmit, }: StepperSubmitModalProps) => JSX.Element;
7
8
  export {};
@@ -14,11 +14,13 @@ import { Div } from "../../styled";
14
14
  import { Button, Modal } from "../../common";
15
15
  import { submitIcon } from "./common/icons";
16
16
  import { useTranslation } from "react-i18next";
17
+ import { useDataSetContext } from "../../Importer/common/Spreadsheet/DataSetContextProvider";
17
18
  export var StepperSubmitModal = function (_a) {
18
19
  var isSubmitModalOpen = _a.isSubmitModalOpen, onCloseModal = _a.onCloseModal, onSubmit = _a.onSubmit;
19
20
  var t = useTranslation("general").t;
20
- return (_jsx(Modal, __assign({ isOpen: isSubmitModalOpen, onClose: function () { return onCloseModal(); } }, { children: _jsxs(Div, __assign({ centered: true, flexColumn: true, p: 60 }, { children: [_jsx(Div, { children: submitIcon }), _jsx(Div, __assign({ h5: true, mt: 20 }, { children: t("submit_modal.title") })), _jsx(Div, __assign({ body1: true, mt: 12, w: 448, textAlignCenter: true }, { children: t("submit_modal.description") })), _jsxs(Div, __assign({ dflex: true, mt: 40, w100: true, centered: true }, { children: [_jsx(Button, __assign({ w: 115, variant: "secondary", mr: 10, onClick: function () { return onCloseModal(); }, "data-test-id": "submit-modal-go-back" }, { children: t("submit_modal.cancel") })), _jsx(Button, __assign({ w: 140, ml: 10, onClick: function () {
21
- onSubmit();
21
+ var dataSet = useDataSetContext().dataSet;
22
+ return (_jsx(Modal, __assign({ isOpen: isSubmitModalOpen, onClose: function () { return onCloseModal(); } }, { children: _jsxs(Div, __assign({ centered: true, flexColumn: true, p: 60 }, { children: [_jsx(Div, { children: submitIcon }), _jsx(Div, __assign({ h5: true, mt: 20, "data-cy": "submit-modal-title" }, { children: t("submit_modal.title") })), _jsx(Div, __assign({ body1: true, mt: 12, w: 448, textAlignCenter: true, "data-cy": "submit-modal-description" }, { children: t("submit_modal.description") })), _jsxs(Div, __assign({ dflex: true, mt: 40, w100: true, centered: true }, { children: [_jsx(Button, __assign({ w: 115, variant: "secondary", mr: 10, onClick: function () { return onCloseModal(); }, "data-test-id": "submit-modal-go-back" }, { children: t("submit_modal.cancel") })), _jsx(Button, __assign({ "data-cy": "yes-submit", w: 140, ml: 10, onClick: function () {
23
+ onSubmit(dataSet === null || dataSet === void 0 ? void 0 : dataSet.current);
22
24
  onCloseModal();
23
25
  } }, { children: t("submit_modal.submit") }))] }))] })) })));
24
26
  };
@@ -27,5 +27,5 @@ export var UnmatchedHeadersModal = function (_a) {
27
27
  })
28
28
  : t("unmatched_headers_modal.description_plural", {
29
29
  count: unmatchedHeadersCount,
30
- }) })), _jsxs(Div, __assign({ dflex: true, centered: true, mt: 40 }, { children: [_jsx(Button, __assign({ variant: "secondary", onClick: function () { return onCloseUnmatchedHeadersModal(); }, w: 160, mr: 16 }, { children: t("unmatched_headers_modal.assign_headers") })), _jsx(Button, __assign({ variant: "primary", onClick: skipStep }, { children: t("unmatched_headers_modal.skip") }))] }))] })) })));
30
+ }) })), _jsxs(Div, __assign({ dflex: true, centered: true, mt: 40 }, { children: [_jsx(Button, __assign({ variant: "secondary", onClick: function () { return onCloseUnmatchedHeadersModal(); }, w: 160, mr: 16 }, { children: t("unmatched_headers_modal.assign_headers") })), _jsx(Button, __assign({ "data-cy": "skip", variant: "primary", onClick: skipStep }, { children: t("unmatched_headers_modal.skip") }))] }))] })) })));
31
31
  };
@@ -14,10 +14,12 @@ var __assign = (this && this.__assign) || function () {
14
14
  return __assign.apply(this, arguments);
15
15
  };
16
16
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
17
- import { useState } from "react";
17
+ import { useEffect, useState } from "react";
18
18
  import { useTranslation } from "react-i18next";
19
19
  import styled, { css } from "styled-components";
20
+ import { useValidationContext } from "../../Importer/common/Spreadsheet/ValidationContextProvider";
20
21
  import { Button, ChevronRightIcon, closeIconCondensed } from "../../common";
22
+ import { useEventManagerContext } from "../../common/EventManagerContextProvider";
21
23
  import { Div } from "../../styled/utils";
22
24
  import { ColumnType } from "../Matcher/common/types";
23
25
  import { useReviewContext } from "../Review/ReviewContextProvider";
@@ -26,7 +28,7 @@ import { ConfirmCloseModal } from "./ConfirmCloseModal";
26
28
  import { Step } from "./Step";
27
29
  import { StepperSubmitModal } from "./StepperSubmitModal";
28
30
  import { UnmatchedHeadersModal } from "./UnmatchedHeadersModal";
29
- import { getEnumFieldValueMatchingsInitialValue } from "./common/getEnumFieldValueMatchingsInitialValue";
31
+ import { useDataSetContext } from "../common/Spreadsheet/DataSetContextProvider";
30
32
  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
33
  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
34
  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,21 +45,42 @@ export var Stepper = function (_a) {
43
45
  var t = useTranslation("general").t;
44
46
  var _c = useState(false), isSubmitModalOpen = _c[0], setIsSubmitModalOpen = _c[1];
45
47
  var _d = useState(false), isConfirmCloseModalOpen = _d[0], setIsConfirmCloseModalOpen = _d[1];
46
- 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;
48
+ var _e = useDataSetContext(), dataSetLength = _e.dataSetLength, emptyRecordIds = _e.emptyRecordIds;
49
+ var _f = useState(true), isSubmitDisabled = _f[0], setIsSubmitDisabled = _f[1];
50
+ var headerMappingsLoaded = useImporterContext().headerMappingsLoaded;
51
+ var _g = useReviewContext(), appResponse = _g.appResponse, onSubmit = _g.onSubmit;
52
+ var _h = useValidationContext(), totalErrorCount = _h.totalErrorCount, spreadsheetInitialized = _h.spreadsheetInitialized;
53
+ var _j = useEventManagerContext(), on = _j.on, off = _j.off, EVENTS = _j.EVENTS;
54
+ var updateSpreadsheetDisabled = function () {
55
+ var isSpreadsheetEmpty = dataSetLength.current === emptyRecordIds.current.size;
56
+ var isDisabled = totalErrorCount.current > 0 ||
57
+ !spreadsheetInitialized ||
58
+ isSpreadsheetEmpty;
59
+ setIsSubmitDisabled(isDisabled);
60
+ };
61
+ useEffect(function () {
62
+ on(EVENTS.UPDATE_TOTAL_ERROR_COUNT, updateSpreadsheetDisabled);
63
+ return function () {
64
+ off(EVENTS.UPDATE_TOTAL_ERROR_COUNT, updateSpreadsheetDisabled);
65
+ };
66
+ }, [appResponse, spreadsheetInitialized]);
67
+ useEffect(function () {
68
+ updateSpreadsheetDisabled();
69
+ }, [spreadsheetInitialized]);
70
+ var _k = useImporterContext(), initialRecords = _k.initialRecords, currentStepIndex = _k.currentStepIndex, templateHeaderMatchings = _k.templateHeaderMatchings, matcherSubstep = _k.matcherSubstep, templateHeaders = _k.templateHeaders, setMatcherSubstep = _k.setMatcherSubstep, setCurrentStepIndex = _k.setCurrentStepIndex, onClose = _k.onClose, isUsingManualImport = _k.isUsingManualImport, resetImporterWhenUsingManualImport = _k.resetImporterWhenUsingManualImport, uploadedData = _k.uploadedData;
71
+ var _l = useState(true), isContinueDisabled = _l[0], setIsContinueDisabled = _l[1];
48
72
  var templateHeaderLabels = Object.keys(templateHeaderMatchings || []);
49
73
  var unmatchedHeadersCount = templateHeaderLabels.filter(function (templateHeaderLabel) { return !templateHeaderMatchings[templateHeaderLabel]; }).length;
50
74
  var isLastSubMatchStep = matcherSubstep === 1;
75
+ useEffect(function () {
76
+ setIsContinueDisabled(currentStepIndex === 1 && !headerMappingsLoaded);
77
+ }, [currentStepIndex, headerMappingsLoaded]);
51
78
  var setStep = function () {
52
- var templateHasEnumFields = !!(templateHeaders === null || templateHeaders === void 0 ? void 0 : templateHeaders.find(function (header) { return header.column_type === ColumnType.enum; }));
79
+ var templateEnumFields = templateHeaders === null || templateHeaders === void 0 ? void 0 : templateHeaders.filter(function (header) { return header.column_type === ColumnType.enum; });
80
+ var templateHasEnumFields = !!(templateEnumFields === null || templateEnumFields === void 0 ? void 0 : templateEnumFields.length);
53
81
  if (templateHasEnumFields) {
54
- var _enumFieldValueMatchings = getEnumFieldValueMatchingsInitialValue({
55
- uploadedDataEnumFieldValues: uploadedDataEnumFieldValues,
56
- templateHeaders: templateHeaders,
57
- });
58
- var anyTemplateEnumFieldsMatched = Object.keys(_enumFieldValueMatchings).length > 0;
59
- if (anyTemplateEnumFieldsMatched) {
60
- setEnumFieldValueMatchings(_enumFieldValueMatchings);
82
+ var templateEnumFieldsWithHeaderMatchings = templateEnumFields.filter(function (header) { return !!templateHeaderMatchings[header.label]; });
83
+ if (templateEnumFieldsWithHeaderMatchings.length > 0) {
61
84
  setMatcherSubstep(1);
62
85
  }
63
86
  else {
@@ -110,7 +133,7 @@ export var Stepper = function (_a) {
110
133
  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));
111
134
  }) })));
112
135
  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") })) }))] }))) })));
113
- 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 }))] })));
136
+ var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ "data-cy": "continue-button", isDisabled: isContinueDisabled, 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 }))] })));
114
137
  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 () {
115
138
  return setIsUnmatchedHeadersModalOpen(false);
116
139
  } }), _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,36 +14,31 @@ 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";
23
+ import { Button, addToast, useDragAndDrop, } from "../../../common";
28
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) {
29
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; });
30
26
  });
31
27
  var DropzoneUploadingContainer = styled(Div)(function (_a) {
32
- var _b = _a.theme, colors = _b.colors, c = _b.css;
33
- 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);
34
30
  });
35
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!" }))] }) })));
36
32
  var DragAndDropComponent = function (_a) {
37
33
  var openUploadFileDialog = _a.openUploadFileDialog;
38
34
  var t = useTranslation("upload").t;
39
35
  var manualDataImportSelected = useImporterContext().manualDataImportSelected;
40
- 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") })) })] })));
41
37
  };
42
- var ImporterDropzone = function () {
43
- var _a = useUploaderContext(), setIsUploading = _a.setIsUploading, setFileName = _a.setFileName;
44
- var setUploadedData = useImporterContext().setUploadedData;
38
+ var ImporterDropzone = function (_a) {
39
+ var onComplete = _a.onComplete, setIsLoading = _a.setIsLoading, saveFileName = _a.saveFileName;
45
40
  var validHeadersCount = function (headersLength) {
46
- var headersCountLimit = 60;
41
+ var headersCountLimit = 70;
47
42
  if (headersLength > headersCountLimit) {
48
43
  addToast("File cannot contain more than ".concat(headersCountLimit, " columns"), "error");
49
44
  return false;
@@ -52,56 +47,12 @@ var ImporterDropzone = function () {
52
47
  return true;
53
48
  }
54
49
  };
55
- var onDrop = function (acceptedFiles) {
56
- acceptedFiles.forEach(function (file) {
57
- setIsUploading(true);
58
- setFileName(file.name);
59
- var reader = new FileReader();
60
- reader.onabort = function () { return console.log("file reading was aborted"); };
61
- reader.onerror = function () { return console.log("file reading has failed"); };
62
- reader.onload = function (event) {
63
- var _a;
64
- var results = event.target.result;
65
- var getDataFromFile = function (fileResults) {
66
- var csvString = new TextDecoder().decode(fileResults instanceof ArrayBuffer
67
- ? fileResults
68
- : new TextEncoder().encode(fileResults));
69
- var data = Papa.parse(csvString).data;
70
- return data;
71
- };
72
- var fileData = getDataFromFile(results);
73
- var headersCount = (_a = fileData[0]) === null || _a === void 0 ? void 0 : _a.length;
74
- if (validHeadersCount(headersCount)) {
75
- setUploadedData(fileData);
76
- }
77
- setIsUploading(false);
78
- };
79
- reader.readAsArrayBuffer(file);
80
- });
81
- };
82
- var onDropRejected = function (rejectedFiles) {
83
- var errorMessages = rejectedFiles.map(function (file) {
84
- if (file.errors[0].code === "file-too-large") {
85
- return "Maximum file size is 200MB";
86
- }
87
- else {
88
- return file.errors[0].message;
89
- }
90
- });
91
- var uniqueMessages = Array.from(new Set(errorMessages));
92
- uniqueMessages.forEach(function (message) {
93
- addToast(message, "error");
94
- });
95
- };
96
- var _b = useDropzone({
97
- onDrop: onDrop,
98
- onDropRejected: onDropRejected,
99
- noClick: true,
100
- noKeyboard: true,
101
- accept: ".csv",
102
- maxFiles: 1,
103
- maxSize: 200000000, // 200MB
104
- }), 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;
105
56
  return (_jsxs(DragAndDropCard, __assign({ isDragActive: isDragActive, centered: true, pRelative: true }, getRootProps(), { children: [_jsx("input", __assign({}, getInputProps())), isDragActive && dropzoneUploadingUI, _jsx(DragAndDropComponent, { openUploadFileDialog: open })] })));
106
57
  };
107
58
  export { ImporterDropzone };
@@ -28,7 +28,7 @@ var HeadersList = function (_a) {
28
28
  var title = _a.title, headers = _a.headers, props = __rest(_a, ["title", "headers"]);
29
29
  return (_jsxs(_Fragment, { children: [_jsx(Div, __assign({ label3: true }, props, { children: title })), headers.map(function (header, index) {
30
30
  var isLast = index === headers.length - 1;
31
- return (_jsx(S.HeaderListItem, __assign({ body1: true, isLast: isLast, mt: 16 }, { children: header }), index));
31
+ return (_jsx(S.HeaderListItem, __assign({ body1: true, "data-cy": header, isLast: isLast, mt: 16 }, { children: header }), index));
32
32
  })] }));
33
33
  };
34
34
  export var HeaderCard = function (_a) {
@@ -40,5 +40,5 @@ export var HeaderCard = function (_a) {
40
40
  .filter(function (h) { return !h.required; })
41
41
  .map(function (h) { return h.label; });
42
42
  var t = useTranslation("upload").t;
43
- return (_jsx(S.HeaderCardWrapper, { children: _jsxs(S.HeaderCardContainer, __assign({}, props, { children: [_jsx(Div, __assign({ body3: true, mb: 24 }, { children: t("header.title") })), requiredHeaders.length > 0 && (_jsx(HeadersList, { title: t("header.required_headers"), headers: requiredHeaders })), optionalHeaders.length > 0 && (_jsx(HeadersList, { title: t("header.optional_headers"), headers: optionalHeaders, mt: 30 }))] })) }));
43
+ return (_jsx(S.HeaderCardWrapper, { children: _jsxs(S.HeaderCardContainer, __assign({}, props, { children: [_jsx(Div, __assign({ "data-cy": "header_title", body3: true, mb: 24 }, { children: t("header.title") })), requiredHeaders.length > 0 && (_jsx(HeadersList, { "data-cy": "required_header", title: t("header.required_headers"), headers: requiredHeaders })), optionalHeaders.length > 0 && (_jsx(HeadersList, { "data-cy": "optional_header", title: t("header.optional_headers"), headers: optionalHeaders, mt: 30 }))] })) }));
44
44
  };