fuse-importer 0.1.7-testing → 0.2.0-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 (108) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +11 -9
  2. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +3 -3
  3. package/lib/esm/Importer/PreviewFirstTime.js +1 -1
  4. package/lib/esm/Importer/PreviewModeBanner.js +2 -2
  5. package/lib/esm/Importer/Review/AppResponseModal.js +2 -2
  6. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +2 -2
  7. package/lib/esm/Importer/Review/ReviewContextProvider.js +6 -6
  8. package/lib/esm/Importer/Stepper/StepperSubmitModal.js +21 -4
  9. package/lib/esm/Importer/Stepper/index.js +35 -20
  10. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterSectionHeader/index.js +1 -1
  11. package/lib/esm/Importer/WarningsBanner.d.ts +3 -0
  12. package/lib/esm/Importer/WarningsBanner.js +42 -0
  13. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +5 -4
  14. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +104 -50
  15. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +1 -0
  16. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +6 -1
  17. package/lib/esm/Importer/common/Spreadsheet/KeyboardEventContextProvider/index.d.ts +7 -0
  18. package/lib/esm/Importer/common/Spreadsheet/KeyboardEventContextProvider/index.js +73 -0
  19. package/lib/esm/Importer/common/Spreadsheet/SearchContextProvider/index.d.ts +15 -0
  20. package/lib/esm/Importer/common/Spreadsheet/SearchContextProvider/index.js +43 -0
  21. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +3 -2
  22. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +40 -26
  23. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +2 -1
  24. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +2 -1
  25. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +2 -2
  26. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +13 -4
  27. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useCellSelection.d.ts +24 -0
  28. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useCellSelection.js +207 -0
  29. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +4 -0
  30. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +118 -12
  31. package/lib/esm/Importer/common/Spreadsheet/UndoRedoContextProvider/index.d.ts +16 -0
  32. package/lib/esm/Importer/common/Spreadsheet/UndoRedoContextProvider/index.js +104 -0
  33. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +1 -1
  34. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +39 -14
  35. package/lib/esm/Importer/common/Spreadsheet/common/index.d.ts +1 -1
  36. package/lib/esm/Importer/common/Spreadsheet/common/index.js +13 -5
  37. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.d.ts +6 -0
  38. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.js +94 -0
  39. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData/CellContextProvider.d.ts +23 -0
  40. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData/CellContextProvider.js +128 -0
  41. package/lib/esm/Importer/common/Spreadsheet/components/{SpreadsheetData.d.ts → SpreadsheetData/index.d.ts} +1 -1
  42. package/lib/esm/Importer/common/Spreadsheet/components/{SpreadsheetData.js → SpreadsheetData/index.js} +19 -18
  43. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +7 -7
  44. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.js +3 -4
  45. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +8 -8
  46. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.d.ts +11 -0
  47. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +26 -18
  48. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +1 -2
  49. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +4 -8
  50. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.d.ts +5 -0
  51. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js +231 -0
  52. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.d.ts → transformators/index.d.ts} +6 -6
  53. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.js → transformators/index.js} +24 -45
  54. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +1 -1
  55. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +2 -0
  56. package/lib/esm/Importer/common/theme.d.ts +1 -0
  57. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +8 -1
  58. package/lib/esm/Importer/contexts/ImporterContextProvider.js +18 -5
  59. package/lib/esm/Importer/data/index.d.ts +0 -1
  60. package/lib/esm/Importer/data/index.js +0 -37
  61. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +1 -1
  62. package/lib/esm/Importer/hooks/useSubmitToServer.js +55 -9
  63. package/lib/esm/common/CircleSpinner.d.ts +1 -0
  64. package/lib/esm/common/CircleSpinner.js +13 -0
  65. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +56 -21
  66. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +28 -23
  67. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +3 -3
  68. package/lib/esm/common/Table/TableActions/RowFilters.js +3 -3
  69. package/lib/esm/common/Table/TableActions/SearchRows.js +25 -25
  70. package/lib/esm/common/Table/TableActions/TableActions.js +7 -4
  71. package/lib/esm/common/Table/TableActions/TableActions.styles.js +2 -2
  72. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +3 -3
  73. package/lib/esm/common/Table/TableActions/icons.d.ts +1 -0
  74. package/lib/esm/common/Table/TableActions/icons.js +1 -0
  75. package/lib/esm/common/Table/TableActions/useFindAndReplace.d.ts +5 -0
  76. package/lib/esm/common/Table/TableActions/useFindAndReplace.js +45 -0
  77. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +1 -1
  78. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  79. package/lib/esm/common/Table/TableView/index.js +2 -2
  80. package/lib/esm/common/Table/TableView/types.d.ts +1 -0
  81. package/lib/esm/common/Toast.d.ts +42 -3
  82. package/lib/esm/common/Toast.js +56 -19
  83. package/lib/esm/common/datePatterns.d.ts +0 -1
  84. package/lib/esm/common/datePatterns.js +0 -10
  85. package/lib/esm/common/icons/index.d.ts +3 -0
  86. package/lib/esm/common/icons/index.js +5 -2
  87. package/lib/esm/common/inputs/Autocomplete.js +2 -2
  88. package/lib/esm/common/inputs/Checkbox.d.ts +2 -1
  89. package/lib/esm/common/inputs/Checkbox.js +9 -7
  90. package/lib/esm/common/inputs/TextInput.d.ts +1 -0
  91. package/lib/esm/common/inputs/TextInput.js +10 -2
  92. package/lib/esm/index.js +1 -1
  93. package/lib/esm/locales/de.d.ts +10 -0
  94. package/lib/esm/locales/de.js +10 -0
  95. package/lib/esm/locales/en.d.ts +23 -0
  96. package/lib/esm/locales/en.js +23 -0
  97. package/lib/esm/locales/es.d.ts +10 -0
  98. package/lib/esm/locales/es.js +10 -0
  99. package/lib/esm/locales/fr.d.ts +10 -0
  100. package/lib/esm/locales/fr.js +10 -0
  101. package/lib/esm/styled/theme/colorPalette.d.ts +2 -0
  102. package/lib/esm/styled/theme/colorPalette.js +1 -0
  103. package/lib/esm/styled/theme/index.d.ts +1 -0
  104. package/lib/esm/types.d.ts +1 -0
  105. package/lib/main.js +6 -6
  106. package/package.json +1 -1
  107. package/lib/esm/Importer/TrialModeBanner.d.ts +0 -1
  108. package/lib/esm/Importer/TrialModeBanner.js +0 -22
@@ -55,10 +55,11 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
55
  return to.concat(ar || Array.prototype.slice.call(from));
56
56
  };
57
57
  import { useState } from "react";
58
- import { useImporterContext, } from "../contexts/ImporterContextProvider";
59
58
  import { isRecordEmpty } from "../../Importer/common/Spreadsheet/common";
60
59
  import { sendRecordsToIntegrations } from "../../Importer/common/utils";
61
60
  import { getTemplateFields, recordListToDataSet } from "../../Importer/data";
61
+ import { addToast } from "../../common";
62
+ import { useImporterContext, } from "../contexts/ImporterContextProvider";
62
63
  var trackImportedRowsCount = function (fuseApi, templateSlug, rowCount) { return __awaiter(void 0, void 0, void 0, function () {
63
64
  var error_1, errorMessage;
64
65
  var _a, _b;
@@ -82,21 +83,41 @@ var trackImportedRowsCount = function (fuseApi, templateSlug, rowCount) { return
82
83
  });
83
84
  }); };
84
85
  var buildColumnMappingsFromHeaderMatchings = function (templateHeaders, templateHeaderMatchings) {
85
- return templateHeaders.map(function (column) {
86
+ return templateHeaders
87
+ .filter(function (column) { return column.label && templateHeaderMatchings[column.label]; })
88
+ .map(function (column) {
86
89
  return {
87
90
  matched_column_name: templateHeaderMatchings[column.label],
88
91
  template_column_name: column.label,
89
92
  };
90
93
  });
91
94
  };
92
- var saveMappedColumns = function (columnMappings, fuseApi, templateSlug) { return __awaiter(void 0, void 0, void 0, function () {
95
+ var buildValueMappingsFromHeaderValueMatchings = function (enumFieldValueMatchings) {
96
+ var mappings = Object.values(enumFieldValueMatchings).map(function (column) {
97
+ var valuesMappings = [];
98
+ for (var _i = 0, _a = Object.entries(column); _i < _a.length; _i++) {
99
+ var _b = _a[_i], key = _b[0], value = _b[1];
100
+ if (!value) {
101
+ continue;
102
+ }
103
+ valuesMappings.push({
104
+ matched_value: key,
105
+ template_value: value,
106
+ });
107
+ }
108
+ return valuesMappings;
109
+ });
110
+ return mappings.flat();
111
+ };
112
+ var saveMappedColumns = function (columnMappings, valueMappings, fuseApi, templateSlug) { return __awaiter(void 0, void 0, void 0, function () {
93
113
  var error_2;
94
114
  return __generator(this, function (_a) {
95
115
  switch (_a.label) {
96
116
  case 0:
97
117
  _a.trys.push([0, 2, , 3]);
98
118
  return [4 /*yield*/, fuseApi.patch("/api/v1/importer/templates/".concat(templateSlug), {
99
- column_mappings_attributes: columnMappings,
119
+ column_mappings: columnMappings,
120
+ value_mappings: valueMappings,
100
121
  })];
101
122
  case 1:
102
123
  _a.sent();
@@ -118,13 +139,36 @@ var filterAndMapWithBackendErrors = function (dataSet, errors) {
118
139
  return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { isInvalid: true, backendErrors: errors[rId] }) });
119
140
  }, []);
120
141
  };
121
- export var useSubmitToServer = function (setIsTransformTooltipOpened) {
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;
142
+ var checkWrongData = function (dataSet, errors, reviewFields) {
143
+ var errorsKeys = Object.keys(errors);
144
+ var highestRowIndex = 0;
145
+ Object.values(dataSet).forEach(function (record) {
146
+ highestRowIndex = Math.max(highestRowIndex, record._meta.rowIndex);
147
+ });
148
+ var _loop_1 = function (currErrorId) {
149
+ var allFieldsName = reviewFields.map(function (field) { return field.name; });
150
+ var columnsOnError = Object.keys(errors[currErrorId]);
151
+ columnsOnError.forEach(function (column) {
152
+ if (!allFieldsName.includes(column)) {
153
+ addToast("Invalid column \"".concat(column, "\""), "error");
154
+ }
155
+ });
156
+ if (+currErrorId > highestRowIndex) {
157
+ addToast("Invalid row id \"".concat(currErrorId, "\""), "error");
158
+ }
159
+ };
160
+ for (var _i = 0, errorsKeys_1 = errorsKeys; _i < errorsKeys_1.length; _i++) {
161
+ var currErrorId = errorsKeys_1[_i];
162
+ _loop_1(currErrorId);
163
+ }
164
+ };
165
+ export var useSubmitToServer = function (setHasTransformedRecords) {
166
+ var _a = useImporterContext(), enumFieldValueMatchings = _a.enumFieldValueMatchings, templateHeaderMatchings = _a.templateHeaderMatchings, templateHeaders = _a.templateHeaders, integrations = _a.integrations, templateSlug = _a.templateSlug, fuseApi = _a.fuseApi, previewMode = _a.importerOptions.previewMode, onSubmit = _a.onSubmit;
123
167
  var _b = useState(false), isSubmitting = _b[0], setIsSubmitting = _b[1];
124
168
  var _c = useState(false), importWasSuccessful = _c[0], setImportWasSuccessful = _c[1];
125
169
  var _d = useState(null), appResponse = _d[0], setAppResponse = _d[1];
126
170
  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;
171
+ var dataSetValues, reviewFields_1, validDataSetValues, validDataSetLength, invalidRecords_1, applicationResponse, isAppResponseSuccessful, _a, errors, isDataValid, recordsToDisplayFiltered, invalidDataSet, columnMappings, valueMappings, error_3;
128
172
  return __generator(this, function (_b) {
129
173
  switch (_b.label) {
130
174
  case 0:
@@ -146,6 +190,7 @@ export var useSubmitToServer = function (setIsTransformTooltipOpened) {
146
190
  if (!isAppResponseSuccessful) {
147
191
  _a = (applicationResponse !== null && applicationResponse !== void 0 ? applicationResponse : {}).errors, errors = _a === void 0 ? {} : _a;
148
192
  invalidRecords_1 = __spreadArray(__spreadArray([], filterAndMapWithBackendErrors(dataSet, errors), true), invalidRecords_1, true);
193
+ checkWrongData(dataSet, errors, reviewFields_1);
149
194
  }
150
195
  isDataValid = invalidRecords_1.length === 0;
151
196
  setImportWasSuccessful(isDataValid && isAppResponseSuccessful);
@@ -158,7 +203,7 @@ export var useSubmitToServer = function (setIsTransformTooltipOpened) {
158
203
  invalidRecords_1 = __spreadArray(__spreadArray([], invalidRecords_1, true), (recordsToDisplayFiltered || []), true);
159
204
  }
160
205
  invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields_1, false).dataSet;
161
- setIsTransformTooltipOpened(false);
206
+ setHasTransformedRecords(false);
162
207
  afterSubmitCallback(invalidDataSet);
163
208
  if (!!previewMode) return [3 /*break*/, 5];
164
209
  return [4 /*yield*/, trackImportedRowsCount(fuseApi, templateSlug, validDataSetLength)];
@@ -168,7 +213,8 @@ export var useSubmitToServer = function (setIsTransformTooltipOpened) {
168
213
  case 3:
169
214
  _b.sent();
170
215
  columnMappings = buildColumnMappingsFromHeaderMatchings(templateHeaders, templateHeaderMatchings);
171
- return [4 /*yield*/, saveMappedColumns(columnMappings, fuseApi, templateSlug)];
216
+ valueMappings = buildValueMappingsFromHeaderValueMatchings(enumFieldValueMatchings);
217
+ return [4 /*yield*/, saveMappedColumns(columnMappings, valueMappings, fuseApi, templateSlug)];
172
218
  case 4:
173
219
  _b.sent();
174
220
  _b.label = 5;
@@ -0,0 +1 @@
1
+ export declare const CircleSpinner: () => JSX.Element;
@@ -0,0 +1,13 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ import styled from "styled-components";
7
+ var SpinnerContainer = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n animation: spin 1s linear infinite;\n background: transparent;\n border-radius: 50%;\n height: 24px;\n overflow: hidden;\n position: relative;\n width: 24px;\n z-index: 0;\n\n @keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n }\n"], ["\n animation: spin 1s linear infinite;\n background: transparent;\n border-radius: 50%;\n height: 24px;\n overflow: hidden;\n position: relative;\n width: 24px;\n z-index: 0;\n\n @keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n }\n"])));
8
+ var SpinBlocker = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background: black;\n border-radius: 50%;\n height: 80%;\n left: 10%;\n position: absolute;\n top: 10%;\n width: 80%;\n"], ["\n background: black;\n border-radius: 50%;\n height: 80%;\n left: 10%;\n position: absolute;\n top: 10%;\n width: 80%;\n"])));
9
+ var Spin = styled.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background: linear-gradient(\n to bottom right,\n rgba(255, 255, 255, 0.85) 50%,\n rgba(0, 0, 0, 0) 150%\n );\n height: 50%;\n left: 0;\n position: absolute;\n top: 50%;\n width: 50%;\n z-index: -1;\n"], ["\n background: linear-gradient(\n to bottom right,\n rgba(255, 255, 255, 0.85) 50%,\n rgba(0, 0, 0, 0) 150%\n );\n height: 50%;\n left: 0;\n position: absolute;\n top: 50%;\n width: 50%;\n z-index: -1;\n"])));
10
+ export var CircleSpinner = function () {
11
+ return (_jsxs(SpinnerContainer, { children: [_jsx(SpinBlocker, {}), _jsx(Spin, {})] }));
12
+ };
13
+ var templateObject_1, templateObject_2, templateObject_3;
@@ -6,12 +6,19 @@ export var useDragAndDrop = function (_a) {
6
6
  var onComplete = _a.onComplete, saveFileName = _a.saveFileName, setIsLoading = _a.setIsLoading, validHeadersCount = _a.validHeadersCount;
7
7
  var onDrop = function (acceptedFiles) {
8
8
  acceptedFiles.forEach(function (file) {
9
+ if (file.size <= 0) {
10
+ addToast("Cannot upload an empty file.", "error");
11
+ return;
12
+ }
9
13
  setIsLoading && setIsLoading(true);
10
14
  saveFileName(file.name);
11
15
  var reader = new FileReader();
12
16
  var isCsvFile = file.type === "text/csv";
13
17
  reader.onabort = function () { return console.log("file reading was aborted"); };
14
- reader.onerror = function () { return console.log("file reading has failed"); };
18
+ reader.onerror = function () {
19
+ addToast("An error occurred while reading the file.", "error");
20
+ setIsLoading && setIsLoading(false);
21
+ };
15
22
  reader.onload = function (event) {
16
23
  var _a;
17
24
  var results = event.target.result;
@@ -22,31 +29,59 @@ export var useDragAndDrop = function (_a) {
22
29
  onComplete(parserResults.data);
23
30
  setIsLoading && setIsLoading(false);
24
31
  },
32
+ error: function (error) {
33
+ addToast("An error occurred while parsing the CSV: ".concat(error.message), "error");
34
+ setIsLoading && setIsLoading(false);
35
+ },
25
36
  });
26
37
  return;
27
38
  }
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);
39
+ var arr = new Uint8Array(event.target.result).subarray(0, 4);
40
+ var header = "";
41
+ for (var i = 0; i < arr.length; i++) {
42
+ header += arr[i].toString(16);
45
43
  }
46
- else {
47
- onComplete(fileData);
44
+ // Check the file signature
45
+ var isExcelFile = header === "504b34" || header === "d0cf11e0"; // .xlsx or .xls
46
+ if (!isExcelFile) {
47
+ addToast("The file is not a valid Excel file.", "error");
48
+ setIsLoading && setIsLoading(false);
49
+ return;
50
+ }
51
+ try {
52
+ var getDataFromFile = function (fileResults) {
53
+ // rounded value to 20MB
54
+ var isLargeFile = file.size > 20000000;
55
+ var workBook = XLSX.read(fileResults, {
56
+ type: "array",
57
+ codepage: 65001,
58
+ raw: true,
59
+ dense: isLargeFile,
60
+ });
61
+ var workBookName = workBook.SheetNames[0];
62
+ var sheet = workBook.Sheets[workBookName];
63
+ return XLSX.utils.sheet_to_json(sheet, { header: 1, raw: false });
64
+ };
65
+ var fileData = getDataFromFile(results);
66
+ if (!fileData.length) {
67
+ addToast("The file appears to be empty or cannot be parsed.", "error");
68
+ setIsLoading && setIsLoading(false);
69
+ return;
70
+ }
71
+ var headersCount = (_a = fileData[0]) === null || _a === void 0 ? void 0 : _a.length;
72
+ if (validHeadersCount && !validHeadersCount(headersCount)) {
73
+ addToast("Invalid header count in file.", "error");
74
+ setIsLoading && setIsLoading(false);
75
+ }
76
+ else {
77
+ onComplete(fileData);
78
+ setIsLoading && setIsLoading(false);
79
+ }
80
+ }
81
+ catch (error) {
82
+ addToast("An error occurred while processing the file: ".concat(error.message), "error");
83
+ setIsLoading && setIsLoading(false);
48
84
  }
49
- setIsLoading && setIsLoading(false);
50
85
  };
51
86
  if (isCsvFile) {
52
87
  reader.readAsText(file);
@@ -105,30 +105,35 @@ export var CustomActions = function () {
105
105
  var handleCustomAction = function (actionKey) { return __awaiter(void 0, void 0, void 0, function () {
106
106
  var recordsToRunAction, action, processRecordsInBatches, toastMessage;
107
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*/];
108
+ switch (_a.label) {
109
+ case 0:
110
+ recordsToRunAction = selectedRows.map(function (recordId) {
111
+ return getRecord(recordId);
112
+ });
113
+ action = customActions.find(function (action) { return action.name === actionKey; });
114
+ if (!action || Object.keys(action).length === 0) {
115
+ addToast(t("table_actions.custom_actions.general_error_toast"), "error");
116
+ return [2 /*return*/];
124
117
  }
125
- });
126
- }); });
127
- toastMessage = t("table_actions.custom_actions.success_toast", {
128
- actionName: action.name,
129
- });
130
- addToast(toastMessage, "success");
131
- return [2 /*return*/];
118
+ processRecordsInBatches = useBatchProcessing().processRecordsInBatches;
119
+ return [4 /*yield*/, processRecordsInBatches(recordsToRunAction, function (batch) { return __awaiter(void 0, void 0, void 0, function () {
120
+ return __generator(this, function (_a) {
121
+ switch (_a.label) {
122
+ case 0: return [4 /*yield*/, processBatch(batch, action)];
123
+ case 1:
124
+ _a.sent();
125
+ return [2 /*return*/];
126
+ }
127
+ });
128
+ }); })];
129
+ case 1:
130
+ _a.sent();
131
+ toastMessage = t("table_actions.custom_actions.success_toast", {
132
+ actionName: action.name,
133
+ });
134
+ addToast(toastMessage, "success");
135
+ return [2 /*return*/];
136
+ }
132
137
  });
133
138
  }); };
134
139
  var onSelect = function (value) {
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { useTranslation } from "react-i18next";
4
- import { addToast } from "../../../../common/Toast";
5
4
  import { useReviewContext, useSpreadsheetContext } from "../../../../Importer";
6
5
  import { useFilteredDataContext } from "../../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
7
6
  import { useValidationContext } from "../../../../Importer/common/Spreadsheet/ValidationContextProvider";
7
+ import { addToast } from "../../../../common/Toast";
8
8
  import { useEventManagerContext } from "../../../EventManagerContextProvider";
9
9
  import * as S from "./FilterByErrors.styles";
10
10
  export var FilterByErrors = function () {
@@ -12,7 +12,7 @@ export var FilterByErrors = function () {
12
12
  var _c = useFilteredDataContext(), spreadsheetFilter = _c.spreadsheetFilter, resetSpreadsheetFilter = _c.resetSpreadsheetFilter, filterRecordsByFieldErrors = _c.filterRecordsByFieldErrors;
13
13
  var _d = useEventManagerContext(), on = _d.on, off = _d.off, EVENTS = _d.EVENTS;
14
14
  var fields = useSpreadsheetContext().fields;
15
- var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
15
+ var hasTransformedRecords = useReviewContext().hasTransformedRecords;
16
16
  var columnsWithErrorCounts = useValidationContext().columnsWithErrorCounts;
17
17
  var t = useTranslation("review").t;
18
18
  var _e = useState([]), errorArray = _e[0], setErrorArray = _e[1];
@@ -72,6 +72,6 @@ export var FilterByErrors = function () {
72
72
  : isMenuOpened
73
73
  ? search_or_select
74
74
  : prefix;
75
- var isDisabled = errorArray.length === 0 || isTransformTooltipOpened;
75
+ var isDisabled = errorArray.length === 0 || hasTransformedRecords;
76
76
  return (_jsx(S.StyledAutocomplete, { placement: "bottom", placeholder: inputText, onToggle: function (v) { return !isDisabled && setIsMenuOpened(v); }, onChange: onChange, value: selectedErrorToFilter, options: errorArray, isDisabled: isDisabled, isInputDisabled: isDisabled, inputWidth: inputWidth, "data-testid": "ta-filter-by-errors", prefix: inputText }));
77
77
  };
@@ -39,13 +39,13 @@ var Filter = function (_a) {
39
39
  var labelToId = function (label) {
40
40
  return label.toLowerCase().replace(/\s/g, "_") + "_filter";
41
41
  };
42
- return (_jsxs(Div, __assign({ disabledWhen: isDisabled, dflex: true, clickable: true, onClick: function () { return !isDisabled && onClick(); }, "data-test-id": labelToId(label) }, { children: [_jsxs(FilterContainer, __assign({ isSelected: isSelected }, { children: [label, count >= 0 && _jsxs(_Fragment, { children: ["\u00A0(", count.toLocaleString(), ")"] })] })), isSelected && filteredInputValue !== "" && (_jsx(FilteredDataCount, { children: _jsx(Div, __assign({ minw: 14, centered: true }, { children: filteredDataIds.length })) }))] })));
42
+ return (_jsx(Div, __assign({ disabledWhen: isDisabled, dflex: true, clickable: true, onClick: function () { return !isDisabled && onClick(); }, "data-test-id": labelToId(label) }, { children: _jsxs(FilterContainer, __assign({ isSelected: isSelected }, { children: [label, count >= 0 && _jsxs(_Fragment, { children: ["\u00A0(", count.toLocaleString(), ")"] })] })) })));
43
43
  };
44
44
  export var RowFilters = function () {
45
45
  var _a = useFilteredDataContext(), spreadsheetFilter = _a.spreadsheetFilter, filterRecordsByRowType = _a.filterRecordsByRowType;
46
46
  var _b = useDuplicateDataContext(), duplicateRecordIds = _b.duplicateRecordIds, calculateDuplicateRecords = _b.calculateDuplicateRecords;
47
47
  var invalidRowsCountRef = useValidationContext().invalidRowsCountRef;
48
- var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
48
+ var hasTransformedRecords = useReviewContext().hasTransformedRecords;
49
49
  var _c = useState(invalidRowsCountRef.current), invalidRowsCount = _c[0], setInvalidRowsCount = _c[1];
50
50
  var _d = useDataSetContext(), dataSetLength = _d.dataSetLength, emptyRecordIds = _d.emptyRecordIds;
51
51
  var _e = useEventManagerContext(), on = _e.on, off = _e.off, EVENTS = _e.EVENTS;
@@ -89,6 +89,6 @@ export var RowFilters = function () {
89
89
  }
90
90
  filterRecordsByRowType("invalid");
91
91
  };
92
- return (_jsx(Wrapper, __assign({ isDisabled: isTransformTooltipOpened }, { children: _jsxs(Container, { children: [_jsx(Filter, { isSelected: spreadsheetFilter.byRow === "all", label: all_rows, count: recordsWithValuesCount, onClick: function () { return onAllSelected(); } }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "invalid", label: invalid_rows, count: invalidRowsCount, onClick: function () { return onInvalidSelected(); } }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "duplicates", label: duplicates, count: duplicateRecordIds.size, onClick: function () { return onDuplicatesSelected(); } })] }) })));
92
+ return (_jsx(Wrapper, __assign({ isDisabled: hasTransformedRecords }, { children: _jsxs(Container, { children: [_jsx(Filter, { isSelected: spreadsheetFilter.byRow === "all", label: all_rows, count: recordsWithValuesCount, onClick: function () { return onAllSelected(); }, "data-test-id": "all_rows_filter" }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "invalid", label: invalid_rows, count: invalidRowsCount, onClick: function () { return onInvalidSelected(); }, "data-test-id": "invalid_filter" }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "duplicates", label: duplicates, count: duplicateRecordIds.size, onClick: function () { return onDuplicatesSelected(); }, "data-test-id": "duplicates_filter" })] }) })));
93
93
  };
94
94
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;
@@ -13,18 +13,20 @@ var __assign = (this && this.__assign) || function () {
13
13
  };
14
14
  return __assign.apply(this, arguments);
15
15
  };
16
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
- import { useRef, useState } from "react";
16
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
17
+ import { useRef } from "react";
18
18
  import { useTranslation } from "react-i18next";
19
19
  import styled, { css } from "styled-components";
20
- import { TooltipProvider } from "../../../common/TooltipProvider";
21
- import { useDebounce } from "../../../hooks";
22
20
  import { useReviewContext } from "../../../Importer";
23
21
  import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
22
+ import { FindAndReplaceModal } from "../../../Importer/common/Spreadsheet/components/FindAndReplace";
23
+ import { TooltipProvider } from "../../../common/TooltipProvider";
24
+ import { useDebounce } from "../../../hooks";
24
25
  import { Div } from "../../../styled";
25
26
  import { colors } from "../../../styled/theme/colorPalette";
26
27
  import { textStyles } from "../../../styled/theme/textStyles";
27
- import { SearchIcon } from "./icons";
28
+ import { ReplaceIcon, SearchIcon } from "./icons";
29
+ import { useSearchContext } from "../../../Importer/common/Spreadsheet/SearchContextProvider";
28
30
  var Wrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n height: 24px;\n overflow: hidden;\n padding: 8px;\n position: relative;\n transition: width 0.25s ease-in-out;\n width: ", ";\n"], ["\n background: ", ";\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n height: 24px;\n overflow: hidden;\n padding: 8px;\n position: relative;\n transition: width 0.25s ease-in-out;\n width: ", ";\n"])), function (_a) {
29
31
  var isOpen = _a.isOpen;
30
32
  return (isOpen ? colors.orange50 : "none");
@@ -33,43 +35,41 @@ var Wrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplate
33
35
  return (isOpen ? "332px" : "24px");
34
36
  });
35
37
  var IconWrapper = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n height: 24px;\n width: 24px;\n"], ["\n height: 24px;\n width: 24px;\n"])));
36
- var Input = styled.input(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n ", ";\n width: 100%;\n\n background-color: none;\n background: none;\n border: none;\n box-shadow: none;\n color: ", ";\n height: 20px;\n line-height: 20px;\n outline: none;\n padding: 1px 2px;\n\n ", ";\n"], ["\n ", ";\n width: 100%;\n\n background-color: none;\n background: none;\n border: none;\n box-shadow: none;\n color: ", ";\n height: 20px;\n line-height: 20px;\n outline: none;\n padding: 1px 2px;\n\n ", ";\n"])), textStyles.body3, colors.gray700, function (_a) {
38
+ var ResultsText = styled.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n font-size: 14px;\n line-height: 20px;\n color: ", ";\n display: block;\n text-wrap: nowrap;\n text-align: right;\n border-right: solid 1px ", ";\n margin-right: 8px;\n padding-right: 8px;\n"], ["\n font-size: 14px;\n line-height: 20px;\n color: ", ";\n display: block;\n text-wrap: nowrap;\n text-align: right;\n border-right: solid 1px ", ";\n margin-right: 8px;\n padding-right: 8px;\n"])), colors.gray700, colors.gray300);
39
+ var ActionsWrapper = styled.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n align-items: flex-center;\n"], ["\n display: flex;\n align-items: flex-center;\n"])));
40
+ var Input = styled.input(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n ", ";\n width: 100%;\n\n background-color: none;\n background: none;\n border: none;\n box-shadow: none;\n color: ", ";\n height: 20px;\n line-height: 20px;\n outline: none;\n padding: 1px 2px;\n\n ", ";\n"], ["\n ", ";\n width: 100%;\n\n background-color: none;\n background: none;\n border: none;\n box-shadow: none;\n color: ", ";\n height: 20px;\n line-height: 20px;\n outline: none;\n padding: 1px 2px;\n\n ", ";\n"])), textStyles.body3, colors.gray700, function (_a) {
37
41
  var isOpen = _a.isOpen;
38
- return !isOpen && css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n top: -9999px;\n "], ["\n position: absolute;\n top: -9999px;\n "])));
42
+ return !isOpen && css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n position: absolute;\n top: -9999px;\n "], ["\n position: absolute;\n top: -9999px;\n "])));
39
43
  });
40
44
  var SearchInput = function (_a) {
41
45
  var testId = _a.testId, value = _a.value, onChange = _a.onChange, isDisabled = _a.isDisabled;
42
46
  var _b = useDebounce(value, onChange, 300), _value = _b._value, set_Value = _b.set_Value;
43
- var inputRef = useRef(null);
44
- var _c = useState(false), isOpen = _c[0], setIsOpen = _c[1];
47
+ var filteredDataIds = useFilteredDataContext().filteredDataIds;
48
+ var _c = useSearchContext(), findAndReplaceModalOpen = _c.findAndReplaceModalOpen, setFindAndReplaceModalOpen = _c.setFindAndReplaceModalOpen, openSearchInput = _c.openSearchInput, closeSearchInput = _c.closeSearchInput, searchInputRef = _c.searchInputRef, isOpen = _c.isOpen;
49
+ var actionsRef = useRef();
45
50
  var t = useTranslation("review").t;
46
51
  var handleInputChange = function (_a) {
47
52
  var target = _a.target;
48
53
  set_Value(target.value);
49
54
  };
50
- var handleInputOnBlur = function () {
51
- if (!_value) {
52
- setIsOpen(false);
53
- }
54
- };
55
- var handleWrapperClick = function () {
56
- var _a;
57
- if (!isOpen) {
58
- setIsOpen(true);
59
- if (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) {
60
- (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
61
- }
55
+ var handleInputOnBlur = function (e) {
56
+ if (!_value && e.relatedTarget !== actionsRef.current) {
57
+ closeSearchInput();
62
58
  }
63
59
  };
64
- return (_jsx(TooltipProvider, __assign({ tooltip: !isOpen && !isDisabled ? t("table_actions.search_rows.tooltip") : "", placement: "right", flip: false, centered: true, w: "auto", "data-testid": testId }, { children: _jsxs(Wrapper, __assign({ isOpen: isOpen, onClick: function () { return !isDisabled && handleWrapperClick(); }, disabledWhen: isDisabled }, { children: [_jsx(IconWrapper, { children: _jsx(SearchIcon, {}) }), _jsx(Input, { isOpen: isOpen, ref: inputRef, value: _value, onChange: handleInputChange, onBlur: handleInputOnBlur, type: "text", placeholder: t("table_actions.search_rows.placeholder") })] })) })));
60
+ return (_jsxs(Div, { children: [_jsx(TooltipProvider, __assign({ tooltip: !isOpen && !isDisabled && !findAndReplaceModalOpen
61
+ ? t("table_actions.search_rows.tooltip")
62
+ : "", placement: "right", flip: false, centered: true, w: "auto", "data-testid": testId }, { children: _jsxs(Wrapper, __assign({ isOpen: isOpen, onClick: function () { return !isDisabled && openSearchInput(); }, disabledWhen: isDisabled }, { children: [_jsx(IconWrapper, { children: _jsx(SearchIcon, {}) }), _jsx(Input, { isOpen: isOpen, ref: searchInputRef, value: _value, onChange: handleInputChange, onBlur: handleInputOnBlur, type: "text", placeholder: t("table_actions.search_rows.placeholder") }), _jsxs(ActionsWrapper, __assign({ "data-cy": "open-find-replace", ref: actionsRef, onClick: function () { return setFindAndReplaceModalOpen(true); }, tabIndex: 0 }, { children: [_jsx(ResultsText, { children: t("table_actions.search_rows.number_of_results", {
63
+ length: value ? filteredDataIds.length : 0,
64
+ }) }), _jsx(IconWrapper, { children: _jsx(ReplaceIcon, {}) })] }))] })) })), _jsx(Div, { children: findAndReplaceModalOpen && (_jsx(FindAndReplaceModal, { initialText: value, onClose: function () { return setFindAndReplaceModalOpen(false); } })) })] }));
65
65
  };
66
66
  export var SearchRows = function (_a) {
67
67
  var _b = _a.testId, testId = _b === void 0 ? "ta-search-rows" : _b;
68
68
  var _c = useFilteredDataContext(), filteredInputValue = _c.filteredInputValue, setFilteredInputValue = _c.setFilteredInputValue;
69
- var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
69
+ var hasTransformedRecords = useReviewContext().hasTransformedRecords;
70
70
  var handleChangeInputValue = function (value) {
71
71
  setFilteredInputValue(value);
72
72
  };
73
- return (_jsx(SearchInput, { testId: testId, value: filteredInputValue, onChange: handleChangeInputValue, isDisabled: isTransformTooltipOpened }));
73
+ return (_jsx(_Fragment, { children: _jsx(SearchInput, { testId: testId, value: filteredInputValue, onChange: handleChangeInputValue, isDisabled: hasTransformedRecords }) }));
74
74
  };
75
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
75
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;
@@ -22,7 +22,7 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  };
23
23
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
24
  import { useReviewContext } from "../../../Importer";
25
- import { defaultTableActionsHeightPx } from "./common";
25
+ import { useValidationContext } from "../../../Importer/common/Spreadsheet/ValidationContextProvider";
26
26
  import { CustomActions } from "./CustomActions";
27
27
  import { DeleteSelectedRows } from "./DeleteSelectedRows";
28
28
  import { ExportData } from "./ExportData";
@@ -32,11 +32,14 @@ import { SearchRows } from "./SearchRows";
32
32
  import * as S from "./TableActions.styles";
33
33
  import { TransformedRecordsCount } from "./TransformedRecordsCount";
34
34
  import ValidationProgress from "./ValidationProgress";
35
+ import { defaultTableActionsHeightPx } from "./common";
35
36
  export var TableActions = function (_a) {
36
37
  var _b = _a.tableActionsHeight, tableActionsHeight = _b === void 0 ? defaultTableActionsHeightPx : _b, props = __rest(_a, ["tableActionsHeight"]);
37
- var _c = useReviewContext(), isTransformTooltipOpened = _c.isTransformTooltipOpened, setIsTransformTooltipOpened = _c.setIsTransformTooltipOpened;
38
+ var _c = useReviewContext(), hasTransformedRecords = _c.hasTransformedRecords, setHasTransformedRecords = _c.setHasTransformedRecords;
39
+ var isValidationCompleted = useValidationContext().isValidationCompleted;
38
40
  var onCloseTransformsTooltip = function () {
39
- setIsTransformTooltipOpened(false);
41
+ setHasTransformedRecords(false);
40
42
  };
41
- return (_jsxs(S.TableActionsContainer, __assign({ height: tableActionsHeight }, props, { children: [_jsxs(S.TableActionsContent, { children: [_jsx(SearchRows, {}), _jsx(RowFilters, {}), _jsx(FilterByErrors, {}), _jsxs(S.ButtonActionsContainer, { children: [_jsx(DeleteSelectedRows, {}), _jsx(ExportData, {}), _jsx(CustomActions, {})] })] }), _jsxs(S.TableActionsInformations, { children: [_jsx(ValidationProgress, {}), isTransformTooltipOpened && (_jsx(TransformedRecordsCount, { onClose: onCloseTransformsTooltip }))] })] })));
43
+ var shouldShowTransformedCount = hasTransformedRecords && isValidationCompleted;
44
+ return (_jsxs(S.TableActionsContainer, __assign({ height: tableActionsHeight }, props, { children: [_jsxs(S.TableActionsContent, { children: [_jsx(SearchRows, {}), _jsx(RowFilters, {}), _jsx(FilterByErrors, {}), _jsxs(S.ButtonActionsContainer, { children: [_jsx(DeleteSelectedRows, {}), _jsx(ExportData, {}), _jsx(CustomActions, {})] })] }), _jsxs(S.TableActionsInformations, { children: [_jsx(ValidationProgress, {}), shouldShowTransformedCount && (_jsx(TransformedRecordsCount, { onClose: onCloseTransformsTooltip }))] })] })));
42
45
  };
@@ -4,7 +4,7 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
4
4
  };
5
5
  import styled from "styled-components";
6
6
  import { Div } from "../../../styled/utils";
7
- export var TableActionsContainer = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n align-items: center;\n background: ", ";\n border-top: 1px solid ", ";\n display: flex;\n justify-content: space-between;\n padding: 8px 32px;\n width: 100%;\n\n * {\n box-sizing: content-box;\n }\n"], ["\n align-items: center;\n background: ", ";\n border-top: 1px solid ", ";\n display: flex;\n justify-content: space-between;\n padding: 8px 32px;\n width: 100%;\n\n * {\n box-sizing: content-box;\n }\n"])), function (_a) {
7
+ export var TableActionsContainer = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n align-items: center;\n background: ", ";\n border-top: 1px solid ", ";\n display: flex;\n justify-content: space-between;\n padding: 8px 32px;\n width: 100%;\n"], ["\n align-items: center;\n background: ", ";\n border-top: 1px solid ", ";\n display: flex;\n justify-content: space-between;\n padding: 8px 32px;\n width: 100%;\n"])), function (_a) {
8
8
  var theme = _a.theme;
9
9
  return theme.colors.white;
10
10
  }, function (_a) {
@@ -13,6 +13,6 @@ export var TableActionsContainer = styled(Div)(templateObject_1 || (templateObje
13
13
  });
14
14
  export var ButtonActionsContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 8px;\n"], ["\n align-items: center;\n display: flex;\n gap: 8px;\n"])));
15
15
  export var TableActionsContent = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n"])));
16
- export var TableActionsInformations = styled(Div)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n position: relative;\n z-index: 101;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n position: relative;\n z-index: 101;\n"])));
16
+ export var TableActionsInformations = styled(Div)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n position: relative;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n position: relative;\n"])));
17
17
  export var ActionButton = styled.button(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n align-items: center;\n background: transparent;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n display: flex;\n height: 36px;\n justify-content: center;\n padding: 0px;\n width: 36px;\n\n :disabled {\n opacity: 0.6;\n\n :hover {\n background-color: transparent !important;\n cursor: not-allowed;\n }\n }\n"], ["\n align-items: center;\n background: transparent;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n display: flex;\n height: 36px;\n justify-content: center;\n padding: 0px;\n width: 36px;\n\n :disabled {\n opacity: 0.6;\n\n :hover {\n background-color: transparent !important;\n cursor: not-allowed;\n }\n }\n"])));
18
18
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
@@ -17,11 +17,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
17
17
  import { useEffect, useMemo, useState } from "react";
18
18
  import { useTranslation } from "react-i18next";
19
19
  import styled from "styled-components";
20
- import { Button } from "../../../common/buttons";
21
20
  import { useSpreadsheetContext } from "../../../Importer";
22
21
  import { useDataSetContext } from "../../../Importer/common/Spreadsheet/DataSetContextProvider";
23
22
  import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
24
- import { colors, Div } from "../../../styled";
23
+ import { Button } from "../../../common/buttons";
24
+ import { Div, colors } from "../../../styled";
25
25
  import { truncateString } from "../../../utils";
26
26
  import { CheckIcon } from "./icons";
27
27
  var formatToLocaleString = function (number) {
@@ -30,7 +30,7 @@ var formatToLocaleString = function (number) {
30
30
  maximumFractionDigits: 0,
31
31
  });
32
32
  };
33
- var RecordsCountContainer = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: relative;\n z-index: 2;\n\n * {\n box-sizing: border-box;\n }\n"], ["\n position: relative;\n z-index: 2;\n\n * {\n box-sizing: border-box;\n }\n"])));
33
+ var RecordsCountContainer = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: relative;\n\n * {\n box-sizing: border-box;\n }\n"], ["\n position: relative;\n\n * {\n box-sizing: border-box;\n }\n"])));
34
34
  var Counter = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n background: ", ";\n border-radius: 35px;\n display: flex;\n padding: 0px 18px;\n position: relative;\n user-select: none;\n z-index: 101;\n"], ["\n align-items: center;\n background: ", ";\n border-radius: 35px;\n display: flex;\n padding: 0px 18px;\n position: relative;\n user-select: none;\n z-index: 101;\n"])), colors.blue100);
35
35
  var TooltipContainer = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background: ", ";\n border-radius: 8px;\n box-shadow: 0px 3.53px 63.58px 0px #b7a6a640;\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 16px 32px 24px 24px;\n position: absolute;\n right: 0px;\n top: 66px;\n width: clamp(150px, 379px, 379px);\n z-index: 101;\n\n &::before {\n border-color: transparent transparent #ffffff transparent;\n border-radius: 4px;\n border-style: solid;\n border-width: 0 14.5px 24px 14.5px;\n content: \"\";\n height: 0;\n position: absolute;\n right: -4px;\n top: -6px;\n transform: rotate(120deg);\n width: 0;\n }\n"], ["\n background: ", ";\n border-radius: 8px;\n box-shadow: 0px 3.53px 63.58px 0px #b7a6a640;\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 16px 32px 24px 24px;\n position: absolute;\n right: 0px;\n top: 66px;\n width: clamp(150px, 379px, 379px);\n z-index: 101;\n\n &::before {\n border-color: transparent transparent #ffffff transparent;\n border-radius: 4px;\n border-style: solid;\n border-width: 0 14.5px 24px 14.5px;\n content: \"\";\n height: 0;\n position: absolute;\n right: -4px;\n top: -6px;\n transform: rotate(120deg);\n width: 0;\n }\n"])), colors.white);
36
36
  var ExampleCode = styled(Div)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n align-items: center;\n background: ", ";\n border-radius: 4px;\n display: flex;\n justify-content: space-between;\n padding: 4px;\n"], ["\n align-items: center;\n background: ", ";\n border-radius: 4px;\n display: flex;\n justify-content: space-between;\n padding: 4px;\n"])), colors.blue100);
@@ -4,3 +4,4 @@ export declare const SearchIcon: () => JSX.Element;
4
4
  export declare const DownloadIcon: () => JSX.Element;
5
5
  export declare const CheckIcon: () => JSX.Element;
6
6
  export declare const ActionPlus: () => JSX.Element;
7
+ export declare const ReplaceIcon: () => JSX.Element;
@@ -16,3 +16,4 @@ export var SearchIcon = function () { return (_jsxs("svg", __assign({ width: "24
16
16
  export var DownloadIcon = function () { return (_jsxs("svg", __assign({ width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: [_jsx("path", { d: "M10.0834 18C9.66675 16.75 9.66675 15.5 9.66675 14.6303C9.66675 11.7319 12.2621 8.83337 15.4637 8.83337C17.6094 8.83337 19.4828 9.99914 20.4852 11.7319H21.2607C23.6619 11.7319 25.9167 13.4167 25.9167 15.5C25.9167 16.3334 25.9167 17.1667 25.5001 18", stroke: "#262626", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M14.1807 23.2764L17.5834 26.5416L20.9862 23.2764", stroke: "#262626", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M17.5833 25.6827L17.5833 16.4375", stroke: "#262626", strokeWidth: "2", strokeLinecap: "round" })] }))); };
17
17
  export var CheckIcon = function () { return (_jsxs("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", width: "53", height: "53", viewBox: "0 0 53 53", fill: "none" }, { children: [_jsx("rect", { width: "53", height: "53", fill: "white" }), _jsx("g", __assign({ style: { mixBlendMode: "multiply" } }, { children: _jsx("path", { d: "M40.6023 5.38665C41.3381 4.56281 42.6024 4.49142 43.4263 5.22719L51.5083 12.4453C52.3321 13.181 52.4035 14.4454 51.6677 15.2692L23.539 46.7647C22.8032 47.5885 21.5389 47.6599 20.7151 46.9242L12.6331 39.7061C11.8092 38.9703 11.7378 37.706 12.4736 36.8822L40.6023 5.38665Z", fill: "url(#paint0_linear_643_341)" }) })), _jsx("g", __assign({ style: { mixBlendMode: "darken" } }, { children: _jsx("rect", { x: "32.0707", y: "37.1587", width: "14.836", height: "29.7113", rx: "2", transform: "rotate(131.582 32.0707 37.1587)", fill: "url(#paint1_linear_643_341)" }) })), _jsxs("defs", { children: [_jsxs("linearGradient", __assign({ id: "paint0_linear_643_341", x1: "15.4625", y1: "39.0861", x2: "31.139", y2: "48.4231", gradientUnits: "userSpaceOnUse" }, { children: [_jsx("stop", { stopColor: "#D0A617" }), _jsx("stop", { offset: "1", stopColor: "#FEE18F" })] })), _jsxs("linearGradient", __assign({ id: "paint1_linear_643_341", x1: "39.4887", y1: "37.1587", x2: "29.9147", y2: "74.1394", gradientUnits: "userSpaceOnUse" }, { children: [_jsx("stop", { stopColor: "#6BEEFF" }), _jsx("stop", { offset: "1", stopColor: "#08CABE" })] }))] })] }))); };
18
18
  export var ActionPlus = function () { return (_jsx("svg", __assign({ width: "16", height: "17", viewBox: "0 0 16 17", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: _jsxs("g", __assign({ id: "Actions Plus" }, { children: [_jsx("path", { id: "Vector 4", d: "M8 2.91602V14.916", stroke: "#909090", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { id: "Vector 5", d: "M2 8.91602L14 8.91602", stroke: "#909090", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] })) }))); };
19
+ export var ReplaceIcon = function () { return (_jsx("svg", __assign({ width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: _jsx("path", { d: "M19.5 15.6666V6.33334C19.5 5.04467 18.4553 4 17.1666 4H10.75M19.5 15.6666L16 12.1667M19.5 15.6666L23 12.1667M5.5 8.66665V18C5.5 19.2887 6.54469 20.3333 7.83332 20.3333H14.25M5.5 8.66665L9.00001 12.1667M5.5 8.66665L2 12.1667", stroke: "#262626", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }))); };
@@ -0,0 +1,5 @@
1
+ import { Record } from "../../../types";
2
+ declare const useFindAndReplace: () => {
3
+ replaceInRecord: (record: Record, searchText: string, replaceText: string, matchCase: boolean, useRegex: boolean) => boolean;
4
+ };
5
+ export default useFindAndReplace;
@@ -0,0 +1,45 @@
1
+ import { useSpreadsheetContext } from "../../../Importer";
2
+ var useFindAndReplace = function () {
3
+ var fields = useSpreadsheetContext().fields;
4
+ var replaceTextWithRegex = function (value, searchText, replaceText, matchCase) {
5
+ var regex = new RegExp(searchText, matchCase ? "g" : "ig");
6
+ return value.replace(regex, replaceText);
7
+ };
8
+ var replaceCaseInsensitive = function (str, searchText, rby) {
9
+ var pos = str.toLowerCase().indexOf(searchText.toLowerCase());
10
+ return pos == -1
11
+ ? str
12
+ : str.substring(0, pos) + rby + str.substring(pos + searchText.length);
13
+ };
14
+ var replaceTextWithoutRegex = function (value, searchText, replaceText, matchCase) {
15
+ if (matchCase) {
16
+ return value.replace(searchText, replaceText);
17
+ }
18
+ else {
19
+ return replaceCaseInsensitive(value, searchText, replaceText);
20
+ }
21
+ };
22
+ var replaceInRecord = function (record, searchText, replaceText, matchCase, useRegex) {
23
+ var textFound = false;
24
+ fields.forEach(function (f) {
25
+ if (!record[f.name])
26
+ return;
27
+ var newValue;
28
+ if (useRegex) {
29
+ newValue = replaceTextWithRegex(record[f.name].toString(), searchText, replaceText, matchCase);
30
+ }
31
+ else {
32
+ newValue = replaceTextWithoutRegex(record[f.name].toString(), searchText, replaceText, matchCase);
33
+ }
34
+ if (record[f.name] !== newValue) {
35
+ record[f.name] = newValue;
36
+ textFound = true;
37
+ }
38
+ });
39
+ return textFound;
40
+ };
41
+ return {
42
+ replaceInRecord: replaceInRecord,
43
+ };
44
+ };
45
+ export default useFindAndReplace;