fuse-importer 0.1.7-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 (40) 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/Stepper/index.js +26 -13
  4. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +1 -0
  5. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +29 -0
  6. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +17 -8
  7. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.d.ts +6 -0
  8. package/lib/esm/Importer/common/Spreadsheet/components/FindAndReplace/index.js +44 -0
  9. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +1 -1
  10. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +1 -2
  11. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +4 -8
  12. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.d.ts +5 -0
  13. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators/dateTimeAutoformatUtils.js +231 -0
  14. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.d.ts → transformators/index.d.ts} +6 -6
  15. package/lib/esm/Importer/common/Spreadsheet/transformation/{transformators.js → transformators/index.js} +24 -45
  16. package/lib/esm/Importer/common/theme.d.ts +1 -0
  17. package/lib/esm/Importer/data/index.d.ts +0 -1
  18. package/lib/esm/Importer/data/index.js +0 -37
  19. package/lib/esm/common/Table/TableActions/RowFilters.js +1 -1
  20. package/lib/esm/common/Table/TableActions/SearchRows.js +22 -14
  21. package/lib/esm/common/Table/TableActions/TableActions.styles.js +1 -1
  22. package/lib/esm/common/Table/TableActions/icons.d.ts +1 -0
  23. package/lib/esm/common/Table/TableActions/icons.js +1 -0
  24. package/lib/esm/common/Table/TableActions/useFindAndReplace.d.ts +5 -0
  25. package/lib/esm/common/Table/TableActions/useFindAndReplace.js +45 -0
  26. package/lib/esm/common/Toast.d.ts +34 -3
  27. package/lib/esm/common/Toast.js +31 -15
  28. package/lib/esm/common/datePatterns.d.ts +0 -1
  29. package/lib/esm/common/datePatterns.js +0 -10
  30. package/lib/esm/common/icons/index.d.ts +3 -0
  31. package/lib/esm/common/icons/index.js +5 -2
  32. package/lib/esm/common/inputs/Checkbox.d.ts +2 -1
  33. package/lib/esm/common/inputs/Checkbox.js +9 -7
  34. package/lib/esm/locales/en.d.ts +13 -0
  35. package/lib/esm/locales/en.js +13 -0
  36. package/lib/esm/styled/theme/colorPalette.d.ts +2 -0
  37. package/lib/esm/styled/theme/colorPalette.js +1 -0
  38. package/lib/esm/styled/theme/index.d.ts +1 -0
  39. package/lib/main.js +6 -6
  40. package/package.json +1 -1
@@ -93,6 +93,6 @@ export var ImporterWithContext = function () {
93
93
  currentStepIndex: currentStepIndex,
94
94
  templateHeaders: templateHeaders,
95
95
  };
96
- return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsx(AppLoadingContextProvider, { children: _jsxs(EventManagerContextProvider, { children: [_jsx(Toast, {}), _jsx(GlobalStyle, {}), _jsx(ImporterFonts, {}), templateHeaders ? (_jsx(ReviewContextProvider, __assign({ initialRecords: initialRecords }, { children: _jsxs(_Fragment, { children: [isModal && _jsx(Backdrop, {}), _jsx(Layout, __assign({ zIndex: zIndex, ref: layoutRef, isModal: isModal }, { children: shouldShowPreviewFirstTime ? (_jsx(PreviewFirstTime, {})) : (_jsx(ContentRenderer, __assign({}, contentRendererProps))) }))] }) }))) : (_jsx(AppLoading, {}))] }) }) })));
96
+ return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsx(AppLoadingContextProvider, { children: _jsxs(EventManagerContextProvider, { children: [_jsx(Toast, { zIndex: zIndex + 1 }), _jsx(GlobalStyle, {}), _jsx(ImporterFonts, {}), templateHeaders ? (_jsx(ReviewContextProvider, __assign({ initialRecords: initialRecords }, { children: _jsxs(_Fragment, { children: [isModal && _jsx(Backdrop, {}), _jsx(Layout, __assign({ zIndex: zIndex, ref: layoutRef, isModal: isModal }, { children: shouldShowPreviewFirstTime ? (_jsx(PreviewFirstTime, {})) : (_jsx(ContentRenderer, __assign({}, contentRendererProps))) }))] }) }))) : (_jsx(AppLoading, {}))] }) }) })));
97
97
  };
98
98
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  };
12
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
13
  import { useEffect, useState } from "react";
14
- import { Modal, Button } from "../..";
14
+ import { Button, Modal } from "../..";
15
15
  import { Div } from "../../styled/utils";
16
16
  import { useImporterContext } from "../contexts/ImporterContextProvider";
17
17
  import { useReviewContext } from "./ReviewContextProvider";
@@ -31,5 +31,5 @@ export var AppResponseModal = function () {
31
31
  var defaultMessage = importWasSuccessful
32
32
  ? "Data imported successfully"
33
33
  : "Some records could not be imported. Please review the errors and resubmit.";
34
- return (_jsx(Modal, __assign({ isOpen: isAppResponseModalOpen, onClose: onCloseModal }, { children: _jsxs(Div, __assign({ centered: true, flexColumn: true, p: 40 }, { children: [_jsx(Div, __assign({ h6: true, w: 300, textAlignCenter: true, mt: 20 }, { children: (appResponse === null || appResponse === void 0 ? void 0 : appResponse.message) || defaultMessage })), _jsx(Div, __assign({ dflex: true, mt: 40, w100: true, centered: true }, { children: _jsx(Button, __assign({ ml: 10, onClick: onCloseModal }, { children: "OK" })) }))] })) })));
34
+ return (_jsx(Modal, __assign({ isOpen: isAppResponseModalOpen, onClose: onCloseModal }, { children: _jsxs(Div, __assign({ centered: true, flexColumn: true, p: 40 }, { children: [_jsx(Div, __assign({ h6: true, w: 300, textAlignCenter: true, mt: 20 }, { children: (appResponse === null || appResponse === void 0 ? void 0 : appResponse.message) || defaultMessage })), _jsx(Div, __assign({ dflex: true, mt: 40, w100: true, centered: true }, { children: _jsx(Button, __assign({ ml: 10, onClick: onCloseModal, "data-cy": "app-response-btn" }, { children: "OK" })) }))] })) })));
35
35
  };
@@ -28,6 +28,7 @@ import { ConfirmCloseModal } from "./ConfirmCloseModal";
28
28
  import { Step } from "./Step";
29
29
  import { StepperSubmitModal } from "./StepperSubmitModal";
30
30
  import { UnmatchedHeadersModal } from "./UnmatchedHeadersModal";
31
+ import { useDataSetContext } from "../common/Spreadsheet/DataSetContextProvider";
31
32
  var StepperWrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"], ["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"])), function (p) { return p.theme.colors.white; }, function (p) { return p.theme.colors.gray300; });
32
33
  var StepperContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"])));
33
34
  var Steps = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n @media (max-width: 630px) {\n display: none;\n }\n"], ["\n @media (max-width: 630px) {\n display: none;\n }\n"])));
@@ -44,24 +45,36 @@ export var Stepper = function (_a) {
44
45
  var t = useTranslation("general").t;
45
46
  var _c = useState(false), isSubmitModalOpen = _c[0], setIsSubmitModalOpen = _c[1];
46
47
  var _d = useState(false), isConfirmCloseModalOpen = _d[0], setIsConfirmCloseModalOpen = _d[1];
47
- var _e = useState(false), isSubmitDisabled = _e[0], setIsSubmitDisabled = _e[1];
48
- var _f = useReviewContext(), appResponse = _f.appResponse, onSubmit = _f.onSubmit;
49
- var totalErrorCount = useValidationContext().totalErrorCount;
50
- var _g = useEventManagerContext(), on = _g.on, off = _g.off, EVENTS = _g.EVENTS;
48
+ var _e = useDataSetContext(), dataSetLength = _e.dataSetLength, emptyRecordIds = _e.emptyRecordIds;
49
+ var _f = useState(true), isSubmitDisabled = _f[0], setIsSubmitDisabled = _f[1];
50
+ var headerMappingsLoaded = useImporterContext().headerMappingsLoaded;
51
+ var _g = useReviewContext(), appResponse = _g.appResponse, onSubmit = _g.onSubmit;
52
+ var _h = useValidationContext(), totalErrorCount = _h.totalErrorCount, spreadsheetInitialized = _h.spreadsheetInitialized;
53
+ var _j = useEventManagerContext(), on = _j.on, off = _j.off, EVENTS = _j.EVENTS;
54
+ var updateSpreadsheetDisabled = function () {
55
+ var isSpreadsheetEmpty = dataSetLength.current === emptyRecordIds.current.size;
56
+ var isDisabled = totalErrorCount.current > 0 ||
57
+ !spreadsheetInitialized ||
58
+ isSpreadsheetEmpty;
59
+ setIsSubmitDisabled(isDisabled);
60
+ };
51
61
  useEffect(function () {
52
- var listener = function () {
53
- var isDisabled = totalErrorCount.current > 0;
54
- setIsSubmitDisabled(isDisabled);
55
- };
56
- on(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
62
+ on(EVENTS.UPDATE_TOTAL_ERROR_COUNT, updateSpreadsheetDisabled);
57
63
  return function () {
58
- off(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
64
+ off(EVENTS.UPDATE_TOTAL_ERROR_COUNT, updateSpreadsheetDisabled);
59
65
  };
60
- }, [appResponse]);
61
- var _h = useImporterContext(), initialRecords = _h.initialRecords, currentStepIndex = _h.currentStepIndex, templateHeaderMatchings = _h.templateHeaderMatchings, matcherSubstep = _h.matcherSubstep, templateHeaders = _h.templateHeaders, enumFieldValueMatchings = _h.enumFieldValueMatchings, setMatcherSubstep = _h.setMatcherSubstep, setCurrentStepIndex = _h.setCurrentStepIndex, onClose = _h.onClose, isUsingManualImport = _h.isUsingManualImport, resetImporterWhenUsingManualImport = _h.resetImporterWhenUsingManualImport, uploadedData = _h.uploadedData;
66
+ }, [appResponse, spreadsheetInitialized]);
67
+ useEffect(function () {
68
+ updateSpreadsheetDisabled();
69
+ }, [spreadsheetInitialized]);
70
+ var _k = useImporterContext(), initialRecords = _k.initialRecords, currentStepIndex = _k.currentStepIndex, templateHeaderMatchings = _k.templateHeaderMatchings, matcherSubstep = _k.matcherSubstep, templateHeaders = _k.templateHeaders, enumFieldValueMatchings = _k.enumFieldValueMatchings, setMatcherSubstep = _k.setMatcherSubstep, setCurrentStepIndex = _k.setCurrentStepIndex, onClose = _k.onClose, isUsingManualImport = _k.isUsingManualImport, resetImporterWhenUsingManualImport = _k.resetImporterWhenUsingManualImport, uploadedData = _k.uploadedData;
71
+ var _l = useState(true), isContinueDisabled = _l[0], setIsContinueDisabled = _l[1];
62
72
  var templateHeaderLabels = Object.keys(templateHeaderMatchings || []);
63
73
  var unmatchedHeadersCount = templateHeaderLabels.filter(function (templateHeaderLabel) { return !templateHeaderMatchings[templateHeaderLabel]; }).length;
64
74
  var isLastSubMatchStep = matcherSubstep === 1;
75
+ useEffect(function () {
76
+ setIsContinueDisabled(currentStepIndex === 1 && !headerMappingsLoaded);
77
+ }, [currentStepIndex, headerMappingsLoaded]);
65
78
  var setStep = function () {
66
79
  var templateHasEnumFields = !!(templateHeaders === null || templateHeaders === void 0 ? void 0 : templateHeaders.find(function (header) { return header.column_type === ColumnType.enum; }));
67
80
  if (templateHasEnumFields) {
@@ -120,7 +133,7 @@ export var Stepper = function (_a) {
120
133
  return (_jsxs(Div, __assign({ centered: true }, { children: [_jsx(Step, { index: index, label: label, isCompleted: isCompleted, isSelected: index === currentStepIndex }), !isLast && (_jsx(Div, __assign({ ml: 18, mr: 18, dflex: true }, { children: _jsx(ChevronRightIcon, {}) })))] }), index));
121
134
  }) })));
122
135
  var leftButtonUI = (_jsx(Div, __assign({ style: { flex: 1 } }, { children: !initialRecords && (_jsxs(StepperButtonContainer, __assign({ align: "left" }, { children: [logoURL && (_jsx(Div, __assign({ forDesktop: true }, { children: _jsx(Logo, { src: logoURL, alt: "" }) }))), currentStepIndex > 0 && !appResponse && (_jsx(GoBackButtonWrapper, { children: _jsx(Button, __assign({ variant: "secondary", onClick: goBack }, { children: t("stepper.go_back") })) }))] }))) })));
123
- var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ "data-cy": "continue-button", variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, "data-cy": "submit_disabled_" + isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
136
+ var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ "data-cy": "continue-button", isDisabled: isContinueDisabled, variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, "data-cy": "submit_disabled_" + isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
124
137
  return (_jsxs(_Fragment, { children: [_jsx(StepperWrapper, __assign({ pRelative: true, alignCenter: true, w100: true, h: 72, centered: true }, { children: _jsxs(StepperContainer, { children: [leftButtonUI, _jsx(Steps, __assign({ alignCenter: true }, { children: stepsUI })), rightButtonUI] }) })), _jsx(UnmatchedHeadersModal, { isUnmatchedHeadersModalOpen: isUnmatchedHeadersModalOpen, unmatchedHeadersCount: unmatchedHeadersCount, onSetStep: function () { return setStep(); }, onCloseUnmatchedHeadersModal: function () {
125
138
  return setIsUnmatchedHeadersModalOpen(false);
126
139
  } }), _jsx(StepperSubmitModal, { isSubmitModalOpen: isSubmitModalOpen, onCloseModal: function () { return setIsSubmitModalOpen(false); }, onSubmit: onSubmit }), _jsx(ConfirmCloseModal, { isOpen: isConfirmCloseModalOpen, onClose: function () { return setIsConfirmCloseModalOpen(false); }, onCloseImporter: onClose })] }));
@@ -1,4 +1,5 @@
1
1
  export declare const useDataSetManipulation: () => {
2
2
  appendNewRecordToSpreadsheet: () => void;
3
3
  deleteRecordsFromSpreadsheet: (recordIds: string[]) => void;
4
+ findAndReplaceInSpreadsheet: (searchText: string, replaceText: string, matchCase: boolean, useRegex: boolean) => any[];
4
5
  };
@@ -1,3 +1,14 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  import { useFilteredDataContext } from "../FilteredDataContextProvider";
2
13
  import { useDataSetContext } from "../DataSetContextProvider";
3
14
  import { hasValueInAnyField } from "./utils";
@@ -5,6 +16,8 @@ import { addMeta } from "../../../../Importer/data";
5
16
  import { useEventManagerContext } from "../../../../common/EventManagerContextProvider";
6
17
  import { useValidationContext } from "../ValidationContextProvider";
7
18
  import { useDuplicateDataContext } from "../DuplicateDataContextProvider";
19
+ import { useBatchProcessing } from "./useBatchProcessing";
20
+ import useFindAndReplace from "../../../../common/Table/TableActions/useFindAndReplace";
8
21
  export var useDataSetManipulation = function () {
9
22
  var _a = useFilteredDataContext(), lastFilteredRecordId = _a.lastFilteredRecordId, setRecalculateFilters = _a.setRecalculateFilters;
10
23
  var _b = useDataSetContext(), getRecord = _b.getRecord, setRecord = _b.setRecord, dataSet = _b.dataSet, deleteRecord = _b.deleteRecord, emptyRecordIds = _b.emptyRecordIds;
@@ -12,6 +25,8 @@ export var useDataSetManipulation = function () {
12
25
  var _d = useValidationContext(), errors = _d.errors, warnings = _d.warnings, calculateColumnErrorCounts = _d.calculateColumnErrorCounts, calculateColumnWarningCounts = _d.calculateColumnWarningCounts;
13
26
  var updateDuplicateValues = useDuplicateDataContext().updateDuplicateValues;
14
27
  var updateRecordAndRevalidate = useValidationContext().updateRecordAndRevalidate;
28
+ var processInBatches = useBatchProcessing().processInBatches;
29
+ var replaceInRecord = useFindAndReplace().replaceInRecord;
15
30
  var appendNewRecordToSpreadsheet = function () {
16
31
  var _a, _b;
17
32
  var _record = getRecord(lastFilteredRecordId.current);
@@ -39,8 +54,22 @@ export var useDataSetManipulation = function () {
39
54
  emit(EVENTS.UPDATE_TOTAL_ERROR_COUNT);
40
55
  emit(EVENTS.UPDATE_TOTAL_ROW_COUNT);
41
56
  };
57
+ var findAndReplaceInSpreadsheet = function (searchText, replaceText, matchCase, useRegex) {
58
+ var cellsWithText = [];
59
+ processInBatches(dataSet.current, function (batch) {
60
+ for (var recordKey in batch) {
61
+ var record = __assign({}, dataSet.current[recordKey]);
62
+ if (replaceInRecord(record, searchText, replaceText, matchCase, useRegex)) {
63
+ cellsWithText.push(record);
64
+ }
65
+ }
66
+ });
67
+ updateRecordAndRevalidate(cellsWithText);
68
+ return cellsWithText;
69
+ };
42
70
  return {
43
71
  appendNewRecordToSpreadsheet: appendNewRecordToSpreadsheet,
44
72
  deleteRecordsFromSpreadsheet: deleteRecordsFromSpreadsheet,
73
+ findAndReplaceInSpreadsheet: findAndReplaceInSpreadsheet,
45
74
  };
46
75
  };
@@ -58,6 +58,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
58
58
  import { createContext, useContext, useEffect, useMemo, useRef, useState, } from "react";
59
59
  import { useAppLoadingContext } from "../../../../common/AppLoadingContextProvider";
60
60
  import { useEventManagerContext } from "../../../../common/EventManagerContextProvider";
61
+ import { useImporterContext } from "../../../contexts/ImporterContextProvider";
61
62
  import { useDataSetContext } from "../DataSetContextProvider";
62
63
  import { useDuplicateDataContext } from "../DuplicateDataContextProvider";
63
64
  import { useBatchProcessing } from "../SpreadsheetContextProvider/useBatchProcessing";
@@ -101,16 +102,22 @@ export var ValidationContextProvider = function (_a) {
101
102
  var columnsWithWarningCounts = useRef({});
102
103
  var totalErrorCount = useRef(0);
103
104
  var invalidRowsCountRef = useRef(0);
104
- var _c = useState(false), spreadsheetInitialized = _c[0], setSpreadsheetInitialized = _c[1];
105
- var _d = useEventManagerContext(), emit = _d.emit, EVENTS = _d.EVENTS;
106
- var _e = useDataSetContext(), getRecord = _e.getRecord, setRecord = _e.setRecord, dataSet = _e.dataSet;
107
- var _f = useDuplicateDataContext(), duplicateValues = _f.duplicateValues, updateDuplicateValues = _f.updateDuplicateValues;
105
+ var _c = useEventManagerContext(), emit = _c.emit, EVENTS = _c.EVENTS;
106
+ var _d = useDataSetContext(), getRecord = _d.getRecord, setRecord = _d.setRecord, dataSet = _d.dataSet;
107
+ var _e = useDuplicateDataContext(), duplicateValues = _e.duplicateValues, updateDuplicateValues = _e.updateDuplicateValues;
108
108
  var processRecordsInBatches = useBatchProcessing(10000).processRecordsInBatches;
109
+ var _f = useState(false), spreadsheetInitialized = _f[0], setSpreadsheetInitialized = _f[1];
110
+ var currentStepIndex = useImporterContext().currentStepIndex;
111
+ var _g = useState(false), dataSetChanged = _g[0], setDataSetChanged = _g[1];
109
112
  var reset = function () {
110
113
  columnsWithErrorCounts.current = {};
111
114
  columnsWithWarningCounts.current = {};
112
115
  totalErrorCount.current = 0;
113
116
  invalidRowsCountRef.current = 0;
117
+ errors.current = {};
118
+ warnings.current = {};
119
+ setSpreadsheetInitialized(false);
120
+ setDataSetChanged(function (prev) { return !prev; });
114
121
  };
115
122
  var calculateColumnErrorCounts = function (oldErrors, newErrors) {
116
123
  if (oldErrors === void 0) { oldErrors = {}; }
@@ -177,7 +184,7 @@ export var ValidationContextProvider = function (_a) {
177
184
  else {
178
185
  delete warnings.current[recordId];
179
186
  }
180
- if (backendErrors) {
187
+ if (backendErrors && spreadsheetInitialized) {
181
188
  record._meta.backendErrors = {};
182
189
  }
183
190
  emit(recordId, newRecord);
@@ -253,7 +260,9 @@ export var ValidationContextProvider = function (_a) {
253
260
  // Initial data validation and update dataSet
254
261
  useEffect(function () {
255
262
  reset();
256
- if (!dataSet.current || isReadOnly)
263
+ }, [dataSet.current]);
264
+ useEffect(function () {
265
+ if (!dataSet.current || isReadOnly || currentStepIndex !== 2)
257
266
  return;
258
267
  setIsLoadingApp(true);
259
268
  var initialValidation = function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -265,7 +274,6 @@ export var ValidationContextProvider = function (_a) {
265
274
  return [4 /*yield*/, updateRecordAndRevalidate(initialData, true)];
266
275
  case 1:
267
276
  _a.sent();
268
- setSpreadsheetInitialized(true);
269
277
  return [2 /*return*/];
270
278
  }
271
279
  });
@@ -277,11 +285,12 @@ export var ValidationContextProvider = function (_a) {
277
285
  case 1:
278
286
  _a.sent();
279
287
  setIsLoadingApp(false);
288
+ setSpreadsheetInitialized(true);
280
289
  return [2 /*return*/];
281
290
  }
282
291
  });
283
292
  }); })();
284
- }, [dataSet.current]);
293
+ }, [spreadsheetInitialized, currentStepIndex, dataSetChanged]);
285
294
  var isValidationCompleted = validationPercentage === 100;
286
295
  var isValid = isValidationCompleted && totalErrorCount.current === 0;
287
296
  var value = {
@@ -0,0 +1,6 @@
1
+ type FindAndReplaceModalProps = {
2
+ initialText: string;
3
+ onClose: () => void;
4
+ };
5
+ export declare const FindAndReplaceModal: ({ initialText, onClose, }: FindAndReplaceModalProps) => JSX.Element;
6
+ export {};
@@ -0,0 +1,44 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { Div } from "../../../../../styled";
14
+ import { Button, Modal, addToast } from "../../../../../common";
15
+ import { useTranslation } from "react-i18next";
16
+ import { TextInput } from "../../../../../common/inputs/TextInput";
17
+ import { Checkbox } from "../../../../../common";
18
+ import { useState } from "react";
19
+ import { useDataSetManipulation } from "../../SpreadsheetContextProvider/useDataSetManipulation";
20
+ import { useFilteredDataContext } from "../../FilteredDataContextProvider";
21
+ export var FindAndReplaceModal = function (_a) {
22
+ var initialText = _a.initialText, onClose = _a.onClose;
23
+ var t = useTranslation("general").t;
24
+ var _b = useState(initialText), searchText = _b[0], setSearchText = _b[1];
25
+ var _c = useState(""), replaceText = _c[0], setReplaceText = _c[1];
26
+ var findAndReplaceInSpreadsheet = useDataSetManipulation().findAndReplaceInSpreadsheet;
27
+ var _d = useState(false), useRegex = _d[0], setUseRegex = _d[1];
28
+ var _e = useState(true), matchCase = _e[0], setMatchCase = _e[1];
29
+ var setFilteredInputValue = useFilteredDataContext().setFilteredInputValue;
30
+ var findAndReplace = function () {
31
+ var records = findAndReplaceInSpreadsheet(searchText, replaceText, matchCase, useRegex);
32
+ if (records.length > 0) {
33
+ addToast(t("find_and_replace_modal.records_replaced", {
34
+ length: records.length,
35
+ }), "success");
36
+ onClose();
37
+ setFilteredInputValue("");
38
+ }
39
+ else {
40
+ addToast(t("find_and_replace_modal.no_records_found"), "error");
41
+ }
42
+ };
43
+ return (_jsx(Modal, __assign({ isOpen: true, onClose: function () { return onClose(); } }, { children: _jsxs(Div, __assign({ p: "17px 20px", w: 500 }, { children: [_jsx(Div, __assign({ textAlignCenter: true, h5: true }, { children: t("find_and_replace_modal.title") })), _jsx(Div, __assign({ mt: 20, mb: 20, textAlignCenter: true, body1: true }, { children: t("find_and_replace_modal.description") })), _jsxs(Div, __assign({ mb: 20, w: 500, textAlignCenter: true, body1: true }, { children: [_jsx(TextInput, { "data-cy": "find-input", mb: 20, name: t("find_and_replace_modal.find"), label: t("find_and_replace_modal.find"), value: searchText, onChange: function (value) { return setSearchText(value); } }), _jsx(TextInput, { "data-cy": "replace-input", label: t("find_and_replace_modal.replace_with"), value: replaceText, onChange: function (value) { return setReplaceText(value); } })] })), _jsx(Div, __assign({ mb: 12 }, { children: _jsx(Checkbox, { "data-cy": "use-regex", label: t("find_and_replace_modal.use_regex"), isChecked: useRegex, onChange: function (v) { return setUseRegex(v); } }) })), _jsx(Div, __assign({ mb: 12 }, { children: _jsx(Checkbox, { "data-cy": "case-sensitive", label: t("find_and_replace_modal.use_case_sensitive"), isChecked: matchCase, onChange: function (v) { return setMatchCase(v); } }) })), _jsxs(Div, __assign({ dflex: true, centered: true, mt: 40 }, { children: [_jsx(Button, __assign({ variant: "secondary", onClick: function () { return onClose(); }, w: 160, mr: 16 }, { children: t("find_and_replace_modal.cancel") })), _jsx(Button, __assign({ "data-cy": "find-replace-submit", variant: "primary", onClick: function () { return findAndReplace(); } }, { children: t("find_and_replace_modal.submit") }))] }))] })) })));
44
+ };
@@ -44,9 +44,9 @@ import { useImporterContext } from "../../../contexts/ImporterContextProvider";
44
44
  import { useReviewContext } from "../../../Review/ReviewContextProvider";
45
45
  import { spreadsheetRowHeightPx } from "../common";
46
46
  import { spreadsheetHeaderHeightPx } from "../common/index";
47
- import { useDataSetContext } from "../DataSetContextProvider";
48
47
  import { useSpreadsheetContext } from "../SpreadsheetContextProvider";
49
48
  import { rowIsEmpty } from "../SpreadsheetContextProvider/utils";
49
+ import { useDataSetContext } from "../DataSetContextProvider";
50
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) {
51
51
  var theme = _a.theme;
52
52
  return theme.colors.white50;
@@ -2,7 +2,6 @@ import { Field, Record, TransformedRecord } from "../../../../types";
2
2
  type TransformRecordArgs = {
3
3
  record: Record;
4
4
  fields: Field[];
5
- possibleDateFormats?: string[];
6
5
  };
7
- export declare const transformRecord: ({ record, fields, possibleDateFormats, }: TransformRecordArgs) => TransformedRecord;
6
+ export declare const transformRecord: ({ record, fields }: TransformRecordArgs) => TransformedRecord;
8
7
  export {};
@@ -1,15 +1,11 @@
1
- import { datesDateTimesAndTimesTransformations, fieldTransformations, } from "./transformators";
2
- var runTransformation = function (fieldValue, transformation, field, possibleDateFormats) {
1
+ import { fieldTransformations } from "./transformators";
2
+ var runTransformation = function (fieldValue, transformation, field) {
3
3
  var transformationType = transformation.transformation_type;
4
4
  var transformerFunction = fieldTransformations[transformationType];
5
- if (Object.keys(datesDateTimesAndTimesTransformations).includes(transformationType)) {
6
- var dateTimeTransformFunction = transformerFunction;
7
- return dateTimeTransformFunction(fieldValue, transformation, field, possibleDateFormats);
8
- }
9
5
  return transformerFunction(fieldValue, transformation, field);
10
6
  };
11
7
  export var transformRecord = function (_a) {
12
- var record = _a.record, fields = _a.fields, possibleDateFormats = _a.possibleDateFormats;
8
+ var record = _a.record, fields = _a.fields;
13
9
  var transformedRecords = {};
14
10
  for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
15
11
  var currentField = fields_1[_i];
@@ -27,7 +23,7 @@ export var transformRecord = function (_a) {
27
23
  var fieldWasTransformed = false;
28
24
  for (var i = 0; i < fieldTransformations_1.length; i++) {
29
25
  var currentTransformation = fieldTransformations_1[i];
30
- var transformed = runTransformation(transformedField.transformed, currentTransformation, currentField, possibleDateFormats);
26
+ var transformed = runTransformation(transformedField.transformed, currentTransformation, currentField);
31
27
  if (transformed.transformationWasNeeded) {
32
28
  fieldWasTransformed = true;
33
29
  transformedField = {
@@ -0,0 +1,5 @@
1
+ import { DateTime } from "luxon";
2
+ export declare const parseDateFromUserInput: (userInput: string) => DateTime | null;
3
+ export declare const parseTimeFromUserInput: (input: any) => DateTime;
4
+ export declare const parseTimeFromDateTimeorTimeInput: (userInput: any) => DateTime;
5
+ export declare const parseDateTimeFromUserInput: (userInput: any) => DateTime;
@@ -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
  };