fuse-importer 0.1.5-testing → 0.1.7-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 (30) hide show
  1. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +2 -0
  2. package/lib/esm/Importer/Review/ReviewContextProvider.js +18 -13
  3. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterSectionHeader/index.js +2 -2
  4. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +0 -2
  5. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +3 -4
  6. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +7 -5
  7. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpeadsheetAutocomplete.js +2 -2
  8. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +2 -2
  9. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +1 -1
  10. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +2 -1
  11. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +10 -6
  12. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -2
  13. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +4 -16
  14. package/lib/esm/Importer/data/index.d.ts +6 -1
  15. package/lib/esm/Importer/data/index.js +51 -9
  16. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +1 -1
  17. package/lib/esm/Importer/hooks/useSubmitToServer.js +3 -2
  18. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +9 -6
  19. package/lib/esm/common/Table/TableActions/RowFilters.js +2 -2
  20. package/lib/esm/common/Table/TableActions/SearchRows.js +8 -8
  21. package/lib/esm/common/Table/TableActions/TableActions.js +9 -4
  22. package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
  23. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.d.ts +6 -1
  24. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +27 -46
  25. package/lib/esm/common/buttons.js +6 -6
  26. package/lib/esm/common/datePatterns.d.ts +1 -0
  27. package/lib/esm/common/datePatterns.js +10 -0
  28. package/lib/esm/styled/theme/textCss.js +1 -1
  29. package/lib/main.js +2 -2
  30. package/package.json +1 -1
@@ -19,6 +19,8 @@ type State = {
19
19
  onSubmit: (dataSet: RecordDataSet) => Promise<void>;
20
20
  setReviewInitialDataSetDeprecated: (dataSet: any) => void;
21
21
  setInitialDataSetUpdatedAt: React.Dispatch<any>;
22
+ isTransformTooltipOpened: boolean;
23
+ setIsTransformTooltipOpened: React.Dispatch<React.SetStateAction<boolean>>;
22
24
  };
23
25
  export type ExportDataType = "csv" | "excel";
24
26
  type Props = {
@@ -57,14 +57,15 @@ var ReviewContext = createContext({});
57
57
  export var ReviewContextProvider = function (_a) {
58
58
  var initialRecords = _a.initialRecords, children = _a.children;
59
59
  var _b = useImporterContext(), templateHeaderMatchings = _b.templateHeaderMatchings, enumFieldValueMatchings = _b.enumFieldValueMatchings, templateHeaders = _b.templateHeaders, uploadedDataHeaders = _b.uploadedDataHeaders, headerRowIndex = _b.headerRowIndex, uploadedData = _b.uploadedData, currentStepIndex = _b.currentStepIndex, setSelectedRows = _b.setSelectedRows, _c = _b.importerOptions, disableSubmitIfInvalid = _c.disableSubmitIfInvalid, batchValidationDelayMs = _c.batchValidationDelayMs, batchValidationSize = _c.batchValidationSize, loadingComponent = _c.loadingComponent, onValidateRecord = _b.onValidateRecord, formatRecord = _b.formatRecord;
60
- var _d = useSubmitToServer(), appResponse = _d.appResponse, isSubmitting = _d.isSubmitting, importWasSuccessful = _d.importWasSuccessful, onSubmitToServer = _d.onSubmitToServer;
60
+ var _d = useState(false), isTransformTooltipOpened = _d[0], setIsTransformTooltipOpened = _d[1];
61
+ var _e = useSubmitToServer(setIsTransformTooltipOpened), appResponse = _e.appResponse, isSubmitting = _e.isSubmitting, importWasSuccessful = _e.importWasSuccessful, onSubmitToServer = _e.onSubmitToServer;
61
62
  var setIsLoadingApp = useAppLoadingContext().setIsLoadingApp;
62
- var _e = useState([]), previewFields = _e[0], setPreviewFields = _e[1];
63
- var _f = useState(null), previewInitialDataSet = _f[0], setPreviewInitialDataSet = _f[1];
64
- var _g = useState([]), reviewFields = _g[0], setReviewFields = _g[1];
63
+ var _f = useState([]), previewFields = _f[0], setPreviewFields = _f[1];
64
+ var _g = useState(null), previewInitialDataSet = _g[0], setPreviewInitialDataSet = _g[1];
65
+ var _h = useState([]), reviewFields = _h[0], setReviewFields = _h[1];
65
66
  var reviewInitialDataSet = useRef(null);
66
- var _h = useState(null), initialDataSetUpdatedAt = _h[0], setInitialDataSetUpdatedAt = _h[1];
67
- var _j = useState(false), _ = _j[0], setInefficientRerender = _j[1];
67
+ var _j = useState(null), initialDataSetUpdatedAt = _j[0], setInitialDataSetUpdatedAt = _j[1];
68
+ var _k = useState(false), _ = _k[0], setInefficientRerender = _k[1];
68
69
  var setReviewInitialDataSetDeprecated = function (dataSet) {
69
70
  reviewInitialDataSet.current = dataSet;
70
71
  setInefficientRerender(function (prev) { return !prev; });
@@ -103,17 +104,17 @@ export var ReviewContextProvider = function (_a) {
103
104
  else if (currentStepIndex === 2) {
104
105
  setIsLoadingApp(true);
105
106
  (function () { return __awaiter(void 0, void 0, void 0, function () {
106
- var generateRecords, fields, records, initialDataSet;
107
- return __generator(this, function (_a) {
108
- switch (_a.label) {
107
+ var generateRecords, fields, records, _a, isDatasetTransformed, initialDataSet;
108
+ return __generator(this, function (_b) {
109
+ switch (_b.label) {
109
110
  case 0:
110
111
  if (!(uploadedData && uploadedData.length > 10000)) return [3 /*break*/, 2];
111
112
  // wait for the first render to complete before blocking main thread with review step logic
112
113
  return [4 /*yield*/, sleep(200)];
113
114
  case 1:
114
115
  // wait for the first render to complete before blocking main thread with review step logic
115
- _a.sent();
116
- _a.label = 2;
116
+ _b.sent();
117
+ _b.label = 2;
117
118
  case 2:
118
119
  generateRecords = function () {
119
120
  return transformToRecords({
@@ -127,10 +128,12 @@ export var ReviewContextProvider = function (_a) {
127
128
  };
128
129
  fields = getTemplateFields({ templateHeaders: templateHeaders });
129
130
  records = initialRecords !== null && initialRecords !== void 0 ? initialRecords : generateRecords();
130
- initialDataSet = getReviewDataSet({
131
+ _a = getReviewDataSet({
131
132
  records: records,
132
133
  fields: fields,
133
- }).initialDataSet;
134
+ }), isDatasetTransformed = _a.isDatasetTransformed, initialDataSet = _a.initialDataSet;
135
+ if (isDatasetTransformed)
136
+ setIsTransformTooltipOpened(true);
134
137
  setSelectedRows([]);
135
138
  setReviewFields(fields);
136
139
  setReviewInitialDataSetDeprecated(initialDataSet);
@@ -178,6 +181,8 @@ export var ReviewContextProvider = function (_a) {
178
181
  onDataSetChanged: onDataSetChanged,
179
182
  setReviewInitialDataSetDeprecated: setReviewInitialDataSetDeprecated,
180
183
  setInitialDataSetUpdatedAt: setInitialDataSetUpdatedAt,
184
+ isTransformTooltipOpened: isTransformTooltipOpened,
185
+ setIsTransformTooltipOpened: setIsTransformTooltipOpened,
181
186
  };
182
187
  function renderLoading() {
183
188
  return isSubmitting ? (loadingComponent ? (loadingComponent()) : (_jsx(AppLoading, {}))) : null;
@@ -28,7 +28,7 @@ var HeadersList = function (_a) {
28
28
  var title = _a.title, headers = _a.headers, props = __rest(_a, ["title", "headers"]);
29
29
  return (_jsxs(_Fragment, { children: [_jsx(Div, __assign({ label3: true }, props, { children: title })), headers.map(function (header, index) {
30
30
  var isLast = index === headers.length - 1;
31
- return (_jsx(S.HeaderListItem, __assign({ body1: true, isLast: isLast, mt: 16 }, { children: header }), index));
31
+ return (_jsx(S.HeaderListItem, __assign({ body1: true, "data-cy": header, isLast: isLast, mt: 16 }, { children: header }), index));
32
32
  })] }));
33
33
  };
34
34
  export var HeaderCard = function (_a) {
@@ -40,5 +40,5 @@ export var HeaderCard = function (_a) {
40
40
  .filter(function (h) { return !h.required; })
41
41
  .map(function (h) { return h.label; });
42
42
  var t = useTranslation("upload").t;
43
- return (_jsx(S.HeaderCardWrapper, { children: _jsxs(S.HeaderCardContainer, __assign({}, props, { children: [_jsx(Div, __assign({ body3: true, mb: 24 }, { children: t("header.title") })), requiredHeaders.length > 0 && (_jsx(HeadersList, { title: t("header.required_headers"), headers: requiredHeaders })), optionalHeaders.length > 0 && (_jsx(HeadersList, { title: t("header.optional_headers"), headers: optionalHeaders, mt: 30 }))] })) }));
43
+ return (_jsx(S.HeaderCardWrapper, { children: _jsxs(S.HeaderCardContainer, __assign({}, props, { children: [_jsx(Div, __assign({ "data-cy": "header_title", body3: true, mb: 24 }, { children: t("header.title") })), requiredHeaders.length > 0 && (_jsx(HeadersList, { "data-cy": "required_header", title: t("header.required_headers"), headers: requiredHeaders })), optionalHeaders.length > 0 && (_jsx(HeadersList, { "data-cy": "optional_header", title: t("header.optional_headers"), headers: optionalHeaders, mt: 30 }))] })) }));
44
44
  };
@@ -12,8 +12,6 @@ type State = {
12
12
  setSelectedRows: React.Dispatch<React.SetStateAction<string[]>>;
13
13
  lastClickedIndexRef: React.MutableRefObject<number | null>;
14
14
  checkboxColumnWidth: number;
15
- setIsTransformTooltipOpened: React.Dispatch<React.SetStateAction<boolean>>;
16
- isTransformTooltipOpened: boolean;
17
15
  inefficientRerender: boolean;
18
16
  setInefficientRerender: React.Dispatch<React.SetStateAction<boolean>>;
19
17
  };
@@ -27,10 +27,9 @@ import { useValidationContext } from "../ValidationContextProvider";
27
27
  var SpreadsheetContext = createContext({});
28
28
  export var SpreadsheetContextProvider = function (_a) {
29
29
  var fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, children = _a.children, onValidateRecord = _a.onValidateRecord, selectedRows = _a.selectedRows, setSelectedRows = _a.setSelectedRows;
30
- var _b = useState(false), isTransformTooltipOpened = _b[0], setIsTransformTooltipOpened = _b[1];
31
- var _c = useState(false), inefficientRerender = _c[0], setInefficientRerender = _c[1];
30
+ var _b = useState(false), inefficientRerender = _b[0], setInefficientRerender = _b[1];
32
31
  var filteredDataIds = useFilteredDataContext().filteredDataIds;
33
- var _d = useValidationContext(), calculateColumnErrorCounts = _d.calculateColumnErrorCounts, calculateColumnWarningCounts = _d.calculateColumnWarningCounts, warnings = _d.warnings, errors = _d.errors, validationState = __rest(_d, ["calculateColumnErrorCounts", "calculateColumnWarningCounts", "warnings", "errors"]);
32
+ var _c = useValidationContext(), calculateColumnErrorCounts = _c.calculateColumnErrorCounts, calculateColumnWarningCounts = _c.calculateColumnWarningCounts, warnings = _c.warnings, errors = _c.errors, validationState = __rest(_c, ["calculateColumnErrorCounts", "calculateColumnWarningCounts", "warnings", "errors"]);
34
33
  var lastClickedIndexRef = useRef(null);
35
34
  var checkboxColumnWidth = useMemo(function () {
36
35
  var lastRowIndexLength = filteredDataIds.length.toString().length;
@@ -39,7 +38,7 @@ export var SpreadsheetContextProvider = function (_a) {
39
38
  var baseCheckboxColumnWidth = lastRowIndexLength * singleLetterWidth + horizontalSpacing;
40
39
  return baseCheckboxColumnWidth < 40 ? 40 : baseCheckboxColumnWidth;
41
40
  }, [filteredDataIds.length]);
42
- var value = __assign(__assign({ filteredDataIds: filteredDataIds, fields: fields }, validationState), { isReadOnly: isReadOnly, options: options, onValidateRecord: onValidateRecord, selectedRows: selectedRows, setSelectedRows: setSelectedRows, lastClickedIndexRef: lastClickedIndexRef, checkboxColumnWidth: checkboxColumnWidth, setIsTransformTooltipOpened: setIsTransformTooltipOpened, isTransformTooltipOpened: isTransformTooltipOpened, inefficientRerender: inefficientRerender, setInefficientRerender: setInefficientRerender });
41
+ var value = __assign(__assign({ filteredDataIds: filteredDataIds, fields: fields }, validationState), { isReadOnly: isReadOnly, options: options, onValidateRecord: onValidateRecord, selectedRows: selectedRows, setSelectedRows: setSelectedRows, lastClickedIndexRef: lastClickedIndexRef, checkboxColumnWidth: checkboxColumnWidth, inefficientRerender: inefficientRerender, setInefficientRerender: setInefficientRerender });
43
42
  return (_jsx(SpreadsheetContext.Provider, __assign({ value: value }, { children: children })));
44
43
  };
45
44
  export var useSpreadsheetContext = function () { return useContext(SpreadsheetContext); };
@@ -35,17 +35,18 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
35
35
  };
36
36
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
37
37
  import { useMemo } from "react";
38
+ import ReactVirtualizedAutoSizer from "react-virtualized-auto-sizer";
38
39
  import { FixedSizeGrid as Grid } from "react-window";
39
40
  import styled, { css } from "styled-components";
41
+ import { Checkbox } from "../../../../common/inputs/Checkbox";
40
42
  import { Div } from "../../../../styled/utils";
43
+ import { useImporterContext } from "../../../contexts/ImporterContextProvider";
44
+ import { useReviewContext } from "../../../Review/ReviewContextProvider";
41
45
  import { spreadsheetRowHeightPx } from "../common";
42
46
  import { spreadsheetHeaderHeightPx } from "../common/index";
47
+ import { useDataSetContext } from "../DataSetContextProvider";
43
48
  import { useSpreadsheetContext } from "../SpreadsheetContextProvider";
44
- import { Checkbox } from "../../../../common/inputs/Checkbox";
45
- import { useImporterContext } from "../../../contexts/ImporterContextProvider";
46
- import ReactVirtualizedAutoSizer from "react-virtualized-auto-sizer";
47
49
  import { rowIsEmpty } from "../SpreadsheetContextProvider/utils";
48
- import { useDataSetContext } from "../DataSetContextProvider";
49
50
  var StyledGrid = styled(Grid)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n overflow-y: scroll;\n"], ["\n background: ", ";\n overflow-y: scroll;\n"])), function (_a) {
50
51
  var theme = _a.theme;
51
52
  return theme.colors.white50;
@@ -58,7 +59,8 @@ var gridStyles = {
58
59
  };
59
60
  export var SpreadsheetRowCheckboxes = function (_a) {
60
61
  var height = _a.height, gridRef = _a.gridRef, isLoadingData = _a.isLoadingData, props = __rest(_a, ["height", "gridRef", "isLoadingData"]);
61
- var _b = useSpreadsheetContext(), selectedRows = _b.selectedRows, options = _b.options, filteredDataIds = _b.filteredDataIds, lastClickedIndexRef = _b.lastClickedIndexRef, setSelectedRows = _b.setSelectedRows, checkboxColumnWidth = _b.checkboxColumnWidth, isTransformTooltipOpened = _b.isTransformTooltipOpened;
62
+ var _b = useSpreadsheetContext(), selectedRows = _b.selectedRows, options = _b.options, filteredDataIds = _b.filteredDataIds, lastClickedIndexRef = _b.lastClickedIndexRef, setSelectedRows = _b.setSelectedRows, checkboxColumnWidth = _b.checkboxColumnWidth;
63
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
62
64
  var getRecord = useDataSetContext().getRecord;
63
65
  var currentStepIndex = useImporterContext().currentStepIndex;
64
66
  var nonEmptyRows = useMemo(function () { return filteredDataIds.filter(function (rowId) { return !rowIsEmpty(getRecord(rowId)); }); }, [filteredDataIds]);
@@ -19,8 +19,8 @@ import { SpreadsheetField, useSpreadsheetField } from ".";
19
19
  import { Autocomplete as AutocompleteBase, } from "../../../../../common/inputs/Autocomplete";
20
20
  import { SelectMenuDiv, SelectMenuScrollArea, } from "../../../../../common/inputs/SelectMenu";
21
21
  import { HTMLInput, TextInputIcon, } from "../../../../../common/inputs/TextInput";
22
+ import { useReviewContext } from "../../../../Review/ReviewContextProvider";
22
23
  import { spreadsheetRowHeightPx } from "../../common";
23
- import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
24
24
  var Autocomplete = styled(AutocompleteBase)(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n ", " {\n border: none;\n border-radius: 0;\n margin: 0;\n background: transparent;\n height: ", "px;\n padding: 0 12px;\n\n ", "\n\n ::placeholder {\n ", "\n\n ", "\n\n ::placeholder {\n ", "\n }\n }\n\n :focus {\n border: none;\n box-shadow: none;\n }\n\n :hover {\n background: transparent;\n }\n }\n ", " {\n right: 6px;\n }\n ", " {\n border-radius: 7px;\n }\n ", " {\n padding: 4px;\n }\n"], ["\n ", " {\n border: none;\n border-radius: 0;\n margin: 0;\n background: transparent;\n height: ", "px;\n padding: 0 12px;\n\n ", "\n\n ::placeholder {\n ", "\n\n ", "\n\n ::placeholder {\n ", "\n }\n }\n\n :focus {\n border: none;\n box-shadow: none;\n }\n\n :hover {\n background: transparent;\n }\n }\n ", " {\n right: 6px;\n }\n ", " {\n border-radius: 7px;\n }\n ", " {\n padding: 4px;\n }\n"])), HTMLInput, spreadsheetRowHeightPx - 5, function (p) {
25
25
  return p.hasWarning && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n color: ", ";\n "], ["\n color: ", ";\n "])), function (p) { return p.theme.colors.orange1200; });
26
26
  }, function (p) {
@@ -34,7 +34,7 @@ export var SpreadsheetAutocomplete = function (props) {
34
34
  var _a, _b, _c;
35
35
  var name = props.name, record = props.record, options = props.options, fieldType = props.fieldType, _d = props.isInputDisabled, isInputDisabled = _d === void 0 ? false : _d, id = props.id;
36
36
  var _e = useSpreadsheetField(name, record, fieldType), value = _e.value, setValue = _e.setValue, validationError = _e.validationError, validationWarning = _e.validationWarning;
37
- var isTransformTooltipOpened = useSpreadsheetContext().isTransformTooltipOpened;
37
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
38
38
  var isHighlighted = isTransformTooltipOpened &&
39
39
  ((_c = (_b = (_a = record._meta) === null || _a === void 0 ? void 0 : _a.transformedRow) === null || _b === void 0 ? void 0 : _b[name]) === null || _c === void 0 ? void 0 : _c.transformed);
40
40
  return (_jsx(SpreadsheetField, __assign({ validationError: validationError, validationWarning: validationWarning, isHighlighted: isHighlighted }, { children: _jsx(Autocomplete, { placement: "bottom", isInputDisabled: isInputDisabled, hasError: !!validationError, hasWarning: !!validationWarning, options: options, value: value, icon: chevronDownIcon, onChange: function (v) { return !isTransformTooltipOpened && setValue(v); }, disabledWhen: isTransformTooltipOpened, id: id }) })));
@@ -29,7 +29,7 @@ import { useMemo } from "react";
29
29
  import styled, { css } from "styled-components";
30
30
  import { SpreadsheetField, useSpreadsheetField } from ".";
31
31
  import { Div } from "../../../../../styled/utils";
32
- import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
32
+ import { useReviewContext } from "../../../../Review/ReviewContextProvider";
33
33
  import { AVERAGE_CHAR_SIZE, getFieldContentWidth } from "./utils";
34
34
  var parseValue = function (value) {
35
35
  var isFalsyButNotZero = !value && value !== 0;
@@ -39,7 +39,7 @@ export var SpreadsheetInput = function (_a) {
39
39
  var _b, _c, _d, _e, _f, _g;
40
40
  var name = _a.name, record = _a.record, fieldType = _a.fieldType, columnWidth = _a.columnWidth, props = __rest(_a, ["name", "record", "fieldType", "columnWidth"]);
41
41
  var _h = useSpreadsheetField(name, record, fieldType), value = _h.value, setValue = _h.setValue, validationError = _h.validationError, validationWarning = _h.validationWarning;
42
- var isTransformTooltipOpened = useSpreadsheetContext().isTransformTooltipOpened;
42
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
43
43
  var defaultWidthAsNumber = Number.parseInt(columnWidth.replace("px", ""));
44
44
  var _fieldContentWidth = getFieldContentWidth({
45
45
  record: record,
@@ -130,7 +130,7 @@ var ContentContainer = styled(Div)(templateObject_8 || (templateObject_8 = __mak
130
130
  var expandedFieldWidth = _a.expandedFieldWidth, shouldExpandInput = _a.shouldExpandInput;
131
131
  return shouldExpandInput && css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n width: ", ";\n z-index: 1;\n\n .suffix {\n right: 12px;\n }\n "], ["\n width: ", ";\n z-index: 1;\n\n .suffix {\n right: 12px;\n }\n "])), expandedFieldWidth || "auto");
132
132
  }, function (p) { return p.theme.css.alignCenter; }, function (p) {
133
- return p.isHighlighted && css(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 2px ", " inset;\n "], ["\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 2px ", " inset;\n "])), function (p) { return p.theme.colors.blue100; }, function (p) { return p.theme.colors.blue500; });
133
+ return p.isHighlighted && css(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 2px ", " inset;\n z-index: 100;\n "], ["\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 2px ", " inset;\n z-index: 100;\n "])), function (p) { return p.theme.colors.blue100; }, function (p) { return p.theme.colors.blue500; });
134
134
  }, function (p) {
135
135
  return p.hasWarning && css(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n color: ", ";\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 1px ", " inset;\n "], ["\n color: ", ";\n background: ", ";\n /* internal border */\n box-shadow: 0px 0px 0px 1px ", " inset;\n "])), function (p) { return p.theme.colors.orange1200; }, function (p) { return p.theme.colors.orange1100; }, function (p) { return p.theme.colors.orange500; });
136
136
  }, function (p) {
@@ -2,6 +2,7 @@ import { Field, Record, TransformedRecord } from "../../../../types";
2
2
  type TransformRecordArgs = {
3
3
  record: Record;
4
4
  fields: Field[];
5
+ possibleDateFormats?: string[];
5
6
  };
6
- export declare const transformRecord: ({ record, fields }: TransformRecordArgs) => TransformedRecord;
7
+ export declare const transformRecord: ({ record, fields, possibleDateFormats, }: TransformRecordArgs) => TransformedRecord;
7
8
  export {};
@@ -1,11 +1,15 @@
1
- import { fieldTransformations } from "./transformators";
2
- var runTransformation = function (record, transformation, field) {
1
+ import { datesDateTimesAndTimesTransformations, fieldTransformations, } from "./transformators";
2
+ var runTransformation = function (fieldValue, transformation, field, possibleDateFormats) {
3
3
  var transformationType = transformation.transformation_type;
4
4
  var transformerFunction = fieldTransformations[transformationType];
5
- return transformerFunction(record, transformation, field);
5
+ if (Object.keys(datesDateTimesAndTimesTransformations).includes(transformationType)) {
6
+ var dateTimeTransformFunction = transformerFunction;
7
+ return dateTimeTransformFunction(fieldValue, transformation, field, possibleDateFormats);
8
+ }
9
+ return transformerFunction(fieldValue, transformation, field);
6
10
  };
7
11
  export var transformRecord = function (_a) {
8
- var record = _a.record, fields = _a.fields;
12
+ var record = _a.record, fields = _a.fields, possibleDateFormats = _a.possibleDateFormats;
9
13
  var transformedRecords = {};
10
14
  for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
11
15
  var currentField = fields_1[_i];
@@ -23,7 +27,7 @@ export var transformRecord = function (_a) {
23
27
  var fieldWasTransformed = false;
24
28
  for (var i = 0; i < fieldTransformations_1.length; i++) {
25
29
  var currentTransformation = fieldTransformations_1[i];
26
- var transformed = runTransformation(transformedField.transformed, currentTransformation, currentField);
30
+ var transformed = runTransformation(transformedField.transformed, currentTransformation, currentField, possibleDateFormats);
27
31
  if (transformed.transformationWasNeeded) {
28
32
  fieldWasTransformed = true;
29
33
  transformedField = {
@@ -43,5 +47,5 @@ export var transformRecord = function (_a) {
43
47
  };
44
48
  }
45
49
  var isTransformedRecordsEmpty = Object.keys(transformedRecords).length === 0;
46
- return isTransformedRecordsEmpty ? null : transformedRecords;
50
+ return isTransformedRecordsEmpty ? {} : transformedRecords;
47
51
  };
@@ -4,9 +4,15 @@ export type FieldTransformator = (fieldValue: any, transformation?: FieldTransfo
4
4
  original: any;
5
5
  transformed: any;
6
6
  };
7
+ export type DateTimeTransformator = (fieldValue: any, transformation?: FieldTransformation, fieldOptions?: Field, possibleDateFormats?: string[]) => {
8
+ transformationWasNeeded: boolean;
9
+ original: any;
10
+ transformed: any;
11
+ };
7
12
  export type FieldTransformations = Partial<{
8
- [key: string]: FieldTransformator;
13
+ [key: string]: FieldTransformator | DateTimeTransformator;
9
14
  }>;
15
+ export declare const datesDateTimesAndTimesTransformations: FieldTransformations;
10
16
  export declare const fieldTransformations: {
11
- [x: string]: FieldTransformator;
17
+ [x: string]: FieldTransformator | DateTimeTransformator;
12
18
  };
@@ -9,17 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
- if (ar || !(i in from)) {
15
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
- ar[i] = from[i];
17
- }
18
- }
19
- return to.concat(ar || Array.prototype.slice.call(from));
20
- };
21
12
  import { DateTime } from "luxon";
22
- import { datePatterns, dateTimePatterns, timePatterns, } from "../../../../common/datePatterns";
23
13
  var isTransformationNeeded = function (fieldValue, transformedValue) { return ({
24
14
  transformationWasNeeded: fieldValue !== transformedValue,
25
15
  original: fieldValue,
@@ -89,11 +79,9 @@ var stringFieldTransformations = {
89
79
  return isTransformationNeeded(fieldValue, transformedValue);
90
80
  },
91
81
  };
92
- var parseDate = function (date) {
82
+ var parseDate = function (date, possibleFormats) {
93
83
  if (!date)
94
84
  return null;
95
- var allPatterns = __spreadArray(__spreadArray(__spreadArray([], datePatterns, true), dateTimePatterns, true), timePatterns, true);
96
- var possibleFormats = allPatterns.map(function (date) { return date.value; });
97
85
  for (var i = 0; i < possibleFormats.length; i++) {
98
86
  var format = possibleFormats[i];
99
87
  try {
@@ -108,14 +96,14 @@ var parseDate = function (date) {
108
96
  }
109
97
  return null;
110
98
  };
111
- var datesDateTimesAndTimesTransformations = {
112
- autoformat: function (fieldValue, _, fieldOptions) {
99
+ export var datesDateTimesAndTimesTransformations = {
100
+ autoformat: function (fieldValue, _, fieldOptions, possibleDateFormats) {
113
101
  var cleanFieldValue = fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.replace(/"/g, "");
114
102
  var normalizedFieldValue = cleanFieldValue === null || cleanFieldValue === void 0 ? void 0 : cleanFieldValue.replace(/-/g, "/");
115
103
  var isUnixTimestamp = /^\d+$/.test(normalizedFieldValue);
116
104
  var luxonDate = isUnixTimestamp
117
105
  ? DateTime.fromSeconds(Number(normalizedFieldValue))
118
- : parseDate(normalizedFieldValue);
106
+ : parseDate(normalizedFieldValue, possibleDateFormats);
119
107
  var pattern = fieldOptions === null || fieldOptions === void 0 ? void 0 : fieldOptions.pattern;
120
108
  var defaultObj = {
121
109
  transformationWasNeeded: false,
@@ -7,7 +7,11 @@ 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 recordListToDataSet: (data: Record[], fields: Field[]) => RecordDataSet;
10
+ export declare const calculatePossibleDateFormats: (fieldsWithDateTransformations: Field[], sample: Record[]) => string[];
11
+ export declare const recordListToDataSet: (data: Record[], fields: Field[], withTransformations?: boolean) => {
12
+ isDatasetTransformed: boolean;
13
+ dataSet: RecordDataSet;
14
+ };
11
15
  type transformToRecordsArgs = {
12
16
  templateHeaderMatchings: HeaderMatchings;
13
17
  enumFieldValueMatchings: EnumFieldValueMatchings;
@@ -45,6 +49,7 @@ type GetReviewDataSetArgs = {
45
49
  fields: Field[];
46
50
  };
47
51
  export declare const getReviewDataSet: ({ records, fields }: GetReviewDataSetArgs) => {
52
+ isDatasetTransformed: boolean;
48
53
  initialDataSet: {
49
54
  [x: string]: Record;
50
55
  };
@@ -18,9 +18,13 @@ 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";
21
22
  import { transformRecord } from "../../Importer/common/Spreadsheet/transformation";
22
23
  import { FieldTypes, } from "../../types";
23
24
  import { parseValue } from "../common/Spreadsheet/common";
25
+ import { DateTime } from "luxon";
26
+ import { allowedPatternValues } from "../../common/datePatterns";
27
+ import _ from "lodash";
24
28
  var MINIMUM_ROW_COUNT = 20;
25
29
  var getRowId = function (index) {
26
30
  return index.toString();
@@ -39,29 +43,67 @@ export var addEmptyRows = function (data, fields) {
39
43
  export var addMeta = function (record, index, uploadedRow, transformedRow) {
40
44
  var _a;
41
45
  if (uploadedRow === void 0) { uploadedRow = null; }
42
- if (transformedRow === void 0) { transformedRow = null; }
46
+ if (transformedRow === void 0) { transformedRow = {}; }
43
47
  var rId = getRowId(index);
44
48
  var meta = (_a = record._meta) !== null && _a !== void 0 ? _a : {};
45
- return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { id: rId, rowIndex: index, uploadedRow: uploadedRow, transformedRow: __assign(__assign({}, meta.transformedRow), transformedRow) }) });
49
+ return __assign(__assign({}, record), { _meta: __assign(__assign({}, meta), { id: rId, rowIndex: index, uploadedRow: uploadedRow, transformedRow: transformedRow }) });
46
50
  };
47
- export var recordListToDataSet = function (data, fields) {
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, withTransformations) {
75
+ if (withTransformations === void 0) { withTransformations = true; }
48
76
  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; });
49
77
  var initialData = data;
50
78
  if (data.length < MINIMUM_ROW_COUNT) {
51
79
  initialData = addEmptyRows(data, fields);
52
80
  }
53
- return initialData.reduce(function (dataSet, record, i) {
54
- var transformedRecord = null;
55
- if (fieldWithTransformations.length > 0) {
81
+ var fieldsWithDateTransformations = fieldWithTransformations.filter(function (field) {
82
+ return field.transformations.some(function (t) {
83
+ return Object.keys(datesDateTimesAndTimesTransformations).includes(t.transformation_type);
84
+ });
85
+ });
86
+ var possibleDateFormats = [];
87
+ if (fieldsWithDateTransformations.length > 0) {
88
+ possibleDateFormats.push.apply(possibleDateFormats, calculatePossibleDateFormats(fieldsWithDateTransformations, _.sampleSize(initialData, 100)));
89
+ }
90
+ var isDatasetTransformed = false;
91
+ var res = initialData.reduce(function (dataSet, record, i) {
92
+ var transformedRecord = {};
93
+ if (withTransformations && fieldWithTransformations.length > 0) {
56
94
  transformedRecord = transformRecord({
57
95
  record: record,
58
96
  fields: fieldWithTransformations,
97
+ possibleDateFormats: possibleDateFormats,
59
98
  });
60
99
  }
100
+ if (JSON.stringify(transformedRecord) !== "{}")
101
+ isDatasetTransformed = true;
61
102
  var recordWithMeta = addMeta(record, i, undefined, transformedRecord);
62
103
  dataSet[recordWithMeta._meta.id] = recordWithMeta;
63
104
  return dataSet;
64
105
  }, {});
106
+ return { isDatasetTransformed: isDatasetTransformed, dataSet: res };
65
107
  };
66
108
  var compareFormattedRecord = function (originalRecord, formattedRecord) {
67
109
  var comparisonResult = {};
@@ -140,7 +182,7 @@ export var getPreviewDataSet = function (_a) {
140
182
  });
141
183
  return entry;
142
184
  });
143
- return recordListToDataSet(data, fields);
185
+ return recordListToDataSet(data, fields).dataSet;
144
186
  };
145
187
  return { fields: fields, initialDataSet: getInitialDataSet() };
146
188
  };
@@ -160,7 +202,7 @@ export var getTemplateFields = function (_a) {
160
202
  export var getReviewDataSet = function (_a) {
161
203
  var _b;
162
204
  var records = _a.records, fields = _a.fields;
163
- var baseInitialDataSet = recordListToDataSet(addEmptyRows(records, fields), fields);
205
+ var _c = recordListToDataSet(addEmptyRows(records, fields), fields), isDatasetTransformed = _c.isDatasetTransformed, baseInitialDataSet = _c.dataSet;
164
206
  var highestRowIndex = 0;
165
207
  Object.keys(baseInitialDataSet).forEach(function (key) {
166
208
  var record = baseInitialDataSet[key];
@@ -170,5 +212,5 @@ export var getReviewDataSet = function (_a) {
170
212
  });
171
213
  var emptyRowAtBottom = addMeta({}, highestRowIndex + 1);
172
214
  var initialDataSet = __assign(__assign({}, baseInitialDataSet), (_b = {}, _b[emptyRowAtBottom._meta.id] = emptyRowAtBottom, _b));
173
- return { initialDataSet: initialDataSet };
215
+ return { isDatasetTransformed: isDatasetTransformed, initialDataSet: initialDataSet };
174
216
  };
@@ -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 () {
@@ -23,7 +24,9 @@ export var FilterByErrors = function () {
23
24
  var _loop_1 = function (key, value) {
24
25
  if (value > 0) {
25
26
  var field = fields.find(function (f) { return f.name === key; });
26
- errorArray.push({ label: field.label, value: field.name });
27
+ if (field) {
28
+ errorArray.push({ label: field.label, value: field.name });
29
+ }
27
30
  }
28
31
  };
29
32
  for (var _i = 0, _a = Object.entries(columnsWithErrorCounts.current); _i < _a.length; _i++) {
@@ -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";
@@ -45,7 +45,7 @@ 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;
@@ -14,17 +14,17 @@ var __assign = (this && this.__assign) || function () {
14
14
  return __assign.apply(this, arguments);
15
15
  };
16
16
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ import { useRef, useState } from "react";
18
+ import { useTranslation } from "react-i18next";
17
19
  import styled, { css } from "styled-components";
18
- import { useSpreadsheetContext } from "../../../Importer";
19
- import { SearchIcon } from "./icons";
20
+ import { TooltipProvider } from "../../../common/TooltipProvider";
20
21
  import { useDebounce } from "../../../hooks";
21
- import { useRef, useState } from "react";
22
+ import { useReviewContext } from "../../../Importer";
23
+ import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
24
+ import { Div } from "../../../styled";
22
25
  import { colors } from "../../../styled/theme/colorPalette";
23
26
  import { textStyles } from "../../../styled/theme/textStyles";
24
- import { TooltipProvider } from "../../../common/TooltipProvider";
25
- import { useTranslation } from "react-i18next";
26
- import { Div } from "../../../styled";
27
- import { useFilteredDataContext } from "../../../Importer/common/Spreadsheet/FilteredDataContextProvider";
27
+ import { SearchIcon } from "./icons";
28
28
  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
29
  var isOpen = _a.isOpen;
30
30
  return (isOpen ? colors.orange50 : "none");
@@ -66,7 +66,7 @@ var SearchInput = function (_a) {
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 = useSpreadsheetContext().isTransformTooltipOpened;
69
+ var isTransformTooltipOpened = useReviewContext().isTransformTooltipOpened;
70
70
  var handleChangeInputValue = function (value) {
71
71
  setFilteredInputValue(value);
72
72
  };