fuse-importer 0.1.3-testing → 0.1.5-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 (122) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +38 -7
  2. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +1 -1
  3. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +4 -3
  4. package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +14 -9
  5. package/lib/esm/Importer/Matcher/index.js +0 -11
  6. package/lib/esm/Importer/PreviewFirstTime.js +1 -1
  7. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +6 -6
  8. package/lib/esm/Importer/Review/ReviewContextProvider.js +53 -184
  9. package/lib/esm/Importer/Review/ReviewWithContext.js +2 -2
  10. package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +2 -1
  11. package/lib/esm/Importer/Stepper/StepperSubmitModal.js +4 -2
  12. package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +1 -1
  13. package/lib/esm/Importer/Stepper/index.js +21 -11
  14. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.d.ts +2 -1
  15. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +14 -86
  16. package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +11 -3
  17. package/lib/esm/Importer/Uploader/HeadersPreview.js +1 -1
  18. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.d.ts +16 -0
  19. package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.js +63 -0
  20. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +18 -0
  21. package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +101 -0
  22. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +29 -0
  23. package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +150 -0
  24. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +6 -4
  25. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +37 -37
  26. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +6 -0
  27. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +138 -0
  28. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +7 -29
  29. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +11 -193
  30. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +5 -0
  31. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +72 -0
  32. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +4 -0
  33. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +46 -0
  34. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +2 -1
  35. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +31 -0
  36. package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +304 -0
  37. package/lib/esm/Importer/common/Spreadsheet/common/index.js +5 -4
  38. package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -3
  39. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.d.ts +0 -2
  40. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +26 -11
  41. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +21 -13
  42. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +35 -36
  43. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowNumbers.js +3 -3
  44. package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +5 -1
  45. package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +57 -26
  46. package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.js +1 -2
  47. package/lib/esm/Importer/common/Spreadsheet/index.d.ts +0 -1
  48. package/lib/esm/Importer/common/Spreadsheet/index.js +1 -84
  49. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -2
  50. package/lib/esm/Importer/common/Spreadsheet/styles.js +13 -1
  51. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.d.ts +5 -0
  52. package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
  53. package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
  54. package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
  55. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
  56. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +16 -7
  57. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +4 -2
  58. package/lib/esm/Importer/contexts/ImporterContextProvider.js +137 -18
  59. package/lib/esm/Importer/data/index.js +7 -5
  60. package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
  61. package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
  62. package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
  63. package/lib/esm/Importer/hooks/useSubmitToServer.js +192 -0
  64. package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
  65. package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
  66. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
  67. package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +108 -0
  68. package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
  69. package/lib/esm/common/FileUploadDropzone/index.js +1 -0
  70. package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +55 -41
  71. package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -16
  72. package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
  73. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +36 -9
  74. package/lib/esm/common/Table/TableActions/RowFilters.js +53 -5
  75. package/lib/esm/common/Table/TableActions/SearchRows.js +3 -1
  76. package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
  77. package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +16 -9
  78. package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
  79. package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
  80. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
  81. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +2 -2
  82. package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
  83. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  84. package/lib/esm/common/Table/TableView/index.js +6 -15
  85. package/lib/esm/common/Table/TableView/types.d.ts +8 -9
  86. package/lib/esm/common/Table/index.d.ts +2 -1
  87. package/lib/esm/common/Table/index.js +2 -2
  88. package/lib/esm/common/Toast.js +3 -2
  89. package/lib/esm/common/TooltipProvider.d.ts +2 -0
  90. package/lib/esm/common/TooltipProvider.js +12 -9
  91. package/lib/esm/common/buttons.d.ts +5 -1
  92. package/lib/esm/common/buttons.js +13 -7
  93. package/lib/esm/common/columnsTransformations.js +1 -1
  94. package/lib/esm/common/datePatterns.js +10 -10
  95. package/lib/esm/common/icons/index.d.ts +1 -0
  96. package/lib/esm/common/icons/index.js +1 -0
  97. package/lib/esm/common/index.d.ts +1 -0
  98. package/lib/esm/common/index.js +1 -0
  99. package/lib/esm/common/inputs/Autocomplete.js +1 -1
  100. package/lib/esm/locales/de.d.ts +1 -1
  101. package/lib/esm/locales/de.js +1 -1
  102. package/lib/esm/locales/en.d.ts +1 -1
  103. package/lib/esm/locales/en.js +4 -4
  104. package/lib/esm/locales/es.d.ts +1 -1
  105. package/lib/esm/locales/es.js +1 -1
  106. package/lib/esm/locales/fr.d.ts +1 -1
  107. package/lib/esm/locales/fr.js +1 -1
  108. package/lib/esm/types.d.ts +27 -4
  109. package/lib/main.js +24 -24
  110. package/package.json +6 -4
  111. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
  112. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -33
  113. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
  114. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
  115. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
  116. package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
  117. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -33
  118. package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -256
  119. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
  120. package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
  121. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
  122. package/lib/esm/common/Table/TableActions/hooks.js +0 -41
@@ -45,6 +45,7 @@ import { Checkbox } from "../../../../common/inputs/Checkbox";
45
45
  import { useImporterContext } from "../../../contexts/ImporterContextProvider";
46
46
  import ReactVirtualizedAutoSizer from "react-virtualized-auto-sizer";
47
47
  import { rowIsEmpty } from "../SpreadsheetContextProvider/utils";
48
+ import { useDataSetContext } from "../DataSetContextProvider";
48
49
  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) {
49
50
  var theme = _a.theme;
50
51
  return theme.colors.white50;
@@ -57,52 +58,55 @@ var gridStyles = {
57
58
  };
58
59
  export var SpreadsheetRowCheckboxes = function (_a) {
59
60
  var height = _a.height, gridRef = _a.gridRef, isLoadingData = _a.isLoadingData, props = __rest(_a, ["height", "gridRef", "isLoadingData"]);
60
- var _b = useSpreadsheetContext(), data = _b.data, selectedRows = _b.selectedRows, options = _b.options, lastClickedIndexRef = _b.lastClickedIndexRef, setSelectedRows = _b.setSelectedRows, checkboxColumnWidth = _b.checkboxColumnWidth, isTransformTooltipOpened = _b.isTransformTooltipOpened;
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 getRecord = useDataSetContext().getRecord;
61
63
  var currentStepIndex = useImporterContext().currentStepIndex;
62
- var nonEmptyRows = useMemo(function () { return data.filter(function (row) { return !rowIsEmpty(row); }); }, [
63
- data,
64
- ]);
64
+ var nonEmptyRows = useMemo(function () { return filteredDataIds.filter(function (rowId) { return !rowIsEmpty(getRecord(rowId)); }); }, [filteredDataIds]);
65
65
  var isIndeterminate = selectedRows.length > 0 && selectedRows.length < nonEmptyRows.length;
66
66
  var handleRowSelect = function (checked, rowIndex, rowMetaId) {
67
- var _a, _b;
67
+ var _a;
68
68
  if (isTransformTooltipOpened)
69
69
  return;
70
- var lastRowMetaId = data[data.length - 1]._meta.id;
71
- var isLastRow = rowMetaId === lastRowMetaId;
72
- var isLastRowAndEmpty = isLastRow && rowIsEmpty(data[rowIndex]);
70
+ var recordId = filteredDataIds[rowIndex];
71
+ var record = getRecord(recordId);
72
+ var lastRowRecordId = filteredDataIds[filteredDataIds.length - 1];
73
+ var isLastRow = rowMetaId === lastRowRecordId;
74
+ var isLastRowAndEmpty = isLastRow && rowIsEmpty(getRecord(lastRowRecordId));
73
75
  if (isLastRowAndEmpty)
74
76
  return;
75
77
  if (options.withSingleRowSelect) {
76
- if (!rowIsEmpty(data[rowIndex]))
77
- setSelectedRows([(_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id]);
78
+ if (!rowIsEmpty(record))
79
+ setSelectedRows([(_a = record === null || record === void 0 ? void 0 : record._meta) === null || _a === void 0 ? void 0 : _a.id]);
78
80
  return;
79
81
  }
80
82
  if (checked) {
81
- setSelectedRows(function (prev) { var _a, _b; return __spreadArray(__spreadArray([], prev, true), [(_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id], false); });
83
+ setSelectedRows(function (prev) { var _a; return __spreadArray(__spreadArray([], prev, true), [(_a = record === null || record === void 0 ? void 0 : record._meta) === null || _a === void 0 ? void 0 : _a.id], false); });
82
84
  }
83
85
  else {
84
86
  setSelectedRows(function (prev) {
85
- return prev.filter(function (row) { var _a, _b; return row !== ((_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id); });
87
+ return prev.filter(function (row) { var _a; return row !== ((_a = record === null || record === void 0 ? void 0 : record._meta) === null || _a === void 0 ? void 0 : _a.id); });
86
88
  });
87
89
  }
88
90
  lastClickedIndexRef.current = rowIndex;
89
91
  };
90
92
  var handleSelectMultipleRows = function (rowIndex) {
91
- var _a, _b;
93
+ var _a;
92
94
  if (isTransformTooltipOpened)
93
95
  return;
94
- var clickedRowId = (_b = (_a = data[rowIndex]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.id;
96
+ var rowId = filteredDataIds[rowIndex];
97
+ var record = getRecord(rowId);
98
+ var clickedRowId = (_a = record === null || record === void 0 ? void 0 : record._meta) === null || _a === void 0 ? void 0 : _a.id;
95
99
  if (selectedRows.includes(clickedRowId)) {
96
100
  // The clicked row is already selected, so we have to remove it
97
101
  var clickedRowIndex = selectedRows.indexOf(clickedRowId);
98
102
  var lastClickedIndex = lastClickedIndexRef.current;
99
103
  var rangeStartIndex_1 = Math.min(clickedRowIndex, lastClickedIndex);
100
104
  var rangeEndIndex_1 = Math.max(clickedRowIndex, lastClickedIndex);
101
- var lastRowId_1 = data[data.length - 1]._meta.id;
105
+ var lastRowId_1 = filteredDataIds[filteredDataIds.length - 1];
102
106
  var updatedSelectedRows = selectedRows.filter(function (value, index) {
103
107
  return index < rangeStartIndex_1 ||
104
108
  index > rangeEndIndex_1 ||
105
- (value === lastRowId_1 && rowIsEmpty(data[data.length - 1]));
109
+ (value === lastRowId_1 && rowIsEmpty(getRecord(lastRowId_1)));
106
110
  });
107
111
  setSelectedRows(updatedSelectedRows);
108
112
  }
@@ -110,14 +114,14 @@ export var SpreadsheetRowCheckboxes = function (_a) {
110
114
  // The clicked row is not selected, so we have to add it
111
115
  var lastSelectedRowIndex = selectedRows.length - 1;
112
116
  var lastSelectedRowId_1 = selectedRows[lastSelectedRowIndex];
113
- var lastSelectedRow = data.find(function (row) { var _a; return ((_a = row === null || row === void 0 ? void 0 : row._meta) === null || _a === void 0 ? void 0 : _a.id) === lastSelectedRowId_1; });
114
- var clickedRow = data[rowIndex];
115
- var rangeStartIndex = data.indexOf(lastSelectedRow);
116
- var rangeEndIndex = data.indexOf(clickedRow);
117
- var range = data.slice(Math.min(rangeStartIndex, rangeEndIndex), Math.max(rangeStartIndex, rangeEndIndex) + 1);
118
- var rangeIds = range.map(function (row) { return row === null || row === void 0 ? void 0 : row._meta.id; });
119
- var lastRowId_2 = data[data.length - 1]._meta.id;
120
- var isLastRowEmpty_1 = rowIsEmpty(data[data.length - 1]);
117
+ var lastSelectedRow = filteredDataIds.find(function (id) { return id === lastSelectedRowId_1; });
118
+ var clickedRow = filteredDataIds[rowIndex];
119
+ var rangeStartIndex = filteredDataIds.indexOf(lastSelectedRow);
120
+ var rangeEndIndex = filteredDataIds.indexOf(clickedRow);
121
+ var range = filteredDataIds.slice(Math.min(rangeStartIndex, rangeEndIndex), Math.max(rangeStartIndex, rangeEndIndex) + 1);
122
+ var rangeIds = range.map(function (row) { return row; });
123
+ var lastRowId_2 = filteredDataIds[filteredDataIds.length - 1];
124
+ var isLastRowEmpty_1 = rowIsEmpty(getRecord(lastRowId_2));
121
125
  var updatedSelectedRows = __spreadArray(__spreadArray([], selectedRows, true), rangeIds, true).filter(function (value, index, array) {
122
126
  return array.indexOf(value) === index &&
123
127
  (value !== lastRowId_2 || (value === lastRowId_2 && !isLastRowEmpty_1));
@@ -130,14 +134,10 @@ export var SpreadsheetRowCheckboxes = function (_a) {
130
134
  if (isTransformTooltipOpened)
131
135
  return;
132
136
  if (checked) {
133
- var allRows = data
134
- .filter(function (row) {
135
- var isLastRow = row._meta.id === data[data.length - 1]._meta.id;
136
- var isLastRowAndEmpty = isLastRow && rowIsEmpty(row);
137
+ var allRows = filteredDataIds.filter(function (recordId) {
138
+ var isLastRow = recordId === filteredDataIds[filteredDataIds.length - 1];
139
+ var isLastRowAndEmpty = isLastRow && rowIsEmpty(getRecord(recordId));
137
140
  return !isLastRowAndEmpty;
138
- })
139
- .map(function (row) {
140
- return row === null || row === void 0 ? void 0 : row._meta.id;
141
141
  });
142
142
  setSelectedRows(allRows);
143
143
  }
@@ -147,9 +147,8 @@ export var SpreadsheetRowCheckboxes = function (_a) {
147
147
  lastClickedIndexRef.current = null;
148
148
  };
149
149
  var CheckboxCell = function (_a) {
150
- var _b, _c;
151
150
  var rowIndex = _a.rowIndex;
152
- var rowMetaId = (_c = (_b = data[rowIndex]) === null || _b === void 0 ? void 0 : _b._meta) === null || _c === void 0 ? void 0 : _c.id;
151
+ var rowMetaId = filteredDataIds[rowIndex];
153
152
  return (_jsx(Div, __assign({ className: "checkbox-cell", "data-test-id": "checkbox-cell-".concat(rowIndex) }, { children: _jsx(Checkbox, { isChecked: rowMetaId && selectedRows.includes(rowMetaId), onChange: function (checked) {
154
153
  return !isLoadingData && handleRowSelect(checked, rowIndex, rowMetaId);
155
154
  }, onShiftKeyPressed: function () {
@@ -163,16 +162,16 @@ export var SpreadsheetRowCheckboxes = function (_a) {
163
162
  };
164
163
  var Cell = function (_a) {
165
164
  var rowIndex = _a.rowIndex, style = _a.style;
166
- return (_jsxs(RowCheckbox, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: rowIndex === data.length - 1 }, { children: [_jsx(CheckboxCell, { rowIndex: rowIndex }), _jsx(RowNumbersCell, { rowIndex: rowIndex })] }), rowIndex));
165
+ return (_jsxs(RowCheckbox, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: rowIndex === filteredDataIds.length - 1 }, { children: [_jsx(CheckboxCell, { rowIndex: rowIndex }), _jsx(RowNumbersCell, { rowIndex: rowIndex })] }), rowIndex));
167
166
  };
168
167
  var isSelectAllRowsChekboxChecked = (selectedRows === null || selectedRows === void 0 ? void 0 : selectedRows.length) > 0 &&
169
- (data === null || data === void 0 ? void 0 : data.length) > 0 &&
168
+ (filteredDataIds === null || filteredDataIds === void 0 ? void 0 : filteredDataIds.length) > 0 &&
170
169
  (selectedRows === null || selectedRows === void 0 ? void 0 : selectedRows.length) >= (nonEmptyRows === null || nonEmptyRows === void 0 ? void 0 : nonEmptyRows.length);
171
170
  return (_jsxs(SpreadsheetRowCheckboxesContainer, __assign({ className: "spreadsheet-row-container", columnWidth: checkboxColumnWidth }, props, { h100: true }, { children: [_jsx(SpreadsheetRowCheckboxesHeader, { children: currentStepIndex === 2 && (_jsx(Checkbox, { isChecked: isSelectAllRowsChekboxChecked, onChange: function (checked) {
172
171
  return !isLoadingData && handleSelectAllRows(checked);
173
172
  }, isIndeterminate: isIndeterminate, isDisabled: isLoadingData })) }), _jsx(ReactVirtualizedAutoSizer, { children: function (_a) {
174
173
  var height = _a.height;
175
- return (_jsx(StyledGrid, __assign({ ref: gridRef, style: gridStyles, width: checkboxColumnWidth, columnCount: 1, columnWidth: checkboxColumnWidth, rowHeight: 40, rowCount: data.length, height: height - spreadsheetHeaderHeightPx }, { children: Cell })));
174
+ return (_jsx(StyledGrid, __assign({ ref: gridRef, style: gridStyles, width: checkboxColumnWidth, columnCount: 1, columnWidth: checkboxColumnWidth, rowHeight: 40, rowCount: filteredDataIds.length, height: height - spreadsheetHeaderHeightPx }, { children: Cell })));
176
175
  } })] })));
177
176
  };
178
177
  var RowCheckbox = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n background-color: ", ";\n ", ";\n ", "\n display: flex;\n justify-content: center;\n position: relative;\n user-select: none;\n\n .checkbox-cell {\n left: 50%;\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n visibility: hidden;\n z-index: 1;\n }\n\n .row-numbers-cell {\n left: 50%;\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n"], ["\n background-color: ", ";\n ", ";\n ", "\n display: flex;\n justify-content: center;\n position: relative;\n user-select: none;\n\n .checkbox-cell {\n left: 50%;\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n visibility: hidden;\n z-index: 1;\n }\n\n .row-numbers-cell {\n left: 50%;\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n"])), function (p) { return p.theme.colors.tableHeader; }, function (p) { return p.theme.css.label3; }, function (p) {
@@ -40,12 +40,12 @@ var gridStyles = {
40
40
  };
41
41
  export var SpreadsheetRowNumbers = function (_a) {
42
42
  var height = _a.height, spreadsheetHasXScroll = _a.spreadsheetHasXScroll, gridRef = _a.gridRef, props = __rest(_a, ["height", "spreadsheetHasXScroll", "gridRef"]);
43
- var data = useSpreadsheetContext().data;
43
+ var filteredDataIds = useSpreadsheetContext().filteredDataIds;
44
44
  var Cell = function (_a) {
45
45
  var rowIndex = _a.rowIndex, style = _a.style;
46
- return (_jsx(RowNumber, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: rowIndex === data.length - 1 }, { children: _jsx(Div, __assign({ truncateText: true, textAlignCenter: true, body2: true }, { children: rowIndex + 1 })) }), rowIndex));
46
+ return (_jsx(RowNumber, __assign({ style: style, alignCenter: true, justifyCenter: true, isLast: rowIndex === filteredDataIds.length - 1 }, { children: _jsx(Div, __assign({ truncateText: true, textAlignCenter: true, body2: true }, { children: rowIndex + 1 })) }), rowIndex));
47
47
  };
48
- return (_jsxs(SpreadsheetRowNumbersContainer, __assign({}, props, { h: height }, { children: [_jsx(SpreadsheetRowNumbersHeader, {}), _jsx(Grid, __assign({ ref: gridRef, style: gridStyles, width: SPREADSHEET_ROW_NUMBERS_WIDTH, columnCount: 1, columnWidth: SPREADSHEET_ROW_NUMBERS_WIDTH, height: height - spreadsheetHeaderHeightPx, rowHeight: 40, rowCount: data.length }, { children: Cell }))] })));
48
+ return (_jsxs(SpreadsheetRowNumbersContainer, __assign({}, props, { h: height }, { children: [_jsx(SpreadsheetRowNumbersHeader, {}), _jsx(Grid, __assign({ ref: gridRef, style: gridStyles, width: SPREADSHEET_ROW_NUMBERS_WIDTH, columnCount: 1, columnWidth: SPREADSHEET_ROW_NUMBERS_WIDTH, height: height - spreadsheetHeaderHeightPx, rowHeight: 40, rowCount: filteredDataIds.length }, { children: Cell }))] })));
49
49
  };
50
50
  var RowNumber = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background-color: ", ";\n ", ";\n ", "\n"], ["\n background-color: ", ";\n ", ";\n ", "\n"])), function (p) { return p.theme.colors.tableHeader; }, function (p) { return p.theme.css.label3; }, function (p) {
51
51
  return !p.isLast && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n box-shadow: inset 0 -1px 0 ", ";\n "], ["\n box-shadow: inset 0 -1px 0 ", ";\n "])), function (p) { return p.theme.colors.gray300; });
@@ -31,6 +31,10 @@ import { SpreadsheetField, useSpreadsheetField } from ".";
31
31
  import { Div } from "../../../../../styled/utils";
32
32
  import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
33
33
  import { AVERAGE_CHAR_SIZE, getFieldContentWidth } from "./utils";
34
+ var parseValue = function (value) {
35
+ var isFalsyButNotZero = !value && value !== 0;
36
+ return isFalsyButNotZero ? "" : value;
37
+ };
34
38
  export var SpreadsheetInput = function (_a) {
35
39
  var _b, _c, _d, _e, _f, _g;
36
40
  var name = _a.name, record = _a.record, fieldType = _a.fieldType, columnWidth = _a.columnWidth, props = __rest(_a, ["name", "record", "fieldType", "columnWidth"]);
@@ -56,7 +60,7 @@ export var SpreadsheetInput = function (_a) {
56
60
  ? "".concat(totalInputSize, "px")
57
61
  : "".concat(defaultWidthAsNumber, "px");
58
62
  }, [value, record, columnWidth]);
59
- return (_jsxs(SpreadsheetField, __assign({ validationError: validationError, validationWarning: validationWarning, isHighlighted: isHighlighted, defaultFieldWidth: defaultWidthAsNumber, expandedFieldWidth: expandedFieldWidth, shouldExpandInput: true }, { children: [_jsx(Input, __assign({ autoComplete: "off", hasError: !!validationError, hasWarning: !!validationWarning, value: value || "", onChange: function (_a) {
63
+ return (_jsxs(SpreadsheetField, __assign({ validationError: validationError, validationWarning: validationWarning, isHighlighted: isHighlighted, defaultFieldWidth: defaultWidthAsNumber, expandedFieldWidth: expandedFieldWidth, shouldExpandInput: true }, { children: [_jsx(Input, __assign({ autoComplete: "off", hasError: !!validationError, hasWarning: !!validationWarning, value: parseValue(value), onChange: function (_a) {
60
64
  var value = _a.target.value;
61
65
  return !isTransformTooltipOpened && setValue(value);
62
66
  }, disabledWhen: isTransformTooltipOpened }, props)), ((_g = (_f = (_e = record === null || record === void 0 ? void 0 : record._meta) === null || _e === void 0 ? void 0 : _e.transformedRow) === null || _f === void 0 ? void 0 : _f[name]) === null || _g === void 0 ? void 0 : _g.original) &&
@@ -53,33 +53,59 @@ import { jsx as _jsx } from "react/jsx-runtime";
53
53
  import { debounce, get } from "lodash";
54
54
  import { useCallback, useEffect, useState } from "react";
55
55
  import styled, { css } from "styled-components";
56
+ import { useEventManagerContext } from "../../../../../common/EventManagerContextProvider";
56
57
  import { TooltipProvider } from "../../../../../common/TooltipProvider";
57
58
  import { Div } from "../../../../../styled/utils";
58
- import { parseValue } from "../../common";
59
+ import { useDataSetContext } from "../../DataSetContextProvider";
60
+ import { useFilteredDataContext } from "../../FilteredDataContextProvider";
59
61
  import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
62
+ import { useDataSetManipulation } from "../../SpreadsheetContextProvider/useDataSetManipulation";
63
+ import { useValidationContext } from "../../ValidationContextProvider";
64
+ import { parseValue } from "../../common";
60
65
  export var useSpreadsheetField = function (name, record, fieldType) {
61
- var _a = useSpreadsheetContext(), updateRecord = _a.updateRecord, errors = _a.errors, warnings = _a.warnings;
62
- var _b = useState(record[name]), value = _b[0], setValue = _b[1];
63
- var validationError = get(errors, "".concat(record._meta.id, ".").concat(name), null);
64
- var validationWarning = get(warnings, "".concat(record._meta.id, ".").concat(name), null);
66
+ var appendNewRecordToSpreadsheet = useDataSetManipulation().appendNewRecordToSpreadsheet;
67
+ var lastFilteredRecordId = useFilteredDataContext().lastFilteredRecordId;
68
+ var _a = useValidationContext(), updateRecordAndRevalidate = _a.updateRecordAndRevalidate, warnings = _a.warnings, errors = _a.errors;
69
+ var getRecord = useDataSetContext().getRecord;
70
+ var _b = useState(record), recordState = _b[0], setRecordState = _b[1];
71
+ var _c = useState(record[name]), value = _c[0], setValue = _c[1];
72
+ var _d = useEventManagerContext(), on = _d.on, off = _d.off;
73
+ var _e = useState(get(errors.current, "".concat(record._meta.id, ".").concat(name), null)), validationError = _e[0], setValidationError = _e[1];
74
+ var _f = useState(get(warnings.current, "".concat(record._meta.id, ".").concat(name), null)), validationWarning = _f[0], setValidationWarning = _f[1];
65
75
  useEffect(function () {
66
- if (record[name] !== value) {
67
- setValue(record[name]);
68
- }
69
- }, [record[name]]);
76
+ var listener = function (newRecord) {
77
+ var _record = getRecord(record._meta.id);
78
+ setValidationError(get(errors.current, "".concat(_record._meta.id, ".").concat(name), null));
79
+ setValidationWarning(get(warnings.current, "".concat(_record._meta.id, ".").concat(name), null));
80
+ setRecordState(_record);
81
+ };
82
+ on(record._meta.id, listener);
83
+ return function () {
84
+ off(record._meta.id, listener);
85
+ };
86
+ }, []);
70
87
  var updateData = useCallback(debounce(function (value) { return __awaiter(void 0, void 0, void 0, function () {
71
- var newRecord;
72
- var _a;
73
- return __generator(this, function (_b) {
74
- newRecord = __assign(__assign({}, record), (_a = {}, _a[name] = parseValue(fieldType, value), _a));
75
- updateRecord(newRecord);
88
+ var _record;
89
+ return __generator(this, function (_a) {
90
+ _record = __assign({}, getRecord(record._meta.id));
91
+ _record[name] = parseValue(fieldType, value);
92
+ updateRecordAndRevalidate(_record);
93
+ setRecordState(_record);
94
+ if (record._meta.id === lastFilteredRecordId.current) {
95
+ appendNewRecordToSpreadsheet();
96
+ }
76
97
  return [2 /*return*/];
77
98
  });
78
- }); }, 50), [record]);
99
+ }); }, 200), [record]);
100
+ useEffect(function () {
101
+ if (recordState[name] !== value) {
102
+ setValue(recordState[name]);
103
+ }
104
+ }, [recordState[name], recordState]);
79
105
  var updateValue = useCallback(function (value) {
80
106
  setValue(value);
81
107
  updateData(value);
82
- }, [record, updateData]);
108
+ }, [record, recordState, updateData]);
83
109
  return {
84
110
  value: value,
85
111
  setValue: updateValue,
@@ -87,29 +113,34 @@ export var useSpreadsheetField = function (name, record, fieldType) {
87
113
  validationWarning: validationWarning,
88
114
  };
89
115
  };
90
- var ContentContainer = styled(Div)(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n height: calc(100% - 1px);\n width: ", ";\n overflow: hidden;\n\n ", "\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n ", ";\n ", "\n ", "\n ", "\n ", "\n"], ["\n height: calc(100% - 1px);\n width: ", ";\n overflow: hidden;\n\n ", "\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n ", ";\n ", "\n ", "\n ", "\n ", "\n"])), function (_a) {
116
+ var ContentContainer = styled(Div)(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n height: calc(100% - 1px);\n width: ", ";\n overflow: hidden;\n\n ", "\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n ", ";\n ", "\n ", "\n ", "\n ", "\n"], ["\n height: calc(100% - 1px);\n width: ", ";\n overflow: hidden;\n\n ", "\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n &:focus-within, \n &:hover {\n ", "\n }\n\n ", ";\n ", "\n ", "\n ", "\n ", "\n"])), function (_a) {
91
117
  var defaultFieldWidth = _a.defaultFieldWidth;
92
118
  return defaultFieldWidth ? "".concat(defaultFieldWidth, "px") : "100%";
93
119
  }, function (_a) {
94
120
  var expandedFieldWidth = _a.expandedFieldWidth;
95
121
  return expandedFieldWidth && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: absolute;\n "], ["\n position: absolute;\n "])));
96
122
  }, function (_a) {
97
- var expandedFieldWidth = _a.expandedFieldWidth, isHighlighted = _a.isHighlighted, theme = _a.theme, shouldExpandInput = _a.shouldExpandInput;
98
- return shouldExpandInput && css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background: ", ";\n box-shadow: 0px 0px 0px 2px ", " inset;\n width: ", ";\n z-index: 1;\n\n .suffix {\n right: 12px;\n }\n "], ["\n background: ", ";\n box-shadow: 0px 0px 0px 2px ", " inset;\n width: ", ";\n z-index: 1;\n\n .suffix {\n right: 12px;\n }\n "])), !isHighlighted
123
+ var hasError = _a.hasError, hasWarning = _a.hasWarning, isHighlighted = _a.isHighlighted, theme = _a.theme, shouldExpandInput = _a.shouldExpandInput;
124
+ return shouldExpandInput &&
125
+ !hasError &&
126
+ !hasWarning && css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background: ", ";\n box-shadow: 0px 0px 0px 2px ", " inset;\n "], ["\n background: ", ";\n box-shadow: 0px 0px 0px 2px ", " inset;\n "])), !isHighlighted
99
127
  ? theme.colors.white
100
- : theme.colors.blue100, function (p) { return p.theme.colors.blue500; }, expandedFieldWidth || "auto");
128
+ : theme.colors.blue100, function (p) { return p.theme.colors.blue500; });
129
+ }, function (_a) {
130
+ var expandedFieldWidth = _a.expandedFieldWidth, shouldExpandInput = _a.shouldExpandInput;
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");
101
132
  }, function (p) { return p.theme.css.alignCenter; }, function (p) {
102
- return p.isHighlighted && css(templateObject_3 || (templateObject_3 = __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 "], ["\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; });
103
134
  }, function (p) {
104
- return p.hasWarning && css(templateObject_4 || (templateObject_4 = __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; });
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; });
105
136
  }, function (p) {
106
- return p.hasError && 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.error; }, function (p) { return p.theme.colors.red100; }, function (p) { return p.theme.colors.error; });
137
+ return p.hasError && css(templateObject_6 || (templateObject_6 = __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.error; }, function (p) { return p.theme.colors.red100; }, function (p) { return p.theme.colors.error; });
107
138
  }, function (p) {
108
- return p.isReadOnly && css(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n pointer-events: none;\n "], ["\n pointer-events: none;\n "])));
139
+ return p.isReadOnly && css(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n pointer-events: none;\n "], ["\n pointer-events: none;\n "])));
109
140
  });
110
141
  export var SpreadsheetField = function (_a) {
111
142
  var validationError = _a.validationError, validationWarning = _a.validationWarning, children = _a.children, isHighlighted = _a.isHighlighted, expandedFieldWidth = _a.expandedFieldWidth, shouldExpandInput = _a.shouldExpandInput, defaultFieldWidth = _a.defaultFieldWidth;
112
143
  var isReadOnly = useSpreadsheetContext().isReadOnly;
113
- return (_jsx(Div, __assign({ dim: "100%" }, { children: _jsx(TooltipProvider, __assign({ tooltip: validationError || validationWarning }, { children: _jsx(Div, __assign({ dim: "100%" }, { children: _jsx(ContentContainer, __assign({ hasError: !!validationError, hasWarning: !!validationWarning, isHighlighted: isHighlighted, expandedFieldWidth: expandedFieldWidth, defaultFieldWidth: defaultFieldWidth, shouldExpandInput: shouldExpandInput, isReadOnly: isReadOnly, className: "input-content" }, { children: children })) })) })) })));
144
+ return (_jsx(Div, __assign({ dim: "100%" }, { children: _jsx(TooltipProvider, __assign({ tooltip: validationError || validationWarning }, { children: _jsx(Div, __assign({ dim: "100%" }, { children: _jsx(ContentContainer, __assign({ hasError: validationError !== null, hasWarning: validationWarning !== null, isHighlighted: isHighlighted, expandedFieldWidth: expandedFieldWidth, defaultFieldWidth: defaultFieldWidth, shouldExpandInput: shouldExpandInput, isReadOnly: isReadOnly, className: "input-content" }, { children: children })) })) })) })));
114
145
  };
115
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7;
146
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8;
@@ -1,14 +1,13 @@
1
1
  var _a;
2
2
  import { FieldTypes } from "../../../../../types";
3
3
  import { BooleanInput } from "./Boolean";
4
- import { EmailInput } from "./EmailInput";
5
4
  import { EnumInput } from "./EnumInput";
6
5
  import { FloatInput } from "./FloatInput";
7
6
  import { IntegerInput } from "./IntegerInput";
8
7
  import { StringInput } from "./StringInput";
9
8
  export var inputTypes = (_a = {},
10
9
  _a[FieldTypes.boolean] = BooleanInput,
11
- _a[FieldTypes.email] = EmailInput,
10
+ _a[FieldTypes.email] = StringInput,
12
11
  _a[FieldTypes.enum] = EnumInput,
13
12
  _a[FieldTypes.float] = FloatInput,
14
13
  _a[FieldTypes.integer] = IntegerInput,
@@ -3,4 +3,3 @@ import { SpreadsheetProps } from "./common/types";
3
3
  declare const _default: React.MemoExoticComponent<({ initialDataSet, initialDataSetUpdatedAt, ...props }: SpreadsheetProps) => JSX.Element>;
4
4
  export default _default;
5
5
  export * from "./SpreadsheetContextProvider";
6
- export * from "./hooks";
@@ -21,99 +21,16 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  return t;
22
22
  };
23
23
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
24
- import { get } from "lodash";
25
- import { DateTime } from "luxon";
26
24
  import React from "react";
27
25
  import { areEqual } from "react-window";
28
- import { useImporterContext } from "../../contexts/ImporterContextProvider";
29
26
  import { SpreadsheetContextProvider } from "./SpreadsheetContextProvider";
30
27
  import SpreadsheetData from "./components/SpreadsheetData";
31
- var useFieldSorting = function () {
32
- var templateHeaders = useImporterContext().templateHeaders;
33
- var getDefaultSortCompareFn = function (sortBy) {
34
- return function (a, b) {
35
- var aField = get(a, sortBy.field);
36
- var bField = get(b, sortBy.field);
37
- var fieldTypes = templateHeaders.reduce(function (acc, header) {
38
- var type = header.column_type;
39
- var pattern = header.pattern || null;
40
- acc[header.internal_key] = { type: type, pattern: pattern };
41
- return acc;
42
- }, {});
43
- var fieldType = fieldTypes[sortBy.field];
44
- var isAEmpty = aField === undefined || aField === null || aField === "";
45
- var isBEmpty = bField === undefined || bField === null || bField === "";
46
- // sort empty values to the end
47
- if (isAEmpty && isBEmpty) {
48
- if (a._meta.rowIndex === b._meta.rowIndex)
49
- return 0;
50
- return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
51
- }
52
- if (isAEmpty)
53
- return 1;
54
- if (isBEmpty)
55
- return -1;
56
- if (fieldType && fieldType.type === "boolean") {
57
- var aString = aField ? "true" : "false";
58
- var bString = bField ? "true" : "false";
59
- if (aString === bString) {
60
- if (a._meta.rowIndex === b._meta.rowIndex)
61
- return 0;
62
- return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
63
- }
64
- if (aString === "true")
65
- return sortBy.direction === "asc" ? -1 : 1;
66
- if (bString === "true")
67
- return sortBy.direction === "asc" ? 1 : -1;
68
- }
69
- else if (fieldType &&
70
- (fieldType.type === "date" ||
71
- fieldType.type === "datetime" ||
72
- fieldType.type === "time")) {
73
- var aDateTime = aField
74
- ? DateTime.fromFormat(aField, fieldType.pattern)
75
- : null;
76
- var bDateTime = bField
77
- ? DateTime.fromFormat(bField, fieldType.pattern)
78
- : null;
79
- // sort invalid date values to the end before empty values
80
- if (aDateTime && !aDateTime.isValid)
81
- return 1;
82
- if (bDateTime && !bDateTime.isValid)
83
- return -1;
84
- if (aDateTime && bDateTime && aDateTime.equals(bDateTime)) {
85
- if (a._meta.rowIndex === b._meta.rowIndex)
86
- return 0;
87
- return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
88
- }
89
- if (sortBy.direction === "asc") {
90
- return (aDateTime === null || aDateTime === void 0 ? void 0 : aDateTime.valueOf()) - (bDateTime === null || bDateTime === void 0 ? void 0 : bDateTime.valueOf());
91
- }
92
- return (bDateTime === null || bDateTime === void 0 ? void 0 : bDateTime.valueOf()) - (aDateTime === null || aDateTime === void 0 ? void 0 : aDateTime.valueOf());
93
- }
94
- else {
95
- if (aField === bField) {
96
- if (a._meta.rowIndex === b._meta.rowIndex)
97
- return 0;
98
- return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
99
- }
100
- if (sortBy.direction === "asc") {
101
- return aField > bField ? 1 : -1;
102
- }
103
- return aField < bField ? 1 : -1;
104
- }
105
- };
106
- };
107
- return { getDefaultSortCompareFn: getDefaultSortCompareFn };
108
- };
109
28
  var SpreadsheetWrapper = function (_a) {
110
29
  var initialDataSet = _a.initialDataSet, initialDataSetUpdatedAt = _a.initialDataSetUpdatedAt, props = __rest(_a, ["initialDataSet", "initialDataSetUpdatedAt"]);
111
30
  return (_jsx(_Fragment, { children: initialDataSet && (_jsx(Spreadsheet, __assign({ initialDataSet: initialDataSet }, props), initialDataSetUpdatedAt || 0)) }));
112
31
  };
113
32
  var Spreadsheet = function (props) {
114
- var getDefaultSortCompareFn = useFieldSorting().getDefaultSortCompareFn;
115
- return (_jsx(SpreadsheetContextProvider, __assign({}, props, { getSortCompareFn: getDefaultSortCompareFn }, { children: _jsx(SpreadsheetData, { className: props.className }) })));
33
+ return (_jsx(SpreadsheetContextProvider, __assign({}, props, { children: _jsx(SpreadsheetData, { className: props.className }) })));
116
34
  };
117
35
  export default React.memo(SpreadsheetWrapper, areEqual);
118
36
  export * from "./SpreadsheetContextProvider";
119
- export * from "./hooks";
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  interface SpreadSheetWrapperProps {
3
2
  canShowCheckboxOnHover?: boolean;
4
3
  shouldShowOnlyCheckbox?: boolean;
@@ -6,5 +5,5 @@ interface SpreadSheetWrapperProps {
6
5
  export declare const SpreadSheetData: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps, never>;
7
6
  export declare const SpreadSheetWrapper: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps & SpreadSheetWrapperProps, never>;
8
7
  export declare const SpreadSheetContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps, never>;
9
- export declare const TableView: import("styled-components").StyledComponent<import("react").MemoExoticComponent<({ data, columns, pageSize, onRowClick, sortBy, isLoading, setSortBy, rowWidthScalingFactor, onSectionRendered, tableHeadersHeight, rowHeight, h, onTableScroll, getItemKey, isDraggable, checkboxColumnWidth, isFiltering, ...props }: import("../../../common/Table/TableView/types").TableViewProps) => JSX.Element>, import("styled-components").DefaultTheme, {}, never>;
8
+ export declare const TableView: import("styled-components").StyledComponent<(props: any) => JSX.Element, import("styled-components").DefaultTheme, {}, never>;
10
9
  export {};
@@ -2,6 +2,18 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
2
2
  if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
3
  return cooked;
4
4
  };
5
+ var __assign = (this && this.__assign) || function () {
6
+ __assign = Object.assign || function(t) {
7
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8
+ s = arguments[i];
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
10
+ t[p] = s[p];
11
+ }
12
+ return t;
13
+ };
14
+ return __assign.apply(this, arguments);
15
+ };
16
+ import { jsx as _jsx } from "react/jsx-runtime";
5
17
  import styled, { css } from "styled-components";
6
18
  import { TableView as TableViewBase, TableViewCellContainer, TableViewRow, } from "../../../common/Table/TableView";
7
19
  import { Div } from "../../../styled/utils";
@@ -12,5 +24,5 @@ export var SpreadSheetWrapper = styled(Div)(templateObject_5 || (templateObject_
12
24
  canShowCheckboxOnHover && css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n &:hover {\n .row-numbers-cell {\n visibility: hidden;\n }\n\n .checkbox-cell {\n visibility: visible;\n }\n }\n "], ["\n &:hover {\n .row-numbers-cell {\n visibility: hidden;\n }\n\n .checkbox-cell {\n visibility: visible;\n }\n }\n "]))));
13
25
  });
14
26
  export var SpreadSheetContainer = styled(Div)(templateObject_6 || (templateObject_6 = __makeTemplateObject([""], [""])));
15
- export var TableView = styled(TableViewBase)(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n width: 100%;\n border: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n background-color: ", ";\n ", " {\n border-bottom: none;\n height: 40px;\n }\n ", " {\n padding: 0 !important;\n box-shadow: inset 0 -1px 0 ", ",\n inset -1px 0 0 ", ";\n &.last-column {\n box-shadow: inset 0 -1px 0 ", ",\n inset 1px 0 0 transparent, inset -1px 0 0 transparent !important;\n }\n }\n"], ["\n width: 100%;\n border: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n background-color: ", ";\n ", " {\n border-bottom: none;\n height: 40px;\n }\n ", " {\n padding: 0 !important;\n box-shadow: inset 0 -1px 0 ", ",\n inset -1px 0 0 ", ";\n &.last-column {\n box-shadow: inset 0 -1px 0 ", ",\n inset 1px 0 0 transparent, inset -1px 0 0 transparent !important;\n }\n }\n"])), function (p) { return p.theme.colors.gray50; }, TableViewRow, TableViewCellContainer, function (p) { return p.theme.colors.gray300; }, function (p) { return p.theme.colors.gray300; }, function (p) { return p.theme.colors.gray300; });
27
+ export var TableView = styled(function (props) { return _jsx(TableViewBase, __assign({}, props)); })(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n width: 100%;\n border: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n background-color: ", ";\n ", " {\n border-bottom: none;\n height: 40px;\n }\n ", " {\n padding: 0 !important;\n box-shadow: inset 0 -1px 0 ", ",\n inset -1px 0 0 ", ";\n &.last-column {\n box-shadow: inset 0 -1px 0 ", ",\n inset 1px 0 0 transparent, inset -1px 0 0 transparent !important;\n }\n }\n"], ["\n width: 100%;\n border: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n overflow: hidden;\n background-color: ", ";\n ", " {\n border-bottom: none;\n height: 40px;\n }\n ", " {\n padding: 0 !important;\n box-shadow: inset 0 -1px 0 ", ",\n inset -1px 0 0 ", ";\n &.last-column {\n box-shadow: inset 0 -1px 0 ", ",\n inset 1px 0 0 transparent, inset -1px 0 0 transparent !important;\n }\n }\n"])), function (p) { return p.theme.colors.gray50; }, TableViewRow, TableViewCellContainer, function (p) { return p.theme.colors.gray300; }, function (p) { return p.theme.colors.gray300; }, function (p) { return p.theme.colors.gray300; });
16
28
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7;
@@ -0,0 +1,5 @@
1
+ import { SortBy } from "../../../common";
2
+ import { Record } from "../../../types";
3
+ export declare const useFieldSorting: () => {
4
+ getDefaultSortCompareFn: (sortBy: SortBy) => (a: Record, b: Record) => number;
5
+ };
@@ -0,0 +1,81 @@
1
+ import { get } from "lodash";
2
+ import { DateTime } from "luxon";
3
+ import { useImporterContext } from "../../contexts/ImporterContextProvider";
4
+ export var useFieldSorting = function () {
5
+ var templateHeaders = useImporterContext().templateHeaders;
6
+ var getDefaultSortCompareFn = function (sortBy) {
7
+ return function (a, b) {
8
+ var aField = get(a, sortBy.field);
9
+ var bField = get(b, sortBy.field);
10
+ var fieldTypes = templateHeaders.reduce(function (acc, header) {
11
+ var type = header.column_type;
12
+ var pattern = header.pattern || null;
13
+ acc[header.internal_key] = { type: type, pattern: pattern };
14
+ return acc;
15
+ }, {});
16
+ var fieldType = fieldTypes[sortBy.field];
17
+ var isAEmpty = aField === undefined || aField === null || aField === "";
18
+ var isBEmpty = bField === undefined || bField === null || bField === "";
19
+ // sort empty values to the end
20
+ if (isAEmpty && isBEmpty) {
21
+ if (a._meta.rowIndex === b._meta.rowIndex)
22
+ return 0;
23
+ return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
24
+ }
25
+ if (isAEmpty)
26
+ return 1;
27
+ if (isBEmpty)
28
+ return -1;
29
+ if (fieldType && fieldType.type === "boolean") {
30
+ var aString = aField ? "true" : "false";
31
+ var bString = bField ? "true" : "false";
32
+ if (aString === bString) {
33
+ if (a._meta.rowIndex === b._meta.rowIndex)
34
+ return 0;
35
+ return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
36
+ }
37
+ if (aString === "true")
38
+ return sortBy.direction === "asc" ? -1 : 1;
39
+ if (bString === "true")
40
+ return sortBy.direction === "asc" ? 1 : -1;
41
+ }
42
+ else if (fieldType &&
43
+ (fieldType.type === "date" ||
44
+ fieldType.type === "datetime" ||
45
+ fieldType.type === "time")) {
46
+ var aDateTime = aField
47
+ ? DateTime.fromFormat(aField, fieldType.pattern)
48
+ : null;
49
+ var bDateTime = bField
50
+ ? DateTime.fromFormat(bField, fieldType.pattern)
51
+ : null;
52
+ // sort invalid date values to the end before empty values
53
+ if (aDateTime && !aDateTime.isValid)
54
+ return 1;
55
+ if (bDateTime && !bDateTime.isValid)
56
+ return -1;
57
+ if (aDateTime && bDateTime && aDateTime.equals(bDateTime)) {
58
+ if (a._meta.rowIndex === b._meta.rowIndex)
59
+ return 0;
60
+ return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
61
+ }
62
+ if (sortBy.direction === "asc") {
63
+ return (aDateTime === null || aDateTime === void 0 ? void 0 : aDateTime.valueOf()) - (bDateTime === null || bDateTime === void 0 ? void 0 : bDateTime.valueOf());
64
+ }
65
+ return (bDateTime === null || bDateTime === void 0 ? void 0 : bDateTime.valueOf()) - (aDateTime === null || aDateTime === void 0 ? void 0 : aDateTime.valueOf());
66
+ }
67
+ else {
68
+ if (aField === bField) {
69
+ if (a._meta.rowIndex === b._meta.rowIndex)
70
+ return 0;
71
+ return a._meta.rowIndex < b._meta.rowIndex ? -1 : 1;
72
+ }
73
+ if (sortBy.direction === "asc") {
74
+ return aField > bField ? 1 : -1;
75
+ }
76
+ return aField < bField ? 1 : -1;
77
+ }
78
+ };
79
+ };
80
+ return { getDefaultSortCompareFn: getDefaultSortCompareFn };
81
+ };
@@ -1,4 +1,5 @@
1
- import { Field, FieldValidation, OnValidateRecord, Record, ValidationErrors } from "../../../../types";
1
+ import { MutableRefObject } from "react";
2
+ import { DuplicateValuesCollection, Field, FieldValidation, OnValidateRecord, Record, ValidationErrors } from "../../../../types";
2
3
  import { FieldValidator } from "./validators";
3
4
  type SelectedValidator = {
4
5
  validator: FieldValidation;
@@ -13,10 +14,11 @@ type ValidateRecordArgs = {
13
14
  validatorsCache?: SelectedFieldValidators[];
14
15
  record: Record;
15
16
  fields: Field[];
16
- data: Record[];
17
+ duplicateValues: MutableRefObject<DuplicateValuesCollection>;
18
+ backendErrors?: ValidationErrors;
17
19
  };
18
20
  export declare function selectValidatorsFor(fields: Field[]): SelectedFieldValidators[];
19
- export declare function validateRecord({ record, fields, data, onValidateRecord, validatorsCache, }: ValidateRecordArgs): Promise<{
21
+ export declare function validateRecord({ record, fields, onValidateRecord, validatorsCache, duplicateValues, backendErrors, }: ValidateRecordArgs): Promise<{
20
22
  errors?: ValidationErrors;
21
23
  warnings?: ValidationErrors;
22
24
  }>;