fuse-importer 0.1.6-testing → 0.1.8-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 (55) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +1 -1
  2. package/lib/esm/Importer/Review/AppResponseModal.js +2 -2
  3. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +2 -0
  4. package/lib/esm/Importer/Review/ReviewContextProvider.js +18 -13
  5. package/lib/esm/Importer/Stepper/index.js +26 -13
  6. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterSectionHeader/index.js +2 -2
  7. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +0 -2
  8. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +3 -4
  9. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +1 -0
  10. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +29 -0
  11. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +17 -8
  12. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.d.ts +6 -0
  13. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.js +44 -0
  14. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +6 -4
  15. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.js +2 -2
  16. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +2 -2
  17. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +1 -2
  18. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +5 -9
  19. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.d.ts +5 -0
  20. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js +231 -0
  21. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.d.ts → transformators/index.d.ts} +6 -6
  22. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.js → transformators/index.js} +24 -45
  23. package/lib/esm/Importer/common/theme.d.ts +1 -0
  24. package/lib/esm/Importer/data/index.d.ts +5 -2
  25. package/lib/esm/Importer/data/index.js +14 -46
  26. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +1 -1
  27. package/lib/esm/Importer/hooks/useSubmitToServer.js +3 -2
  28. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +6 -5
  29. package/lib/esm/common/Table/TableActions/RowFilters.js +3 -3
  30. package/lib/esm/common/Table/TableActions/SearchRows.js +21 -13
  31. package/lib/esm/common/Table/TableActions/TableActions.js +9 -4
  32. package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
  33. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +5 -1
  34. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +19 -39
  35. package/lib/esm/common/Table/TableActions/icons.d.ts +1 -0
  36. package/lib/esm/common/Table/TableActions/icons.js +1 -0
  37. package/lib/esm/common/Table/TableActions/useFindAndReplace.d.ts +5 -0
  38. package/lib/esm/common/Table/TableActions/useFindAndReplace.js +45 -0
  39. package/lib/esm/common/Toast.d.ts +34 -3
  40. package/lib/esm/common/Toast.js +31 -15
  41. package/lib/esm/common/buttons.js +6 -6
  42. package/lib/esm/common/datePatterns.d.ts +0 -1
  43. package/lib/esm/common/datePatterns.js +0 -10
  44. package/lib/esm/common/icons/index.d.ts +3 -0
  45. package/lib/esm/common/icons/index.js +5 -2
  46. package/lib/esm/common/inputs/Checkbox.d.ts +2 -1
  47. package/lib/esm/common/inputs/Checkbox.js +9 -7
  48. package/lib/esm/locales/en.d.ts +13 -0
  49. package/lib/esm/locales/en.js +13 -0
  50. package/lib/esm/styled/theme/colorPalette.d.ts +2 -0
  51. package/lib/esm/styled/theme/colorPalette.js +1 -0
  52. package/lib/esm/styled/theme/index.d.ts +1 -0
  53. package/lib/esm/styled/theme/textCss.js +1 -1
  54. package/lib/main.js +6 -6
  55. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ import { DateTime } from "luxon";
2
+ var MONTH_NAMES = [
3
+ "january",
4
+ "february",
5
+ "march",
6
+ "april",
7
+ "may",
8
+ "june",
9
+ "july",
10
+ "august",
11
+ "september",
12
+ "october",
13
+ "november",
14
+ "december",
15
+ ];
16
+ var MONTH_ABBREVIATIONS = [
17
+ "jan",
18
+ "feb",
19
+ "mar",
20
+ "apr",
21
+ "may",
22
+ "jun",
23
+ "jul",
24
+ "aug",
25
+ "sep",
26
+ "oct",
27
+ "nov",
28
+ "dec",
29
+ ];
30
+ var DAY_NAMES = [
31
+ "sunday",
32
+ "monday",
33
+ "tuesday",
34
+ "wednesday",
35
+ "thursday",
36
+ "friday",
37
+ "saturday",
38
+ ];
39
+ var DAY_ABBREVIATIONS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
40
+ var tryParseCommonDateFormats = function (input) {
41
+ var _a, _b, _c;
42
+ var trimmedInput = input.trim();
43
+ var len = trimmedInput.length;
44
+ if (len < 6 || len > 10)
45
+ return null;
46
+ var parts = input.split(/[-/.]/);
47
+ if (parts.length !== 3)
48
+ return null;
49
+ var _d = parts.map(Number), first = _d[0], second = _d[1], third = _d[2];
50
+ var year, month, day;
51
+ if (parts[2].length === 4) {
52
+ _a = [first, second, third], month = _a[0], day = _a[1], year = _a[2];
53
+ }
54
+ else if (parts[0].length === 4) {
55
+ _b = [first, second, third], year = _b[0], month = _b[1], day = _b[2];
56
+ }
57
+ else if (parts[2].length === 2) {
58
+ // Handles the case where year is two digits
59
+ _c = [first, second, third], month = _c[0], day = _c[1], year = _c[2];
60
+ year += year < 50 ? 2000 : 1900; // Convert to 4 digits
61
+ }
62
+ else {
63
+ return null; // Unknown format
64
+ }
65
+ if (year >= 0 && month >= 1 && month <= 12 && day >= 1 && day <= 31) {
66
+ var dt = DateTime.fromObject({ day: day, month: month, year: year });
67
+ return dt.isValid ? dt : null;
68
+ }
69
+ return null;
70
+ };
71
+ export var parseDateFromUserInput = function (userInput) {
72
+ var datePart = userInput;
73
+ var hasTimePart = userInput.indexOf(":") !== -1 && userInput.split(":").length > 1;
74
+ if (hasTimePart) {
75
+ var parts = userInput.trim().split(" ");
76
+ datePart =
77
+ parts.length === 2
78
+ ? parts[0].indexOf(":") !== -1
79
+ ? parts[1]
80
+ : parts[0]
81
+ : userInput;
82
+ }
83
+ var commonFormatResult = tryParseCommonDateFormats(datePart);
84
+ if (commonFormatResult)
85
+ return commonFormatResult;
86
+ var cleanedInput = datePart
87
+ .trim()
88
+ .split(/[\s;|:.\/-]+/)
89
+ .filter(Boolean)
90
+ .map(function (word) { return word.toLowerCase(); });
91
+ var possibleDay = null, possibleMonth = null, possibleYear = null;
92
+ for (var _i = 0, cleanedInput_1 = cleanedInput; _i < cleanedInput_1.length; _i++) {
93
+ var word = cleanedInput_1[_i];
94
+ if (DAY_NAMES.includes(word) || DAY_ABBREVIATIONS.includes(word))
95
+ continue;
96
+ var num = parseInt(word, 10);
97
+ if (!possibleDay && num > 0 && num <= 31) {
98
+ possibleDay = num;
99
+ continue;
100
+ }
101
+ if (!possibleMonth) {
102
+ var monthIndex = MONTH_NAMES.indexOf(word);
103
+ if (monthIndex === -1)
104
+ monthIndex = MONTH_ABBREVIATIONS.indexOf(word);
105
+ if (monthIndex !== -1) {
106
+ possibleMonth = monthIndex + 1;
107
+ continue;
108
+ }
109
+ else if (num > 0 && num <= 12) {
110
+ possibleMonth = num;
111
+ continue;
112
+ }
113
+ }
114
+ if (!possibleYear && num >= 0) {
115
+ possibleYear = num < 100 ? num + (num < 50 ? 2000 : 1900) : num;
116
+ continue;
117
+ }
118
+ }
119
+ if (possibleDay && possibleMonth && possibleYear) {
120
+ return DateTime.fromObject({
121
+ day: possibleDay,
122
+ month: possibleMonth,
123
+ year: possibleYear,
124
+ });
125
+ }
126
+ return null;
127
+ };
128
+ export var parseTimeFromUserInput = function (input) {
129
+ var cleanedInput = input
130
+ .trim()
131
+ .replace(/\s*:\s*/g, ":")
132
+ .replace(/\s+(AM|PM|am|pm)\s*$/, " $1");
133
+ var len = cleanedInput.length;
134
+ if (len < 4 || len > 16)
135
+ return null;
136
+ var hour = 0, minute = 0, second = 0, millisecond = 0;
137
+ var meridiem = null;
138
+ var parts = cleanedInput.split(" ");
139
+ if (parts.length > 2)
140
+ return null;
141
+ if (parts.length === 2) {
142
+ meridiem = parts[1].toUpperCase();
143
+ if (meridiem !== "AM" && meridiem !== "PM")
144
+ return null;
145
+ }
146
+ var timeParts = parts[0].split(":");
147
+ if (timeParts.length < 2 || timeParts.length > 3)
148
+ return null;
149
+ hour = parseInt(timeParts[0], 10);
150
+ minute = parseInt(timeParts[1], 10);
151
+ if (isNaN(hour) || isNaN(minute))
152
+ return null;
153
+ if (timeParts.length === 3) {
154
+ var secondParts = timeParts[2].split("."); // Split to consider milliseconds
155
+ second = parseInt(secondParts[0], 10);
156
+ if (secondParts.length === 2) {
157
+ millisecond = parseInt(secondParts[1], 10);
158
+ }
159
+ if (isNaN(second) || isNaN(millisecond))
160
+ return null;
161
+ }
162
+ if (hour < 0 ||
163
+ hour > 23 ||
164
+ minute < 0 ||
165
+ minute > 59 ||
166
+ second < 0 ||
167
+ second > 59 ||
168
+ millisecond < 0 ||
169
+ millisecond > 999)
170
+ return null;
171
+ if (meridiem === "PM" && hour < 12) {
172
+ hour += 12;
173
+ }
174
+ else if (meridiem === "AM" && hour === 12) {
175
+ hour = 0;
176
+ }
177
+ var dateTime = DateTime.fromObject({ hour: hour, minute: minute, second: second, millisecond: millisecond });
178
+ return dateTime.isValid ? dateTime : null;
179
+ };
180
+ export var parseTimeFromDateTimeorTimeInput = function (userInput) {
181
+ var res1 = parseTimeFromUserInput(userInput);
182
+ if (res1)
183
+ return res1;
184
+ var res2 = parseDateTimeFromUserInput(userInput);
185
+ if (res2)
186
+ return res2;
187
+ return null;
188
+ };
189
+ export var parseDateTimeFromUserInput = function (userInput) {
190
+ var fromISO = DateTime.fromISO(userInput);
191
+ if (fromISO.isValid && userInput.includes("T"))
192
+ return fromISO;
193
+ var cleanedInput = userInput.trim().replace(/\s+/g, " ").toLowerCase();
194
+ var words = cleanedInput.split(" ");
195
+ var datePart = "";
196
+ var timePart = "";
197
+ var meridiem = "";
198
+ for (var _i = 0, words_1 = words; _i < words_1.length; _i++) {
199
+ var word = words_1[_i];
200
+ if (word === "am" || word === "pm") {
201
+ meridiem = word.toUpperCase();
202
+ continue;
203
+ }
204
+ if (word.includes(":")) {
205
+ timePart = word;
206
+ continue;
207
+ }
208
+ datePart = "".concat(datePart, " ").concat(word);
209
+ }
210
+ if (meridiem) {
211
+ timePart = "".concat(timePart, " ").concat(meridiem);
212
+ }
213
+ var dateObject = parseDateFromUserInput(datePart.trim());
214
+ if (!dateObject || !dateObject.isValid)
215
+ return null;
216
+ var timeObject = parseTimeFromUserInput(timePart.trim());
217
+ if (!timeObject || !timeObject.isValid)
218
+ return null;
219
+ if (!timeObject || !timeObject.isValid)
220
+ return null;
221
+ var combinedDateTime = DateTime.fromObject({
222
+ year: dateObject.year,
223
+ month: dateObject.month,
224
+ day: dateObject.day,
225
+ hour: timeObject.hour,
226
+ minute: timeObject.minute,
227
+ second: timeObject.second,
228
+ millisecond: timeObject.millisecond,
229
+ });
230
+ return combinedDateTime.isValid ? combinedDateTime : null;
231
+ };
@@ -1,18 +1,18 @@
1
- import { Field, FieldTransformation } from "../../../../types";
1
+ import { Field, FieldTransformation } from "../../../../../types";
2
2
  export type FieldTransformator = (fieldValue: any, transformation?: FieldTransformation, fieldOptions?: Field) => {
3
3
  transformationWasNeeded: boolean;
4
4
  original: any;
5
5
  transformed: any;
6
6
  };
7
- export type DateTimeTransformator = (fieldValue: any, transformation?: FieldTransformation, fieldOptions?: Field, possibleDateFormats?: string[]) => {
7
+ export type FieldTransformations = Partial<{
8
+ [key: string]: FieldTransformator;
9
+ }>;
10
+ export declare const isTransformationNeeded: (fieldValue: any, transformedValue: any) => {
8
11
  transformationWasNeeded: boolean;
9
12
  original: any;
10
13
  transformed: any;
11
14
  };
12
- export type FieldTransformations = Partial<{
13
- [key: string]: FieldTransformator | DateTimeTransformator;
14
- }>;
15
15
  export declare const datesDateTimesAndTimesTransformations: FieldTransformations;
16
16
  export declare const fieldTransformations: {
17
- [x: string]: FieldTransformator | DateTimeTransformator;
17
+ [x: string]: FieldTransformator;
18
18
  };
@@ -9,11 +9,15 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- import { DateTime } from "luxon";
13
- var isTransformationNeeded = function (fieldValue, transformedValue) { return ({
14
- transformationWasNeeded: fieldValue !== transformedValue,
12
+ import { parseDateFromUserInput, parseDateTimeFromUserInput, parseTimeFromDateTimeorTimeInput, } from "./dateTimeAutoformatUtils";
13
+ export var isTransformationNeeded = function (fieldValue, transformedValue) { return ({
14
+ transformationWasNeeded: !!transformedValue
15
+ ? fieldValue !== transformedValue
16
+ : false,
15
17
  original: fieldValue,
16
- transformed: fieldValue === transformedValue ? null : transformedValue,
18
+ transformed: fieldValue === transformedValue || transformedValue === undefined
19
+ ? null
20
+ : transformedValue,
17
21
  }); };
18
22
  var isNotANumber = function (fieldValue) {
19
23
  return fieldValue === null || fieldValue === undefined || isNaN(fieldValue);
@@ -79,49 +83,24 @@ var stringFieldTransformations = {
79
83
  return isTransformationNeeded(fieldValue, transformedValue);
80
84
  },
81
85
  };
82
- var parseDate = function (date, possibleFormats) {
83
- if (!date)
84
- return null;
85
- for (var i = 0; i < possibleFormats.length; i++) {
86
- var format = possibleFormats[i];
87
- try {
88
- var currentDate = DateTime.fromFormat(date, format, { zone: "utc" });
89
- if (currentDate.isValid) {
90
- return currentDate;
91
- }
92
- }
93
- catch (error) {
94
- return null;
95
- }
96
- }
97
- return null;
98
- };
99
86
  export var datesDateTimesAndTimesTransformations = {
100
- autoformat: function (fieldValue, _, fieldOptions, possibleDateFormats) {
101
- var cleanFieldValue = fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.replace(/"/g, "");
102
- var normalizedFieldValue = cleanFieldValue === null || cleanFieldValue === void 0 ? void 0 : cleanFieldValue.replace(/-/g, "/");
103
- var isUnixTimestamp = /^\d+$/.test(normalizedFieldValue);
104
- var luxonDate = isUnixTimestamp
105
- ? DateTime.fromSeconds(Number(normalizedFieldValue))
106
- : parseDate(normalizedFieldValue, possibleDateFormats);
107
- var pattern = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.pattern;
108
- var defaultObj = {
109
- transformationWasNeeded: false,
110
- original: fieldValue,
111
- transformed: null,
112
- };
113
- if (!fieldValue || !pattern || !luxonDate || isNaN(luxonDate.toSeconds())) {
114
- return defaultObj;
115
- }
116
- if (!luxonDate.isValid) {
117
- return defaultObj;
118
- }
119
- var transformedValue = luxonDate.toFormat(pattern);
120
- return {
121
- transformationWasNeeded: fieldValue !== transformedValue,
122
- original: fieldValue,
123
- transformed: transformedValue,
87
+ autoformat: function (fieldValue, _, fieldOptions) {
88
+ if (fieldValue === null || fieldValue === undefined)
89
+ return {
90
+ transformationWasNeeded: false,
91
+ original: fieldValue,
92
+ transformed: null,
93
+ };
94
+ var type = fieldOptions.type, pattern = fieldOptions.pattern;
95
+ var parseFunctions = {
96
+ date: parseDateFromUserInput,
97
+ datetime: parseDateTimeFromUserInput,
98
+ time: parseTimeFromDateTimeorTimeInput,
124
99
  };
100
+ var parseFn = parseFunctions[type];
101
+ var dateValue = parseFn(fieldValue);
102
+ var transformedValue = dateValue === null || dateValue === void 0 ? void 0 : dateValue.toFormat(pattern);
103
+ return isTransformationNeeded(fieldValue, transformedValue);
125
104
  },
126
105
  };
127
106
  var urlTransformations = {
@@ -42,6 +42,7 @@ declare const getCustomTheme: (importerStylePreferences: ImporterStylePreference
42
42
  red50: string;
43
43
  red100: string;
44
44
  red200: string;
45
+ red250: string;
45
46
  red300: string;
46
47
  red400: string;
47
48
  red500: string;
@@ -7,8 +7,10 @@ export declare const addEmptyRows: (data: Record[], fields: Field[]) => (Record
7
7
  };
8
8
  })[];
9
9
  export declare const addMeta: (record: any, index: number, uploadedRow?: any, transformedRow?: TransformedRecord) => Record;
10
- export declare const calculatePossibleDateFormats: (fieldsWithDateTransformations: Field[], sample: Record[]) => string[];
11
- export declare const recordListToDataSet: (data: Record[], fields: Field[]) => RecordDataSet;
10
+ export declare const recordListToDataSet: (data: Record[], fields: Field[], withTransformations?: boolean) => {
11
+ isDatasetTransformed: boolean;
12
+ dataSet: RecordDataSet;
13
+ };
12
14
  type transformToRecordsArgs = {
13
15
  templateHeaderMatchings: HeaderMatchings;
14
16
  enumFieldValueMatchings: EnumFieldValueMatchings;
@@ -46,6 +48,7 @@ type GetReviewDataSetArgs = {
46
48
  fields: Field[];
47
49
  };
48
50
  export declare const getReviewDataSet: ({ records, fields }: GetReviewDataSetArgs) => {
51
+ isDatasetTransformed: boolean;
49
52
  initialDataSet: {
50
53
  [x: string]: Record;
51
54
  };
@@ -18,13 +18,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
18
18
  }
19
19
  return to.concat(ar || Array.prototype.slice.call(from));
20
20
  };
21
- import { datesDateTimesAndTimesTransformations } from "../../Importer/common/Spreadsheet/transformation/transformators";
22
21
  import { transformRecord } from "../../Importer/common/Spreadsheet/transformation";
23
22
  import { FieldTypes, } from "../../types";
24
23
  import { parseValue } from "../common/Spreadsheet/common";
25
- import { DateTime } from "luxon";
26
- import { allowedPatternValues } from "../../common/datePatterns";
27
- import _ from "lodash";
28
24
  var MINIMUM_ROW_COUNT = 20;
29
25
  var getRowId = function (index) {
30
26
  return index.toString();
@@ -43,62 +39,34 @@ export var addEmptyRows = function (data, fields) {
43
39
  export var addMeta = function (record, index, uploadedRow, transformedRow) {
44
40
  var _a;
45
41
  if (uploadedRow === void 0) { uploadedRow = null; }
46
- if (transformedRow === void 0) { transformedRow = null; }
42
+ if (transformedRow === void 0) { transformedRow = {}; }
47
43
  var rId = getRowId(index);
48
44
  var meta = (_a = record._meta) !== null && _a !== void 0 ? _a : {};
49
- return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { id: rId, rowIndex: index, uploadedRow: uploadedRow, transformedRow: __assign(__assign({}, meta.transformedRow), transformedRow) }) });
45
+ return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { id: rId, rowIndex: index, uploadedRow: uploadedRow, transformedRow: transformedRow }) });
50
46
  };
51
- export var calculatePossibleDateFormats = function (fieldsWithDateTransformations, sample) {
52
- var possibleDateFormats = [];
53
- for (var _i = 0, sample_1 = sample; _i < sample_1.length; _i++) {
54
- var record = sample_1[_i];
55
- for (var _a = 0, fieldsWithDateTransformations_1 = fieldsWithDateTransformations; _a < fieldsWithDateTransformations_1.length; _a++) {
56
- var field = fieldsWithDateTransformations_1[_a];
57
- var value = record[field.name];
58
- if (!value)
59
- continue;
60
- for (var i = 0; i < allowedPatternValues.length; i++) {
61
- var format = allowedPatternValues[i];
62
- try {
63
- var currentDate = DateTime.fromFormat(value, format);
64
- if (currentDate.isValid) {
65
- possibleDateFormats.push(format);
66
- }
67
- }
68
- catch (e) { }
69
- }
70
- }
71
- }
72
- return Array.from(new Set(possibleDateFormats));
73
- };
74
- export var recordListToDataSet = function (data, fields) {
47
+ export var recordListToDataSet = function (data, fields, withTransformations) {
48
+ if (withTransformations === void 0) { withTransformations = true; }
75
49
  var fieldWithTransformations = fields.filter(function (field) { var _a; return ((_a = field === null || field === void 0 ? void 0 : field.transformations) === null || _a === void 0 ? void 0 : _a.length) > 0; });
76
50
  var initialData = data;
77
51
  if (data.length < MINIMUM_ROW_COUNT) {
78
52
  initialData = addEmptyRows(data, fields);
79
53
  }
80
- var fieldsWithDateTransformations = fieldWithTransformations.filter(function (field) {
81
- return field.transformations.some(function (t) {
82
- return Object.keys(datesDateTimesAndTimesTransformations).includes(t.transformation_type);
83
- });
84
- });
85
- var possibleDateFormats = [];
86
- if (fieldsWithDateTransformations.length > 0) {
87
- possibleDateFormats.push.apply(possibleDateFormats, calculatePossibleDateFormats(fieldsWithDateTransformations, _.sampleSize(initialData, 100)));
88
- }
89
- return initialData.reduce(function (dataSet, record, i) {
90
- var transformedRecord = null;
91
- if (fieldWithTransformations.length > 0) {
54
+ var isDatasetTransformed = false;
55
+ var res = initialData.reduce(function (dataSet, record, i) {
56
+ var transformedRecord = {};
57
+ if (withTransformations && fieldWithTransformations.length > 0) {
92
58
  transformedRecord = transformRecord({
93
59
  record: record,
94
60
  fields: fieldWithTransformations,
95
- possibleDateFormats: possibleDateFormats,
96
61
  });
97
62
  }
63
+ if (JSON.stringify(transformedRecord) !== "{}")
64
+ isDatasetTransformed = true;
98
65
  var recordWithMeta = addMeta(record, i, undefined, transformedRecord);
99
66
  dataSet[recordWithMeta._meta.id] = recordWithMeta;
100
67
  return dataSet;
101
68
  }, {});
69
+ return { isDatasetTransformed: isDatasetTransformed, dataSet: res };
102
70
  };
103
71
  var compareFormattedRecord = function (originalRecord, formattedRecord) {
104
72
  var comparisonResult = {};
@@ -177,7 +145,7 @@ export var getPreviewDataSet = function (_a) {
177
145
  });
178
146
  return entry;
179
147
  });
180
- return recordListToDataSet(data, fields);
148
+ return recordListToDataSet(data, fields).dataSet;
181
149
  };
182
150
  return { fields: fields, initialDataSet: getInitialDataSet() };
183
151
  };
@@ -197,7 +165,7 @@ export var getTemplateFields = function (_a) {
197
165
  export var getReviewDataSet = function (_a) {
198
166
  var _b;
199
167
  var records = _a.records, fields = _a.fields;
200
- var baseInitialDataSet = recordListToDataSet(addEmptyRows(records, fields), fields);
168
+ var _c = recordListToDataSet(addEmptyRows(records, fields), fields), isDatasetTransformed = _c.isDatasetTransformed, baseInitialDataSet = _c.dataSet;
201
169
  var highestRowIndex = 0;
202
170
  Object.keys(baseInitialDataSet).forEach(function (key) {
203
171
  var record = baseInitialDataSet[key];
@@ -207,5 +175,5 @@ export var getReviewDataSet = function (_a) {
207
175
  });
208
176
  var emptyRowAtBottom = addMeta({}, highestRowIndex + 1);
209
177
  var initialDataSet = __assign(__assign({}, baseInitialDataSet), (_b = {}, _b[emptyRowAtBottom._meta.id] = emptyRowAtBottom, _b));
210
- return { initialDataSet: initialDataSet };
178
+ return { isDatasetTransformed: isDatasetTransformed, initialDataSet: initialDataSet };
211
179
  };
@@ -1,5 +1,5 @@
1
1
  import { AppResponse, RecordDataSet } from "../../types";
2
- export declare const useSubmitToServer: () => {
2
+ export declare const useSubmitToServer: (setIsTransformTooltipOpened: any) => {
3
3
  appResponse: AppResponse;
4
4
  isSubmitting: boolean;
5
5
  onSubmitToServer: (dataSet: RecordDataSet, afterSubmitCallback: (dataSet: RecordDataSet) => void) => Promise<void>;
@@ -118,7 +118,7 @@ var filterAndMapWithBackendErrors = function (dataSet, errors) {
118
118
  return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { isInvalid: true, backendErrors: errors[rId] }) });
119
119
  }, []);
120
120
  };
121
- export var useSubmitToServer = function () {
121
+ export var useSubmitToServer = function (setIsTransformTooltipOpened) {
122
122
  var _a = useImporterContext(), templateHeaderMatchings = _a.templateHeaderMatchings, templateHeaders = _a.templateHeaders, integrations = _a.integrations, templateSlug = _a.templateSlug, fuseApi = _a.fuseApi, previewMode = _a.importerOptions.previewMode, onSubmit = _a.onSubmit;
123
123
  var _b = useState(false), isSubmitting = _b[0], setIsSubmitting = _b[1];
124
124
  var _c = useState(false), importWasSuccessful = _c[0], setImportWasSuccessful = _c[1];
@@ -157,7 +157,8 @@ export var useSubmitToServer = function () {
157
157
  });
158
158
  invalidRecords_1 = __spreadArray(__spreadArray([], invalidRecords_1, true), (recordsToDisplayFiltered || []), true);
159
159
  }
160
- invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields_1);
160
+ invalidDataSet = recordListToDataSet(invalidRecords_1, reviewFields_1, false).dataSet;
161
+ setIsTransformTooltipOpened(false);
161
162
  afterSubmitCallback(invalidDataSet);
162
163
  if (!!previewMode) return [3 /*break*/, 5];
163
164
  return [4 /*yield*/, trackImportedRowsCount(fuseApi, templateSlug, validDataSetLength)];
@@ -1,21 +1,22 @@
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 { useSpreadsheetContext } from "../../../../Importer";
4
+ import { addToast } from "../../../../common/Toast";
5
+ import { useReviewContext, useSpreadsheetContext } from "../../../../Importer";
5
6
  import { useFilteredDataContext } from "../../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
6
7
  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 () {
11
11
  var _a, _b;
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
- var _e = useSpreadsheetContext(), fields = _e.fields, isTransformTooltipOpened = _e.isTransformTooltipOpened;
14
+ var fields = useSpreadsheetContext().fields;
15
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
15
16
  var columnsWithErrorCounts = useValidationContext().columnsWithErrorCounts;
16
17
  var t = useTranslation("review").t;
17
- var _f = useState([]), errorArray = _f[0], setErrorArray = _f[1];
18
- var _g = useState(false), isMenuOpened = _g[0], setIsMenuOpened = _g[1];
18
+ var _e = useState([]), errorArray = _e[0], setErrorArray = _e[1];
19
+ var _f = useState(false), isMenuOpened = _f[0], setIsMenuOpened = _f[1];
19
20
  useEffect(function () {
20
21
  var listener = function () {
21
22
  var getErrorArray = function () {
@@ -17,7 +17,7 @@ import { Fragment as _Fragment, jsxs as _jsxs, jsx as _jsx } from "react/jsx-run
17
17
  import { useEffect, useState } from "react";
18
18
  import { useTranslation } from "react-i18next";
19
19
  import styled, { css } from "styled-components";
20
- import { useSpreadsheetContext } from "../../../Importer";
20
+ import { useReviewContext } from "../../../Importer";
21
21
  import { useDataSetContext } from "../../../Importer/common/Spreadsheet/DataSetContextProvider";
22
22
  import { useDuplicateDataContext } from "../../../Importer/common/Spreadsheet/DuplicateDataContextProvider";
23
23
  import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
@@ -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 = useSpreadsheetContext().isTransformTooltipOpened;
48
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
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;
@@ -13,18 +13,19 @@ 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";
16
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
17
+ import { useRef, useState } from "react";
17
18
  import styled, { css } from "styled-components";
18
- import { useSpreadsheetContext } from "../../../Importer";
19
- import { SearchIcon } from "./icons";
20
19
  import { useDebounce } from "../../../hooks";
21
- import { useRef, useState } from "react";
20
+ import { useReviewContext } from "../../../Importer";
22
21
  import { colors } from "../../../styled/theme/colorPalette";
23
22
  import { textStyles } from "../../../styled/theme/textStyles";
23
+ import { SearchIcon, ReplaceIcon } from "./icons";
24
24
  import { TooltipProvider } from "../../../common/TooltipProvider";
25
25
  import { useTranslation } from "react-i18next";
26
26
  import { Div } from "../../../styled";
27
27
  import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
28
+ import { FindAndReplaceModal } from "../../../Importer/common/Spreadsheet/components/FindAndReplace";
28
29
  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
30
  var isOpen = _a.isOpen;
30
31
  return (isOpen ? colors.orange50 : "none");
@@ -33,22 +34,27 @@ var Wrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplate
33
34
  return (isOpen ? "332px" : "24px");
34
35
  });
35
36
  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) {
37
+ 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);
38
+ 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"])));
39
+ 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
40
  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 "])));
41
+ return !isOpen && css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n position: absolute;\n top: -9999px;\n "], ["\n position: absolute;\n top: -9999px;\n "])));
39
42
  });
40
43
  var SearchInput = function (_a) {
41
44
  var testId = _a.testId, value = _a.value, onChange = _a.onChange, isDisabled = _a.isDisabled;
42
45
  var _b = useDebounce(value, onChange, 300), _value = _b._value, set_Value = _b.set_Value;
43
46
  var inputRef = useRef(null);
44
- var _c = useState(false), isOpen = _c[0], setIsOpen = _c[1];
47
+ var filteredDataIds = useFilteredDataContext().filteredDataIds;
48
+ var _c = useState(false), findAndReplaceModalOpen = _c[0], setFindAndReplaceModalOpen = _c[1];
49
+ var _d = useState(false), isOpen = _d[0], setIsOpen = _d[1];
50
+ var actionsRef = useRef();
45
51
  var t = useTranslation("review").t;
46
52
  var handleInputChange = function (_a) {
47
53
  var target = _a.target;
48
54
  set_Value(target.value);
49
55
  };
50
- var handleInputOnBlur = function () {
51
- if (!_value) {
56
+ var handleInputOnBlur = function (e) {
57
+ if (!_value && e.relatedTarget !== actionsRef.current) {
52
58
  setIsOpen(false);
53
59
  }
54
60
  };
@@ -61,15 +67,17 @@ var SearchInput = function (_a) {
61
67
  }
62
68
  }
63
69
  };
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") })] })) })));
70
+ return (_jsxs(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") }), _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", {
71
+ length: value ? filteredDataIds.length : 0,
72
+ }) }), _jsx(IconWrapper, { children: _jsx(ReplaceIcon, {}) })] }))] })), findAndReplaceModalOpen && (_jsx(FindAndReplaceModal, { initialText: value, onClose: function () { return setFindAndReplaceModalOpen(false); } }))] })));
65
73
  };
66
74
  export var SearchRows = function (_a) {
67
75
  var _b = _a.testId, testId = _b === void 0 ? "ta-search-rows" : _b;
68
76
  var _c = useFilteredDataContext(), filteredInputValue = _c.filteredInputValue, setFilteredInputValue = _c.setFilteredInputValue;
69
- var isTransformTooltipOpened = useSpreadsheetContext().isTransformTooltipOpened;
77
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
70
78
  var handleChangeInputValue = function (value) {
71
79
  setFilteredInputValue(value);
72
80
  };
73
- return (_jsx(SearchInput, { testId: testId, value: filteredInputValue, onChange: handleChangeInputValue, isDisabled: isTransformTooltipOpened }));
81
+ return (_jsx(_Fragment, { children: _jsx(SearchInput, { testId: testId, value: filteredInputValue, onChange: handleChangeInputValue, isDisabled: isTransformTooltipOpened }) }));
74
82
  };
75
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
83
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;