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.
- package/lib/esm/Importer/ImporterWithContext.js +1 -1
- package/lib/esm/Importer/Review/AppResponseModal.js +2 -2
- package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +2 -0
- package/lib/esm/Importer/Review/ReviewContextProvider.js +18 -13
- package/lib/esm/Importer/Stepper/index.js +26 -13
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterSectionHeader/index.js +2 -2
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +0 -2
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +3 -4
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +1 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +29 -0
- package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +17 -8
- package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.d.ts +6 -0
- package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.js +44 -0
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +6 -4
- package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.js +2 -2
- package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +2 -2
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +1 -2
- package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +5 -9
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js +231 -0
- package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.d.ts → transformators/index.d.ts} +6 -6
- package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.js → transformators/index.js} +24 -45
- package/lib/esm/Importer/common/theme.d.ts +1 -0
- package/lib/esm/Importer/data/index.d.ts +5 -2
- package/lib/esm/Importer/data/index.js +14 -46
- package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +1 -1
- package/lib/esm/Importer/hooks/useSubmitToServer.js +3 -2
- package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +6 -5
- package/lib/esm/common/Table/TableActions/RowFilters.js +3 -3
- package/lib/esm/common/Table/TableActions/SearchRows.js +21 -13
- package/lib/esm/common/Table/TableActions/TableActions.js +9 -4
- package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
- package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +5 -1
- package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +19 -39
- package/lib/esm/common/Table/TableActions/icons.d.ts +1 -0
- package/lib/esm/common/Table/TableActions/icons.js +1 -0
- package/lib/esm/common/Table/TableActions/useFindAndReplace.d.ts +5 -0
- package/lib/esm/common/Table/TableActions/useFindAndReplace.js +45 -0
- package/lib/esm/common/Toast.d.ts +34 -3
- package/lib/esm/common/Toast.js +31 -15
- package/lib/esm/common/buttons.js +6 -6
- package/lib/esm/common/datePatterns.d.ts +0 -1
- package/lib/esm/common/datePatterns.js +0 -10
- package/lib/esm/common/icons/index.d.ts +3 -0
- package/lib/esm/common/icons/index.js +5 -2
- package/lib/esm/common/inputs/Checkbox.d.ts +2 -1
- package/lib/esm/common/inputs/Checkbox.js +9 -7
- package/lib/esm/locales/en.d.ts +13 -0
- package/lib/esm/locales/en.js +13 -0
- package/lib/esm/styled/theme/colorPalette.d.ts +2 -0
- package/lib/esm/styled/theme/colorPalette.js +1 -0
- package/lib/esm/styled/theme/index.d.ts +1 -0
- package/lib/esm/styled/theme/textCss.js +1 -1
- package/lib/main.js +6 -6
- package/package.json +1 -1
package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js
ADDED
|
@@ -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 "
|
|
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
|
|
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
|
|
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 {
|
|
13
|
-
var isTransformationNeeded = function (fieldValue, transformedValue) { return ({
|
|
14
|
-
transformationWasNeeded:
|
|
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
|
|
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
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
var
|
|
108
|
-
var
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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 = {
|
|
@@ -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
|
|
11
|
-
|
|
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 =
|
|
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:
|
|
45
|
+
return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { id: rId, rowIndex: index, uploadedRow: uploadedRow, transformedRow: transformedRow }) });
|
|
50
46
|
};
|
|
51
|
-
export var
|
|
52
|
-
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
18
|
-
var
|
|
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 {
|
|
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 (
|
|
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 =
|
|
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 {
|
|
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
|
|
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(
|
|
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
|
|
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 (
|
|
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 =
|
|
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;
|