fuse-importer 0.1.4-testing → 0.1.5-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 (120) 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 +43 -17
  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/useFieldSorting.d.ts +5 -0
  51. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
  52. package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
  53. package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
  54. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
  55. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +16 -7
  56. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +4 -2
  57. package/lib/esm/Importer/contexts/ImporterContextProvider.js +121 -13
  58. package/lib/esm/Importer/data/index.js +7 -5
  59. package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
  60. package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
  61. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
  62. package/lib/esm/Importer/hooks/useSubmitToServer.js +192 -0
  63. package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
  64. package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
  65. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
  66. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +108 -0
  67. package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
  68. package/lib/esm/common/FileUploadDropzone/index.js +1 -0
  69. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +55 -41
  70. package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -16
  71. package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
  72. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +36 -9
  73. package/lib/esm/common/Table/TableActions/RowFilters.js +53 -5
  74. package/lib/esm/common/Table/TableActions/SearchRows.js +3 -1
  75. package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
  76. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +16 -9
  77. package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
  78. package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
  79. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
  80. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +2 -2
  81. package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
  82. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  83. package/lib/esm/common/Table/TableView/index.js +6 -15
  84. package/lib/esm/common/Table/TableView/types.d.ts +8 -9
  85. package/lib/esm/common/Table/index.d.ts +2 -1
  86. package/lib/esm/common/Table/index.js +2 -2
  87. package/lib/esm/common/Toast.js +3 -2
  88. package/lib/esm/common/TooltipProvider.d.ts +2 -0
  89. package/lib/esm/common/TooltipProvider.js +12 -9
  90. package/lib/esm/common/buttons.d.ts +5 -1
  91. package/lib/esm/common/buttons.js +13 -7
  92. package/lib/esm/common/columnsTransformations.js +1 -1
  93. package/lib/esm/common/icons/index.d.ts +1 -0
  94. package/lib/esm/common/icons/index.js +1 -0
  95. package/lib/esm/common/index.d.ts +1 -0
  96. package/lib/esm/common/index.js +1 -0
  97. package/lib/esm/common/inputs/Autocomplete.js +1 -1
  98. package/lib/esm/locales/de.d.ts +1 -1
  99. package/lib/esm/locales/de.js +1 -1
  100. package/lib/esm/locales/en.d.ts +1 -1
  101. package/lib/esm/locales/en.js +4 -4
  102. package/lib/esm/locales/es.d.ts +1 -1
  103. package/lib/esm/locales/es.js +1 -1
  104. package/lib/esm/locales/fr.d.ts +1 -1
  105. package/lib/esm/locales/fr.js +1 -1
  106. package/lib/esm/types.d.ts +20 -5
  107. package/lib/main.js +2 -2
  108. package/package.json +6 -4
  109. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
  110. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -36
  111. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
  112. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
  113. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
  114. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
  115. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -33
  116. package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -256
  117. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
  118. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
  119. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
  120. package/lib/esm/common/Table/TableActions/hooks.js +0 -41
@@ -0,0 +1,192 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ import { useState } from "react";
58
+ import { useImporterContext, } from "../contexts/ImporterContextProvider";
59
+ import { isRecordEmpty } from "../../Importer/common/Spreadsheet/common";
60
+ import { sendRecordsToIntegrations } from "../../Importer/common/utils";
61
+ import { getTemplateFields, recordListToDataSet } from "../../Importer/data";
62
+ var trackImportedRowsCount = function (fuseApi, templateSlug, rowCount) { return __awaiter(void 0, void 0, void 0, function () {
63
+ var error_1, errorMessage;
64
+ var _a, _b;
65
+ return __generator(this, function (_c) {
66
+ switch (_c.label) {
67
+ case 0:
68
+ _c.trys.push([0, 2, , 3]);
69
+ return [4 /*yield*/, fuseApi.post("/api/v1/importer/templates/".concat(templateSlug, "/imports"), {
70
+ row_count: rowCount,
71
+ })];
72
+ case 1:
73
+ _c.sent();
74
+ return [3 /*break*/, 3];
75
+ case 2:
76
+ error_1 = _c.sent();
77
+ 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) ||
78
+ "There was an error submitting your dataset";
79
+ throw new Error(errorMessage);
80
+ case 3: return [2 /*return*/];
81
+ }
82
+ });
83
+ }); };
84
+ var buildColumnMappingsFromHeaderMatchings = function (templateHeaders, templateHeaderMatchings) {
85
+ return templateHeaders.map(function (column) {
86
+ return {
87
+ matched_column_name: templateHeaderMatchings[column.label],
88
+ template_column_name: column.label,
89
+ };
90
+ });
91
+ };
92
+ var saveMappedColumns = function (columnMappings, fuseApi, templateSlug) { return __awaiter(void 0, void 0, void 0, function () {
93
+ var error_2;
94
+ return __generator(this, function (_a) {
95
+ switch (_a.label) {
96
+ case 0:
97
+ _a.trys.push([0, 2, , 3]);
98
+ return [4 /*yield*/, fuseApi.patch("/api/v1/importer/templates/".concat(templateSlug), {
99
+ column_mappings_attributes: columnMappings,
100
+ })];
101
+ case 1:
102
+ _a.sent();
103
+ return [3 /*break*/, 3];
104
+ case 2:
105
+ error_2 = _a.sent();
106
+ throw new Error("There was an error trying to save column mappings");
107
+ case 3: return [2 /*return*/];
108
+ }
109
+ });
110
+ }); };
111
+ var getImportWasSuccessful = function (response) {
112
+ return !response.errors || !Object.keys(response.errors).length;
113
+ };
114
+ var filterAndMapWithBackendErrors = function (dataSet, errors) {
115
+ return Object.keys(errors).map(function (rId) {
116
+ var record = dataSet[rId];
117
+ var meta = record === null || record === void 0 ? void 0 : record._meta;
118
+ return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { isInvalid: true, backendErrors: errors[rId] }) });
119
+ }, []);
120
+ };
121
+ export var useSubmitToServer = function () {
122
+ var _a = useImporterContext(), templateHeaderMatchings = _a.templateHeaderMatchings, templateHeaders = _a.templateHeaders, integrations = _a.integrations, templateSlug = _a.templateSlug, fuseApi = _a.fuseApi, previewMode = _a.importerOptions.previewMode, onSubmit = _a.onSubmit;
123
+ var _b = useState(false), isSubmitting = _b[0], setIsSubmitting = _b[1];
124
+ var _c = useState(false), importWasSuccessful = _c[0], setImportWasSuccessful = _c[1];
125
+ var _d = useState(null), appResponse = _d[0], setAppResponse = _d[1];
126
+ var onSubmitToServer = function (dataSet, afterSubmitCallback) { return __awaiter(void 0, void 0, void 0, function () {
127
+ var dataSetValues, reviewFields_1, validDataSetValues, validDataSetLength, invalidRecords_1, applicationResponse, isAppResponseSuccessful, _a, errors, isDataValid, recordsToDisplayFiltered, invalidDataSet, columnMappings, error_3;
128
+ return __generator(this, function (_b) {
129
+ switch (_b.label) {
130
+ case 0:
131
+ _b.trys.push([0, 6, 7, 8]);
132
+ if (!dataSet)
133
+ return [2 /*return*/];
134
+ setIsSubmitting(true);
135
+ dataSetValues = Object.values(dataSet);
136
+ reviewFields_1 = getTemplateFields({ templateHeaders: templateHeaders });
137
+ validDataSetValues = dataSetValues.filter(function (record) {
138
+ return !record._meta.isInvalid && !isRecordEmpty(record, reviewFields_1);
139
+ });
140
+ validDataSetLength = validDataSetValues.length;
141
+ invalidRecords_1 = dataSetValues.filter(function (v) { return v._meta.isInvalid; });
142
+ return [4 /*yield*/, onSubmit(validDataSetValues)];
143
+ case 1:
144
+ applicationResponse = _b.sent();
145
+ isAppResponseSuccessful = getImportWasSuccessful(applicationResponse);
146
+ if (!isAppResponseSuccessful) {
147
+ _a = (applicationResponse !== null && applicationResponse !== void 0 ? applicationResponse : {}).errors, errors = _a === void 0 ? {} : _a;
148
+ invalidRecords_1 = __spreadArray(__spreadArray([], filterAndMapWithBackendErrors(dataSet, errors), true), invalidRecords_1, true);
149
+ }
150
+ isDataValid = invalidRecords_1.length === 0;
151
+ setImportWasSuccessful(isDataValid && isAppResponseSuccessful);
152
+ setAppResponse(applicationResponse);
153
+ if (applicationResponse.recordsToDisplay) {
154
+ recordsToDisplayFiltered = applicationResponse.recordsToDisplay.filter(function (record) {
155
+ var recordId = record._meta.id;
156
+ return !invalidRecords_1.some(function (invalidRecord) { return invalidRecord._meta.id === recordId; });
157
+ });
158
+ invalidRecords_1 = __spreadArray(__spreadArray([], invalidRecords_1, true), (recordsToDisplayFiltered || []), true);
159
+ }
160
+ invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields_1);
161
+ afterSubmitCallback(invalidDataSet);
162
+ if (!!previewMode) return [3 /*break*/, 5];
163
+ return [4 /*yield*/, trackImportedRowsCount(fuseApi, templateSlug, validDataSetLength)];
164
+ case 2:
165
+ _b.sent();
166
+ return [4 /*yield*/, sendRecordsToIntegrations(dataSetValues, integrations)];
167
+ case 3:
168
+ _b.sent();
169
+ columnMappings = buildColumnMappingsFromHeaderMatchings(templateHeaders, templateHeaderMatchings);
170
+ return [4 /*yield*/, saveMappedColumns(columnMappings, fuseApi, templateSlug)];
171
+ case 4:
172
+ _b.sent();
173
+ _b.label = 5;
174
+ case 5: return [3 /*break*/, 8];
175
+ case 6:
176
+ error_3 = _b.sent();
177
+ console.error(error_3);
178
+ return [3 /*break*/, 8];
179
+ case 7:
180
+ setIsSubmitting(false);
181
+ return [7 /*endfinally*/];
182
+ case 8: return [2 /*return*/];
183
+ }
184
+ });
185
+ }); };
186
+ return {
187
+ appResponse: appResponse,
188
+ isSubmitting: isSubmitting,
189
+ onSubmitToServer: onSubmitToServer,
190
+ importWasSuccessful: importWasSuccessful,
191
+ };
192
+ };
@@ -0,0 +1,22 @@
1
+ import { EventEmitter } from "eventemitter3";
2
+ import React from "react";
3
+ declare const EVENTS: {
4
+ ON_LAST_ROW_CHANGED: string;
5
+ UPDATE_COLUMN_ERROR_COUNT: string;
6
+ UPDATE_TOTAL_ERROR_COUNT: string;
7
+ UPDATE_TOTAL_ROW_COUNT: string;
8
+ };
9
+ type CallbackType = EventEmitter.EventListener<EventEmitter.ValidEventTypes, any>;
10
+ export type State = {
11
+ on: (event: string, callback: CallbackType) => void;
12
+ off: (event: string, callback: CallbackType) => void;
13
+ emit: (event: string, value?: any) => void;
14
+ emitter: React.MutableRefObject<EventEmitter>;
15
+ EVENTS: typeof EVENTS;
16
+ };
17
+ export declare const EventManagerContext: React.Context<State>;
18
+ export declare const EventManagerContextProvider: ({ children }: {
19
+ children: any;
20
+ }) => JSX.Element;
21
+ export declare const useEventManagerContext: () => State;
22
+ export {};
@@ -0,0 +1,38 @@
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 { EventEmitter } from "eventemitter3";
14
+ import { createContext, useContext, useRef } from "react";
15
+ var EVENTS = {
16
+ ON_LAST_ROW_CHANGED: "ON_LAST_ROW_CHANGED",
17
+ UPDATE_COLUMN_ERROR_COUNT: "UPDATE_COLUMN_ERROR_COUNT",
18
+ UPDATE_TOTAL_ERROR_COUNT: "UPDATE_TOTAL_ERROR_COUNT",
19
+ UPDATE_TOTAL_ROW_COUNT: "UPDATE_TOTAL_ROW_COUNT",
20
+ };
21
+ export var EventManagerContext = createContext({});
22
+ export var EventManagerContextProvider = function (_a) {
23
+ var children = _a.children;
24
+ var emitter = useRef(new EventEmitter());
25
+ var on = function (event, callback) {
26
+ return emitter.current.on(event, callback);
27
+ };
28
+ var off = function (event, callback) {
29
+ return emitter.current.off(event, callback);
30
+ };
31
+ var emit = function (event, value) {
32
+ if (value === void 0) { value = null; }
33
+ return emitter.current.emit(event, value);
34
+ };
35
+ var value = { on: on, off: off, emit: emit, emitter: emitter, EVENTS: EVENTS };
36
+ return (_jsx(EventManagerContext.Provider, __assign({ value: value }, { children: children })));
37
+ };
38
+ export var useEventManagerContext = function () { return useContext(EventManagerContext); };
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ export interface DropzoneProps {
3
+ onComplete: (results: any) => void;
4
+ saveFileName: (fileName: string) => void;
5
+ setIsLoading?: React.Dispatch<boolean>;
6
+ }
7
+ interface UseDragAndDropProps extends DropzoneProps {
8
+ validHeadersCount?: (headersLength: number) => boolean;
9
+ }
10
+ export declare const useDragAndDrop: ({ onComplete, saveFileName, setIsLoading, validHeadersCount, }: UseDragAndDropProps) => {
11
+ getRootProps: <T extends import("react-dropzone").DropzoneRootProps>(props?: T) => T;
12
+ getInputProps: <T_1 extends import("react-dropzone").DropzoneInputProps>(props?: T_1) => T_1;
13
+ open: () => void;
14
+ isDragActive: boolean;
15
+ };
16
+ export {};
@@ -0,0 +1,108 @@
1
+ import { useDropzone } from "react-dropzone";
2
+ import { addToast } from "../Toast";
3
+ import Papa from "papaparse";
4
+ import * as XLSX from "xlsx";
5
+ export var useDragAndDrop = function (_a) {
6
+ var onComplete = _a.onComplete, saveFileName = _a.saveFileName, setIsLoading = _a.setIsLoading, validHeadersCount = _a.validHeadersCount;
7
+ var onDrop = function (acceptedFiles) {
8
+ acceptedFiles.forEach(function (file) {
9
+ setIsLoading && setIsLoading(true);
10
+ saveFileName(file.name);
11
+ var reader = new FileReader();
12
+ var isCsvFile = file.type === "text/csv";
13
+ reader.onabort = function () { return console.log("file reading was aborted"); };
14
+ reader.onerror = function () { return console.log("file reading has failed"); };
15
+ reader.onload = function (event) {
16
+ var _a;
17
+ var results = event.target.result;
18
+ if (isCsvFile) {
19
+ Papa.parse(results, {
20
+ worker: true,
21
+ complete: function (parserResults) {
22
+ onComplete(parserResults.data);
23
+ setIsLoading && setIsLoading(false);
24
+ },
25
+ });
26
+ return;
27
+ }
28
+ var getDataFromFile = function (fileResults) {
29
+ // rounded value to 20MB
30
+ var isLargeFile = file.size > 20000000;
31
+ var workBook = XLSX.read(fileResults, {
32
+ type: "array",
33
+ codepage: 65001,
34
+ raw: true,
35
+ dense: isLargeFile,
36
+ });
37
+ var workBookName = workBook.SheetNames[0];
38
+ var sheet = workBook.Sheets[workBookName];
39
+ return XLSX.utils.sheet_to_json(sheet, { header: 1, raw: false });
40
+ };
41
+ var fileData = getDataFromFile(results);
42
+ var headersCount = (_a = fileData[0]) === null || _a === void 0 ? void 0 : _a.length;
43
+ if (validHeadersCount) {
44
+ validHeadersCount(headersCount) && onComplete(fileData);
45
+ }
46
+ else {
47
+ onComplete(fileData);
48
+ }
49
+ setIsLoading && setIsLoading(false);
50
+ };
51
+ if (isCsvFile) {
52
+ reader.readAsText(file);
53
+ }
54
+ else {
55
+ reader.readAsArrayBuffer(file);
56
+ }
57
+ });
58
+ };
59
+ var onDropRejected = function (rejectedFiles) {
60
+ var errorMessages = rejectedFiles.map(function (file) {
61
+ if (file.errors[0].code === "file-too-large") {
62
+ return "Please upload a CSV file less than 100mb or an XLSX file less than 50mb.";
63
+ }
64
+ else {
65
+ return file.errors[0].message;
66
+ }
67
+ });
68
+ var uniqueMessages = Array.from(new Set(errorMessages));
69
+ uniqueMessages.forEach(function (message) {
70
+ addToast(message, "error");
71
+ });
72
+ };
73
+ var validator = function (file) {
74
+ var isCsvFile = file.type === "text/csv";
75
+ var isExcelFile = [
76
+ "application/vnd.ms-excel",
77
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
78
+ ].includes(file.type);
79
+ if (isCsvFile && file.size > 100000000) {
80
+ return {
81
+ code: "file-too-large",
82
+ message: "Maximum file size is 100MB",
83
+ };
84
+ }
85
+ else if (isExcelFile && file.size > 50000000) {
86
+ return {
87
+ code: "file-too-large",
88
+ message: "Maximum file size is 50MB",
89
+ };
90
+ }
91
+ return null;
92
+ };
93
+ var _b = useDropzone({
94
+ onDrop: onDrop,
95
+ onDropRejected: onDropRejected,
96
+ noClick: true,
97
+ noKeyboard: true,
98
+ accept: ".csv, .xls, .xlsx",
99
+ maxFiles: 1,
100
+ validator: validator,
101
+ }), getRootProps = _b.getRootProps, getInputProps = _b.getInputProps, open = _b.open, isDragActive = _b.isDragActive;
102
+ return {
103
+ getRootProps: getRootProps,
104
+ getInputProps: getInputProps,
105
+ open: open,
106
+ isDragActive: isDragActive,
107
+ };
108
+ };
@@ -0,0 +1 @@
1
+ export * from "./ImporterDropzone";
@@ -0,0 +1 @@
1
+ export * from "./ImporterDropzone";
@@ -59,64 +59,78 @@ import { MenuItem, addToast } from "../../../index";
59
59
  import { useSpreadsheetContext } from "../../../../index";
60
60
  import { useImporterContext } from "../../../../Importer/contexts/ImporterContextProvider";
61
61
  import { useTranslation } from "react-i18next";
62
+ import { useBatchProcessing } from "../../../../Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing";
63
+ import { useDataSetContext } from "../../../../Importer/common/Spreadsheet/DataSetContextProvider";
64
+ import { useValidationContext } from "../../../../Importer/common/Spreadsheet/ValidationContextProvider";
62
65
  var Container = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n cursor: pointer;\n"], ["\n cursor: pointer;\n"])));
63
66
  var StyledSelectMenu = styled(SelectMenu)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n .selectMenu[data-popper-placement^=\"bottom\"] {\n width: 320px !important;\n transform: translate(-199px, 21px);\n }\n"], ["\n .selectMenu[data-popper-placement^=\"bottom\"] {\n width: 320px !important;\n transform: translate(-199px, 21px);\n }\n"])));
64
67
  export var CustomActions = function () {
65
68
  var customActions = useImporterContext().customActions;
66
- var _a = useSpreadsheetContext(), selectedRows = _a.selectedRows, data = _a.data, updateRecord = _a.updateRecord;
67
- var _b = useState(null), referenceElement = _b[0], setReferenceElement = _b[1];
68
- var _c = useState(false), isMenuOpen = _c[0], setIsMenuOpen = _c[1];
69
+ var selectedRows = useSpreadsheetContext().selectedRows;
70
+ var getRecord = useDataSetContext().getRecord;
71
+ var updateRecordAndRevalidate = useValidationContext().updateRecordAndRevalidate;
72
+ var _a = useState(null), referenceElement = _a[0], setReferenceElement = _a[1];
73
+ var _b = useState(false), isMenuOpen = _b[0], setIsMenuOpen = _b[1];
69
74
  var t = useTranslation("review").t;
70
75
  var filteredOptions = useMemo(function () {
71
76
  return customActions.map(function (action) { return action.name; });
72
77
  }, [customActions]);
73
- var handleCustomAction = function (actionKey) { return __awaiter(void 0, void 0, void 0, function () {
74
- var recordsToRunAction, recordsAfterActions, action, i, currentRecord, newRecord, error_1;
78
+ var processBatch = function (batch, action) { return __awaiter(void 0, void 0, void 0, function () {
79
+ var results, i, currentRecord;
75
80
  return __generator(this, function (_a) {
76
81
  switch (_a.label) {
77
82
  case 0:
78
- recordsToRunAction = data.filter(function (row) { var _a; return selectedRows.includes((_a = row === null || row === void 0 ? void 0 : row._meta) === null || _a === void 0 ? void 0 : _a.id); });
79
- recordsAfterActions = [];
80
- action = customActions.find(function (action) { return action.name === actionKey; });
81
- if (!action || Object.keys(action).length === 0) {
82
- addToast(t("table_actions.custom_actions.general_error_toast"), "error");
83
- return [2 /*return*/];
83
+ results = [];
84
+ for (i = 0; i < batch.length; i++) {
85
+ currentRecord = batch[i];
86
+ try {
87
+ if (action.actionType === "record") {
88
+ results.push(action.handler(currentRecord));
89
+ }
90
+ }
91
+ catch (error) {
92
+ addToast(t("table_actions.custom_actions.error_toast", {
93
+ actionName: action.name,
94
+ }), "error");
95
+ break;
96
+ }
84
97
  }
85
- i = 0;
86
- _a.label = 1;
98
+ return [4 /*yield*/, updateRecordAndRevalidate(results)];
87
99
  case 1:
88
- if (!(i < recordsToRunAction.length)) return [3 /*break*/, 7];
89
- currentRecord = recordsToRunAction[i];
90
- _a.label = 2;
91
- case 2:
92
- _a.trys.push([2, 5, , 6]);
93
- if (!(action.actionType === "record")) return [3 /*break*/, 4];
94
- return [4 /*yield*/, action.handler(currentRecord)];
95
- case 3:
96
- newRecord = _a.sent();
97
- recordsAfterActions.push(newRecord);
98
- return [3 /*break*/, 6];
99
- case 4: return [3 /*break*/, 6];
100
- case 5:
101
- error_1 = _a.sent();
102
- addToast(t("table_actions.custom_actions.error_toast", {
103
- actionName: action.name,
104
- }), "error");
105
- return [3 /*break*/, 7];
106
- case 6:
107
- i++;
108
- return [3 /*break*/, 1];
109
- case 7:
110
- if (recordsAfterActions.length) {
111
- addToast(t("table_actions.custom_actions.success_toast", {
112
- actionName: action.name,
113
- }), "success");
114
- }
115
- updateRecord(recordsAfterActions);
100
+ _a.sent();
116
101
  return [2 /*return*/];
117
102
  }
118
103
  });
119
104
  }); };
105
+ var handleCustomAction = function (actionKey) { return __awaiter(void 0, void 0, void 0, function () {
106
+ var recordsToRunAction, action, processRecordsInBatches, toastMessage;
107
+ return __generator(this, function (_a) {
108
+ recordsToRunAction = selectedRows.map(function (recordId) {
109
+ return getRecord(recordId);
110
+ });
111
+ action = customActions.find(function (action) { return action.name === actionKey; });
112
+ if (!action || Object.keys(action).length === 0) {
113
+ addToast(t("table_actions.custom_actions.general_error_toast"), "error");
114
+ return [2 /*return*/];
115
+ }
116
+ processRecordsInBatches = useBatchProcessing().processRecordsInBatches;
117
+ processRecordsInBatches(recordsToRunAction, function (batch) { return __awaiter(void 0, void 0, void 0, function () {
118
+ return __generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0: return [4 /*yield*/, processBatch(batch, action)];
121
+ case 1:
122
+ _a.sent();
123
+ return [2 /*return*/];
124
+ }
125
+ });
126
+ }); });
127
+ toastMessage = t("table_actions.custom_actions.success_toast", {
128
+ actionName: action.name,
129
+ });
130
+ addToast(toastMessage, "success");
131
+ return [2 /*return*/];
132
+ });
133
+ }); };
120
134
  var onSelect = function (value) {
121
135
  setIsMenuOpen(false);
122
136
  handleCustomAction(value);
@@ -16,40 +16,49 @@ var __assign = (this && this.__assign) || function () {
16
16
  import { jsxs as _jsxs, Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
17
17
  import { useState } from "react";
18
18
  import styled from "styled-components";
19
- import { TooltipProvider } from "../../../common/TooltipProvider";
20
- import { ConfirmationModal } from "../../../common/ConfirmationModal";
19
+ import { useTranslation } from "react-i18next";
21
20
  import { useSpreadsheetContext } from "../../../Importer";
22
- import { DeleteIcon, ConfirmationDeleteIcon } from "./icons";
21
+ import { useDataSetContext } from "../../../Importer/common/Spreadsheet/DataSetContextProvider";
22
+ import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
23
+ import { useValidationContext } from "../../../Importer/common/Spreadsheet/ValidationContextProvider";
24
+ import { ConfirmationModal } from "../../../common/ConfirmationModal";
25
+ import { useEventManagerContext } from "../../../common/EventManagerContextProvider";
26
+ import { TooltipProvider } from "../../../common/TooltipProvider";
23
27
  import { Div } from "../../../styled/utils";
28
+ import { addToast } from "../../Toast";
24
29
  import { ActionButton } from "./TableActions.styles";
25
- import { useTranslation } from "react-i18next";
26
- import { addToast } from "../../../common/Toast";
30
+ import { ConfirmationDeleteIcon, DeleteIcon } from "./icons";
31
+ import { useDataSetManipulation } from "../../../Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation";
27
32
  var StyledTooltipProvider = styled(TooltipProvider)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n width: fit-content;\n"], ["\n width: fit-content;\n"])));
28
33
  export var DeleteSelectedRows = function (_a) {
29
34
  var _b = _a.testId, testId = _b === void 0 ? "ta-delete-rows" : _b;
30
35
  var _c = useState(false), isConfirmationModalOpen = _c[0], setIsConfirmationModalOpen = _c[1];
31
- var _d = useSpreadsheetContext(), deleteRecords = _d.deleteRecords, selectedRows = _d.selectedRows, setSelectedRows = _d.setSelectedRows, setFilteredInputValue = _d.setFilteredInputValue, spreadsheetFilter = _d.spreadsheetFilter, duplicateRecords = _d.duplicateRecords, resetSpreadsheetFilter = _d.resetSpreadsheetFilter;
36
+ var _d = useFilteredDataContext(), setFilteredInputValue = _d.setFilteredInputValue, setRecalculateFilters = _d.setRecalculateFilters;
37
+ var _e = useSpreadsheetContext(), selectedRows = _e.selectedRows, setSelectedRows = _e.setSelectedRows;
38
+ var _f = useValidationContext(), errors = _f.errors, warnings = _f.warnings, calculateColumnErrorCounts = _f.calculateColumnErrorCounts, calculateColumnWarningCounts = _f.calculateColumnWarningCounts;
39
+ var _g = useDataSetContext(), deleteRecord = _g.deleteRecord, emptyRecordIds = _g.emptyRecordIds;
32
40
  var t = useTranslation("review").t;
41
+ var _h = useEventManagerContext(), emit = _h.emit, EVENTS = _h.EVENTS;
42
+ var deleteRecordsFromSpreadsheet = useDataSetManipulation().deleteRecordsFromSpreadsheet;
33
43
  var toggleModalVisibility = function () {
34
44
  setIsConfirmationModalOpen(function (oldValue) { return !oldValue; });
35
45
  };
36
- var handleDeleteRecord = function () {
46
+ var deleteRecords = function () {
37
47
  setSelectedRows([]);
38
48
  toggleModalVisibility();
39
49
  setFilteredInputValue("");
40
- deleteRecords(selectedRows);
41
- if (spreadsheetFilter.byRow === "duplicates") {
42
- var selectedDuplicatesCount = Object.keys(duplicateRecords.records).filter(function (key) { return selectedRows.includes(key); }).length;
43
- addToast(t("table_actions.filters_by_rows.duplicates_deleted", {
44
- count: selectedDuplicatesCount,
45
- }), "success");
46
- resetSpreadsheetFilter();
47
- }
50
+ deleteRecordsFromSpreadsheet(selectedRows);
51
+ addToast(t("table_actions.delete_rows.deleted_message", {
52
+ length: selectedRows.length,
53
+ }), "success");
54
+ emit(EVENTS.UPDATE_COLUMN_ERROR_COUNT);
55
+ emit(EVENTS.UPDATE_TOTAL_ERROR_COUNT);
56
+ emit(EVENTS.UPDATE_TOTAL_ROW_COUNT);
48
57
  };
49
58
  var DescriptionUI = function () { return (_jsx(_Fragment, { children: _jsxs(Div, { children: [t("table_actions.delete_rows.confirmation_modal", {
50
59
  length: selectedRows.length,
51
60
  }), selectedRows.length > 1 ? "s" : "", "?"] }) })); };
52
- var confirmationModalUI = (_jsx(ConfirmationModal, { isOpen: isConfirmationModalOpen, handleClose: toggleModalVisibility, title: "".concat(t("table_actions.delete_rows.modal_title")).concat(selectedRows.length > 1 ? "s" : ""), description: _jsx(DescriptionUI, {}), onSubmit: handleDeleteRecord, buttonText: t("table_actions.delete_rows.yes_delete"), icon: ConfirmationDeleteIcon }));
61
+ var confirmationModalUI = (_jsx(ConfirmationModal, { isOpen: isConfirmationModalOpen, handleClose: toggleModalVisibility, title: "".concat(t("table_actions.delete_rows.modal_title")).concat(selectedRows.length > 1 ? "s" : ""), description: _jsx(DescriptionUI, {}), onSubmit: deleteRecords, buttonText: t("table_actions.delete_rows.yes_delete"), icon: ConfirmationDeleteIcon }));
53
62
  var isDeleteButtonDisabled = selectedRows.length <= 0;
54
63
  return (_jsxs(_Fragment, { children: [confirmationModalUI, _jsx(StyledTooltipProvider, __assign({ tooltip: isDeleteButtonDisabled
55
64
  ? t("table_actions.delete_rows.select_rows")
@@ -11,13 +11,15 @@ var __assign = (this && this.__assign) || function () {
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import { DownloadIcon } from "./icons";
14
- import { useReviewContext } from "../../../Importer";
15
14
  import { TooltipProvider } from "../../../common/TooltipProvider";
16
15
  import { ActionButton } from "./TableActions.styles";
17
16
  import { useTranslation } from "react-i18next";
17
+ import { useExportDataToFile } from "../../../Importer/hooks/useExportDataToFile";
18
+ import { useDataSetContext } from "../../../Importer/common/Spreadsheet/DataSetContextProvider";
18
19
  export var ExportData = function (_a) {
19
20
  var _b = _a.testId, testId = _b === void 0 ? "ta-export-data" : _b;
20
- var onExport = useReviewContext().onExport;
21
+ var onExport = useExportDataToFile().onExport;
22
+ var dataSet = useDataSetContext().dataSet;
21
23
  var t = useTranslation("review").t;
22
- return (_jsx(TooltipProvider, __assign({ tooltip: t("table_actions.export_your_data.tooltip"), placement: "right", flip: false, centered: true, "data-testid": testId }, { children: _jsx(ActionButton, __assign({ onClick: function () { return onExport("csv"); } }, { children: _jsx(DownloadIcon, {}) })) })));
24
+ return (_jsx(TooltipProvider, __assign({ tooltip: t("table_actions.export_your_data.tooltip"), placement: "right", flip: false, centered: true, "data-testid": testId }, { children: _jsx(ActionButton, __assign({ onClick: function () { return onExport(dataSet === null || dataSet === void 0 ? void 0 : dataSet.current, "csv"); } }, { children: _jsx(DownloadIcon, {}) })) })));
23
25
  };