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
@@ -0,0 +1,152 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { useBatchProcessing } from "./useBatchProcessing";
38
+ import { rowIsEmpty } from "./utils";
39
+ var findDuplicateHashes = function (sortedHashes) {
40
+ var _a;
41
+ var results = [];
42
+ for (var i = 0; i < sortedHashes.length - 1; i++) {
43
+ if (sortedHashes[i + 1].hash == sortedHashes[i].hash ||
44
+ ((_a = sortedHashes[i - 1]) === null || _a === void 0 ? void 0 : _a.hash) == sortedHashes[i].hash) {
45
+ results.push(sortedHashes[i]);
46
+ }
47
+ }
48
+ return results;
49
+ };
50
+ function compareHashes(a, b) {
51
+ if (a.hash < b.hash)
52
+ return -1;
53
+ if (a.hash > b.hash)
54
+ return 1;
55
+ return 0;
56
+ }
57
+ // generate hashes that can be used for comparing two records
58
+ // for the sake of tracking duplicates
59
+ // if the hash for one record equals the hash for another,
60
+ // the two records are duplicates
61
+ export var RecordHashCalculator = function () {
62
+ var computeHashesForBatch = function (dataSet, fields) {
63
+ var hashMap = [];
64
+ var _loop_1 = function (recordKey) {
65
+ var record = dataSet[recordKey];
66
+ var key = fields.map(function (field) { return record[field.name]; }).join("|");
67
+ if (!rowIsEmpty(record)) {
68
+ hashMap.push({ id: record._meta.id, hash: key });
69
+ }
70
+ };
71
+ for (var recordKey in dataSet) {
72
+ _loop_1(recordKey);
73
+ }
74
+ return hashMap;
75
+ };
76
+ var calculatingHashes = false;
77
+ var computeHashesForRecords = function (dataSet, fields, _onHashesComputed) { return __awaiter(void 0, void 0, void 0, function () {
78
+ var processInBatches, results, duplicateHashes;
79
+ return __generator(this, function (_a) {
80
+ switch (_a.label) {
81
+ case 0:
82
+ if (!dataSet || calculatingHashes) {
83
+ return [2 /*return*/];
84
+ }
85
+ processInBatches = useBatchProcessing().processInBatches;
86
+ calculatingHashes = true;
87
+ results = [];
88
+ return [4 /*yield*/, processInBatches(dataSet, function (batch) {
89
+ results = results.concat(computeHashesForBatch(batch, fields));
90
+ })];
91
+ case 1:
92
+ _a.sent();
93
+ results.sort(compareHashes);
94
+ duplicateHashes = findDuplicateHashes(results);
95
+ _onHashesComputed(duplicateHashes);
96
+ calculatingHashes = false;
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ }); };
101
+ return {
102
+ computeHashesForRecords: computeHashesForRecords,
103
+ };
104
+ };
105
+ // generate hashes that can be used for comparing the values of a specific field
106
+ // for the sake of tracking uniqueness
107
+ export var RecordValueHashCalculator = function () {
108
+ var columnsBeingCalculated = [];
109
+ var computeHashesForBatch = function (dataSet, field) {
110
+ var hashMap = [];
111
+ var isCaseInsensitive = field.validations.find(function (v) {
112
+ return v.name === "unique_case_insensitive";
113
+ }) !== undefined;
114
+ for (var recordKey in dataSet) {
115
+ var record = dataSet[recordKey];
116
+ var key = record[field.name];
117
+ if (isCaseInsensitive) {
118
+ key = key.toLowerCase();
119
+ }
120
+ if (key) {
121
+ hashMap.push({ id: record._meta.id, hash: key });
122
+ }
123
+ }
124
+ return hashMap;
125
+ };
126
+ var computeDuplicateValueHashes = function (dataSet, _field, _onDuplicateHashesComputed) { return __awaiter(void 0, void 0, void 0, function () {
127
+ var processInBatches, results;
128
+ return __generator(this, function (_a) {
129
+ switch (_a.label) {
130
+ case 0:
131
+ if (!dataSet || columnsBeingCalculated[_field.name]) {
132
+ return [2 /*return*/];
133
+ }
134
+ columnsBeingCalculated[_field.name] = true;
135
+ processInBatches = useBatchProcessing().processInBatches;
136
+ results = [];
137
+ return [4 /*yield*/, processInBatches(dataSet, function (batch) {
138
+ results = results.concat(computeHashesForBatch(batch, _field));
139
+ })];
140
+ case 1:
141
+ _a.sent();
142
+ results.sort(compareHashes);
143
+ _onDuplicateHashesComputed(results);
144
+ columnsBeingCalculated[_field.name] = false;
145
+ return [2 /*return*/];
146
+ }
147
+ });
148
+ }); };
149
+ return {
150
+ computeDuplicateValueHashes: computeDuplicateValueHashes,
151
+ };
152
+ };
@@ -1,46 +1,23 @@
1
1
  import React from "react";
2
2
  import { SpreadsheetOptions } from "../../../..";
3
- import { BatchValidationErrors, Field, Record, RecordDataSet } from "../../../../types";
4
- import { SortBy, SpreadsheetProps } from "../common/types";
5
- import { ValidationState } from "../hooks";
6
- import { SpreadsheetFilter } from "./useSpreadsheetFilter";
3
+ import { Field, RecordDataSet } from "../../../../types";
4
+ import { SpreadsheetProps } from "../common/types";
7
5
  export type OnDataSetChanged = (dataSet: RecordDataSet) => void;
8
- export type OnValidationStateChanged = (state: ValidationState) => void;
9
6
  type State = {
10
- data: Record[];
7
+ filteredDataIds: string[];
11
8
  fields: Field[];
12
- isLoading: boolean;
13
9
  isReadOnly?: boolean;
14
- errors: BatchValidationErrors;
15
- warnings: BatchValidationErrors;
16
10
  options: SpreadsheetOptions;
17
- sortByFieldErrors: string;
18
- sortByFieldWarnings: string;
19
- updateRecord: (record: Record) => void;
20
- setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
21
- setSortByFieldErrors: React.Dispatch<React.SetStateAction<string>>;
22
11
  selectedRows: string[];
23
12
  setSelectedRows: React.Dispatch<React.SetStateAction<string[]>>;
24
- setSortByFieldWarnings: React.Dispatch<React.SetStateAction<string>>;
25
- deleteRecords: (selectedRecords: string[]) => void;
26
13
  lastClickedIndexRef: React.MutableRefObject<number | null>;
27
- filteredInputValue: string;
28
- setFilteredInputValue: React.Dispatch<React.SetStateAction<string>>;
29
- addNewRowsToSpreadsheet: () => void;
30
- spreadsheetFilter: SpreadsheetFilter;
31
- filterRecordsByRowType: (filterByRow: SpreadsheetFilter["byRow"]) => void;
32
- filterRecordsByFieldErrors: (filterByColumn: string) => void;
33
- resetSpreadsheetFilter: () => void;
34
- recordsWithValuesCount: number;
35
- filteredDataCount: number;
36
14
  checkboxColumnWidth: number;
37
- isFiltering: boolean;
38
- sortBy: SortBy | null;
39
- setSortBy: React.Dispatch<React.SetStateAction<SortBy>>;
40
- } & ValidationState;
15
+ inefficientRerender: boolean;
16
+ setInefficientRerender: React.Dispatch<React.SetStateAction<boolean>>;
17
+ };
41
18
  type Props = SpreadsheetProps & {
42
19
  children: JSX.Element;
43
20
  };
44
- export declare const SpreadsheetContextProvider: ({ initialDataSet, fields, options, isReadOnly, children, onValidateRecord, onDataSetChanged, onValidationStateChanged, selectedRows, setSelectedRows, getSortCompareFn, }: Props) => JSX.Element;
21
+ export declare const SpreadsheetContextProvider: ({ fields, options, isReadOnly, children, onValidateRecord, selectedRows, setSelectedRows, }: Props) => JSX.Element;
45
22
  export declare const useSpreadsheetContext: () => State;
46
23
  export {};
@@ -21,155 +21,24 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  return t;
22
22
  };
23
23
  import { jsx as _jsx } from "react/jsx-runtime";
24
- import { get } from "lodash";
25
- import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
26
- import { addMeta } from "../../../data";
27
- import { useValidationState } from "../hooks";
28
- import { useSpreadsheetFilter, } from "./useSpreadsheetFilter";
29
- import { filterRecordsByType, filterRecordsByError, filterRecordsBySearchValue, } from "./filterMethods";
30
- import { hasValueInAnyField } from "./utils";
31
- var getDefaultSortCompareFn = function (sortBy) {
32
- return function (a, b) {
33
- var aField = get(a, sortBy.field);
34
- var bField = get(b, sortBy.field);
35
- if (aField === bField)
36
- return a._meta.rowIndex > b._meta.rowIndex ? 1 : -1;
37
- if (!aField)
38
- return 1;
39
- if (!bField)
40
- return -1;
41
- if (sortBy.direction === "asc")
42
- return aField > bField ? 1 : -1;
43
- return aField < bField ? 1 : -1;
44
- };
45
- };
24
+ import { createContext, useContext, useMemo, useRef, useState, } from "react";
25
+ import { useFilteredDataContext } from "../FilteredDataContextProvider";
26
+ import { useValidationContext } from "../ValidationContextProvider";
46
27
  var SpreadsheetContext = createContext({});
47
28
  export var SpreadsheetContextProvider = function (_a) {
48
- var initialDataSet = _a.initialDataSet, fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, children = _a.children, onValidateRecord = _a.onValidateRecord, onDataSetChanged = _a.onDataSetChanged, onValidationStateChanged = _a.onValidationStateChanged, selectedRows = _a.selectedRows, setSelectedRows = _a.setSelectedRows, _b = _a.getSortCompareFn, getSortCompareFn = _b === void 0 ? getDefaultSortCompareFn : _b;
49
- var _c = useState(initialDataSet), dataSet = _c[0], setDataSet = _c[1];
50
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
51
- var _e = useState(null), sortByFieldErrors = _e[0], setSortByFieldErrors = _e[1];
52
- var _f = useState(null), sortByFieldWarnings = _f[0], setSortByFieldWarnings = _f[1];
53
- var _g = useState(""), filteredInputValue = _g[0], setFilteredInputValue = _g[1];
54
- var _h = useState(null), sortBy = _h[0], setSortBy = _h[1];
55
- var addRowTimeoutRef = useRef(null);
56
- var _j = useSpreadsheetFilter(), spreadsheetFilter = _j.spreadsheetFilter, filterRecordsByRowType = _j.filterRecordsByRowType, filterRecordsByFieldErrors = _j.filterRecordsByFieldErrors, resetSpreadsheetFilter = _j.resetSpreadsheetFilter;
57
- var _k = useValidationState({
58
- dataSet: dataSet,
59
- initialDataSet: initialDataSet,
60
- fields: fields,
61
- options: options,
62
- isReadOnly: isReadOnly,
63
- setDataSet: setDataSet,
64
- setIsLoading: setIsLoading,
65
- onValidateRecord: onValidateRecord,
66
- }), updateRecordAndRevalidate = _k.updateRecordAndRevalidate, deleteRecords = _k.deleteRecords, warnings = _k.warnings, errors = _k.errors, validationState = __rest(_k, ["updateRecordAndRevalidate", "deleteRecords", "warnings", "errors"]);
67
- var addNewRowsToSpreadsheet = function () {
68
- addRowTimeoutRef.current = setTimeout(function () {
69
- var _a, _b;
70
- var highestRowIndex = -1;
71
- for (var key in dataSet)
72
- if (((_b = (_a = dataSet[key]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.rowIndex) > highestRowIndex)
73
- highestRowIndex = dataSet[key]._meta.rowIndex;
74
- var newRow = addMeta({}, highestRowIndex + 1);
75
- setDataSet(function (oldValues) {
76
- var _a;
77
- return (__assign(__assign({}, oldValues), (_a = {}, _a[newRow._meta.id] = newRow, _a)));
78
- });
79
- addRowTimeoutRef.current = null;
80
- }, 300);
81
- };
82
- var handleDeleteErrors = function (selectedRows) {
83
- deleteRecords(selectedRows, errors, warnings);
84
- };
85
- var dataSnapshot = useMemo(function () {
86
- var filteredData = spreadsheetFilter.type === "rowBased"
87
- ? filterRecordsByType(dataSet, spreadsheetFilter.byRow)
88
- : filterRecordsByError(dataSet, spreadsheetFilter.byColumn.field, errors);
89
- var filteredDatasetByString = filteredInputValue
90
- ? filterRecordsBySearchValue(filteredData, filteredInputValue)
91
- : filteredData;
92
- var dataSetValues = Object.values(filteredDatasetByString);
93
- if (sortBy) {
94
- return dataSetValues.sort(getSortCompareFn(sortBy));
95
- }
96
- else if (!!sortByFieldErrors || !!sortByFieldWarnings)
97
- return dataSetValues.sort(function (a, b) {
98
- var aHasErrors = !!get(sortByFieldErrors ? errors : warnings, "".concat(get(a, "_meta.id"), ".").concat(sortByFieldErrors || sortByFieldWarnings), false);
99
- var bHasErrors = !!get(sortByFieldErrors ? errors : warnings, "".concat(get(b, "_meta.id"), ".").concat(sortByFieldErrors || sortByFieldWarnings), false);
100
- if (aHasErrors === bHasErrors) {
101
- return a._meta.rowIndex > b._meta.rowIndex ? 1 : -1;
102
- }
103
- return bHasErrors ? 1 : -1;
104
- });
105
- return dataSetValues;
106
- }, [
107
- filteredInputValue,
108
- spreadsheetFilter,
109
- sortBy,
110
- Object.keys(dataSet).length,
111
- sortByFieldErrors,
112
- sortByFieldWarnings,
113
- ]);
114
- var recordsWithValuesCount = useMemo(function () {
115
- return Object.values(dataSet).filter(hasValueInAnyField).length;
116
- }, [dataSet]);
117
- var filteredDataCount = useMemo(function () {
118
- return Object.values(dataSnapshot).filter(hasValueInAnyField).length;
119
- }, [dataSnapshot]);
120
- var isFiltering = useMemo(function () { return !!filteredInputValue; }, [filteredInputValue]);
121
- useEffect(function () {
122
- onDataSetChanged && onDataSetChanged(dataSet);
123
- if (addRowTimeoutRef.current) {
124
- // avoid adding new rows when the user is typing
125
- clearTimeout(addRowTimeoutRef.current);
126
- }
127
- var dataSetKeys = Object.keys(dataSet);
128
- var latestDataSet = dataSet[dataSetKeys[dataSetKeys.length - 1]];
129
- var latestDataSetValuesWithoutMeta = Object.values(latestDataSet).filter(function (key) { return key !== "_meta"; });
130
- var hasValueInTheLastObject = latestDataSetValuesWithoutMeta
131
- .filter(function (value) {
132
- return value !== null && value !== undefined && typeof value !== "object";
133
- })
134
- .some(function (value) { return value !== "null" && value !== "undefined"; });
135
- if (hasValueInTheLastObject) {
136
- addNewRowsToSpreadsheet();
137
- }
138
- }, [dataSet]);
139
- // Review this later, this probably isn't the best approach
140
- useEffect(function () {
141
- setDataSet(initialDataSet);
142
- }, [initialDataSet]);
143
- useEffect(function () {
144
- onValidationStateChanged &&
145
- onValidationStateChanged(__assign(__assign({}, validationState), { errors: errors, warnings: warnings }));
146
- }, [validationState, onValidationStateChanged]);
147
- var handleSortByFieldErrors = useCallback(function (field) {
148
- setSortByFieldErrors(field === sortByFieldErrors ? null : field);
149
- setSortByFieldWarnings(null);
150
- setSortBy(null);
151
- }, [sortByFieldErrors]);
152
- var handleSortByFieldWarnings = useCallback(function (field) {
153
- setSortByFieldWarnings(field === sortByFieldWarnings ? null : field);
154
- setSortByFieldErrors(null);
155
- setSortBy(null);
156
- }, [sortByFieldWarnings]);
29
+ var fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, children = _a.children, onValidateRecord = _a.onValidateRecord, selectedRows = _a.selectedRows, setSelectedRows = _a.setSelectedRows;
30
+ var _b = useState(false), inefficientRerender = _b[0], setInefficientRerender = _b[1];
31
+ var filteredDataIds = useFilteredDataContext().filteredDataIds;
32
+ var _c = useValidationContext(), calculateColumnErrorCounts = _c.calculateColumnErrorCounts, calculateColumnWarningCounts = _c.calculateColumnWarningCounts, warnings = _c.warnings, errors = _c.errors, validationState = __rest(_c, ["calculateColumnErrorCounts", "calculateColumnWarningCounts", "warnings", "errors"]);
157
33
  var lastClickedIndexRef = useRef(null);
158
34
  var checkboxColumnWidth = useMemo(function () {
159
- var lastRowIndexLength = dataSnapshot.length.toString().length;
35
+ var lastRowIndexLength = filteredDataIds.length.toString().length;
160
36
  var singleLetterWidth = 15;
161
37
  var horizontalSpacing = 8;
162
38
  var baseCheckboxColumnWidth = lastRowIndexLength * singleLetterWidth + horizontalSpacing;
163
39
  return baseCheckboxColumnWidth < 40 ? 40 : baseCheckboxColumnWidth;
164
- }, [dataSnapshot]);
165
- var updatedDataSnapshot = useMemo(function () {
166
- return dataSnapshot.map(function (data) {
167
- var _a;
168
- var updatedData = dataSet[(_a = data._meta) === null || _a === void 0 ? void 0 : _a.id];
169
- return updatedData;
170
- });
171
- }, [dataSet, dataSnapshot]);
172
- var value = __assign(__assign({ data: updatedDataSnapshot, fields: fields, isLoading: isLoading }, validationState), { isReadOnly: isReadOnly, sortByFieldErrors: sortByFieldErrors, sortByFieldWarnings: sortByFieldWarnings, options: options, recordsWithValuesCount: recordsWithValuesCount, filteredDataCount: filteredDataCount, sortBy: sortBy, warnings: warnings, errors: errors, setIsLoading: setIsLoading, setSortByFieldErrors: handleSortByFieldErrors, setSortByFieldWarnings: handleSortByFieldWarnings, onValidateRecord: onValidateRecord, updateRecord: updateRecordAndRevalidate, selectedRows: selectedRows, setSelectedRows: setSelectedRows, deleteRecords: handleDeleteErrors, filteredInputValue: filteredInputValue, setFilteredInputValue: setFilteredInputValue, lastClickedIndexRef: lastClickedIndexRef, addNewRowsToSpreadsheet: addNewRowsToSpreadsheet, spreadsheetFilter: spreadsheetFilter, resetSpreadsheetFilter: resetSpreadsheetFilter, filterRecordsByRowType: filterRecordsByRowType, filterRecordsByFieldErrors: filterRecordsByFieldErrors, checkboxColumnWidth: checkboxColumnWidth, setSortBy: setSortBy, isFiltering: isFiltering });
40
+ }, [filteredDataIds.length]);
41
+ var value = __assign(__assign({ filteredDataIds: filteredDataIds, fields: fields }, validationState), { isReadOnly: isReadOnly, options: options, onValidateRecord: onValidateRecord, selectedRows: selectedRows, setSelectedRows: setSelectedRows, lastClickedIndexRef: lastClickedIndexRef, checkboxColumnWidth: checkboxColumnWidth, inefficientRerender: inefficientRerender, setInefficientRerender: setInefficientRerender });
173
42
  return (_jsx(SpreadsheetContext.Provider, __assign({ value: value }, { children: children })));
174
43
  };
175
44
  export var useSpreadsheetContext = function () { return useContext(SpreadsheetContext); };
@@ -0,0 +1,5 @@
1
+ import { Record, RecordDataSet } from "../../../../types";
2
+ export declare const useBatchProcessing: (batchPageSize?: number) => {
3
+ processRecordsInBatches: (records: Record[], handleBatch: (x: any) => void) => Promise<void>;
4
+ processInBatches: (dataSet: RecordDataSet, handleBatch: (x: any) => void) => Promise<void>;
5
+ };
@@ -0,0 +1,81 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ export var useBatchProcessing = function (batchPageSize) {
38
+ if (batchPageSize === void 0) { batchPageSize = 10000; }
39
+ var processRecordsInBatches = function (records, handleBatch) { return __awaiter(void 0, void 0, void 0, function () {
40
+ var dataSetLength, batchSize, batchCount, i, idx, batch;
41
+ return __generator(this, function (_a) {
42
+ switch (_a.label) {
43
+ case 0:
44
+ dataSetLength = records.length;
45
+ batchSize = Math.min(Math.floor(batchPageSize), dataSetLength) || dataSetLength;
46
+ batchCount = Math.ceil(dataSetLength / batchSize);
47
+ i = 0;
48
+ _a.label = 1;
49
+ case 1:
50
+ if (!(i < batchCount)) return [3 /*break*/, 4];
51
+ idx = i * batchSize;
52
+ batch = records.slice(idx, idx + batchSize);
53
+ return [4 /*yield*/, handleBatch(batch)];
54
+ case 2:
55
+ _a.sent();
56
+ _a.label = 3;
57
+ case 3:
58
+ i++;
59
+ return [3 /*break*/, 1];
60
+ case 4: return [2 /*return*/];
61
+ }
62
+ });
63
+ }); };
64
+ var processInBatches = function (dataSet, handleBatch) { return __awaiter(void 0, void 0, void 0, function () {
65
+ var records;
66
+ return __generator(this, function (_a) {
67
+ switch (_a.label) {
68
+ case 0:
69
+ records = Object.values(dataSet);
70
+ return [4 /*yield*/, processRecordsInBatches(records, handleBatch)];
71
+ case 1:
72
+ _a.sent();
73
+ return [2 /*return*/];
74
+ }
75
+ });
76
+ }); };
77
+ return {
78
+ processRecordsInBatches: processRecordsInBatches,
79
+ processInBatches: processInBatches,
80
+ };
81
+ };
@@ -0,0 +1,5 @@
1
+ export declare const useDataSetManipulation: () => {
2
+ appendNewRecordToSpreadsheet: () => void;
3
+ deleteRecordsFromSpreadsheet: (recordIds: string[]) => void;
4
+ findAndReplaceInSpreadsheet: (searchText: string, replaceText: string, matchCase: boolean, useRegex: boolean) => Promise<any[]>;
5
+ };
@@ -0,0 +1,119 @@
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
+ import { useFilteredDataContext } from "../FilteredDataContextProvider";
49
+ import { useDataSetContext } from "../DataSetContextProvider";
50
+ import { hasValueInAnyField } from "./utils";
51
+ import { addMeta } from "../../../../Importer/data";
52
+ import { useEventManagerContext } from "../../../../common/EventManagerContextProvider";
53
+ import { useValidationContext } from "../ValidationContextProvider";
54
+ import { useDuplicateDataContext } from "../DuplicateDataContextProvider";
55
+ import { useBatchProcessing } from "./useBatchProcessing";
56
+ import useFindAndReplace from "../../../../common/Table/TableActions/useFindAndReplace";
57
+ export var useDataSetManipulation = function () {
58
+ var _a = useFilteredDataContext(), lastFilteredRecordId = _a.lastFilteredRecordId, setRecalculateFilters = _a.setRecalculateFilters;
59
+ var _b = useDataSetContext(), getRecord = _b.getRecord, setRecord = _b.setRecord, dataSet = _b.dataSet, deleteRecord = _b.deleteRecord, emptyRecordIds = _b.emptyRecordIds;
60
+ var _c = useEventManagerContext(), emit = _c.emit, EVENTS = _c.EVENTS;
61
+ var _d = useValidationContext(), errors = _d.errors, warnings = _d.warnings, calculateColumnErrorCounts = _d.calculateColumnErrorCounts, calculateColumnWarningCounts = _d.calculateColumnWarningCounts;
62
+ var updateDuplicateValues = useDuplicateDataContext().updateDuplicateValues;
63
+ var updateRecordAndRevalidate = useValidationContext().updateRecordAndRevalidate;
64
+ var processInBatches = useBatchProcessing().processInBatches;
65
+ var replaceInRecord = useFindAndReplace().replaceInRecord;
66
+ var appendNewRecordToSpreadsheet = function () {
67
+ var _a, _b;
68
+ var _record = getRecord(lastFilteredRecordId.current);
69
+ if (!hasValueInAnyField(_record)) {
70
+ return;
71
+ }
72
+ var highestRowIndex = -1;
73
+ for (var recordId in dataSet.current)
74
+ if (((_b = (_a = getRecord(recordId)) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.rowIndex) > highestRowIndex)
75
+ highestRowIndex = getRecord(recordId)._meta.rowIndex;
76
+ var newRow = addMeta({}, highestRowIndex + 1);
77
+ setRecord(newRow._meta.id, newRow);
78
+ emit(EVENTS.ON_LAST_ROW_CHANGED);
79
+ };
80
+ var deleteRecordsFromSpreadsheet = function (recordIds) {
81
+ recordIds.forEach(function (recordId) {
82
+ updateDuplicateValues(getRecord(recordId), {}, false, updateRecordAndRevalidate);
83
+ deleteRecord(recordId);
84
+ calculateColumnErrorCounts(errors.current[recordId], {});
85
+ calculateColumnWarningCounts(warnings.current[recordId], {});
86
+ emptyRecordIds.current.delete(recordId);
87
+ });
88
+ setRecalculateFilters(function (prev) { return !prev; });
89
+ emit(EVENTS.UPDATE_COLUMN_ERROR_COUNT);
90
+ emit(EVENTS.UPDATE_TOTAL_ERROR_COUNT);
91
+ emit(EVENTS.UPDATE_TOTAL_ROW_COUNT);
92
+ };
93
+ var findAndReplaceInSpreadsheet = function (searchText, replaceText, matchCase, useRegex) { return __awaiter(void 0, void 0, void 0, function () {
94
+ var cellsWithText;
95
+ return __generator(this, function (_a) {
96
+ switch (_a.label) {
97
+ case 0:
98
+ cellsWithText = [];
99
+ return [4 /*yield*/, processInBatches(dataSet.current, function (batch) {
100
+ for (var recordKey in batch) {
101
+ var record = __assign({}, batch[recordKey]);
102
+ if (replaceInRecord(record, searchText, replaceText, matchCase, useRegex)) {
103
+ cellsWithText.push(record);
104
+ }
105
+ }
106
+ })];
107
+ case 1:
108
+ _a.sent();
109
+ updateRecordAndRevalidate(cellsWithText);
110
+ return [2 /*return*/, cellsWithText];
111
+ }
112
+ });
113
+ }); };
114
+ return {
115
+ appendNewRecordToSpreadsheet: appendNewRecordToSpreadsheet,
116
+ deleteRecordsFromSpreadsheet: deleteRecordsFromSpreadsheet,
117
+ findAndReplaceInSpreadsheet: findAndReplaceInSpreadsheet,
118
+ };
119
+ };
@@ -1,6 +1,6 @@
1
1
  export type SpreadsheetFilter = {
2
2
  type: "rowBased" | "columnBased";
3
- byRow?: "all" | "invalid" | "valid";
3
+ byRow?: "all" | "invalid" | "duplicates";
4
4
  byColumn?: {
5
5
  type: "fieldWithErrors";
6
6
  field: string;
@@ -1,2 +1,3 @@
1
1
  import { Record } from "../../../../types";
2
2
  export declare const hasValueInAnyField: (record: Record) => boolean;
3
+ export declare const rowIsEmpty: (row: Record) => boolean;
@@ -1,3 +1,4 @@
1
+ import { isEmpty } from "../common";
1
2
  export var hasValueInAnyField = function (record) {
2
3
  return Object.entries(record)
3
4
  .filter(function (_a) {
@@ -12,3 +13,10 @@ export var hasValueInAnyField = function (record) {
12
13
  return value !== null && value !== undefined;
13
14
  });
14
15
  };
16
+ export var rowIsEmpty = function (row) {
17
+ return Object.keys(row).every(function (key) {
18
+ if (key === "_meta")
19
+ return true;
20
+ return isEmpty(row[key]);
21
+ });
22
+ };
@@ -0,0 +1,31 @@
1
+ import { MutableRefObject } from "react";
2
+ import { SpreadsheetOptions } from "../../../..";
3
+ import { BatchValidationErrors, CalculateColumnCount, ColumnWithCount, Field, OnValidateRecord, Record } from "../../../../types";
4
+ type UseValidationStateArgs = {
5
+ onValidateRecord?: OnValidateRecord;
6
+ fields: Field[];
7
+ options: SpreadsheetOptions;
8
+ isReadOnly: boolean;
9
+ children: any;
10
+ };
11
+ export type ValidationState = {
12
+ isValid: boolean;
13
+ isValidationCompleted: boolean;
14
+ validationPercentage: number;
15
+ errors: MutableRefObject<BatchValidationErrors>;
16
+ warnings: MutableRefObject<BatchValidationErrors>;
17
+ totalErrorCount: MutableRefObject<number>;
18
+ invalidRowsCountRef: MutableRefObject<number>;
19
+ columnsWithErrorCounts: MutableRefObject<ColumnWithCount>;
20
+ columnsWithWarningCounts: MutableRefObject<ColumnWithCount>;
21
+ calculateColumnErrorCounts?: CalculateColumnCount;
22
+ calculateColumnWarningCounts?: CalculateColumnCount;
23
+ };
24
+ type UseValidationStateReturnValue = ValidationState & {
25
+ updateRecordAndRevalidate: (record: Record | Record[], initialValidation?: boolean, loadingIndicator?: boolean) => Promise<void>;
26
+ spreadsheetInitialized: boolean;
27
+ };
28
+ export declare const ValidationContext: import("react").Context<UseValidationStateReturnValue>;
29
+ export declare const ValidationContextProvider: ({ fields, isReadOnly, onValidateRecord, children, }: UseValidationStateArgs) => JSX.Element;
30
+ export declare const useValidationContext: () => UseValidationStateReturnValue;
31
+ export {};