fuse-importer 0.23.7 → 0.23.9

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 (158) hide show
  1. package/README.md +19 -19
  2. package/lib/esm/Importer/ImporterWithContext.d.ts +7 -0
  3. package/lib/esm/Importer/ImporterWithContext.js +69 -0
  4. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +4 -4
  5. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/tableColumns.js +1 -1
  6. package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +2 -2
  7. package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +2 -4
  8. package/lib/esm/Importer/Matcher/HeaderMatcher/tableColumns.js +3 -3
  9. package/lib/esm/Importer/Matcher/index.d.ts +3 -3
  10. package/lib/esm/Importer/Matcher/index.js +4 -3
  11. package/lib/esm/Importer/PreviewFirstTime.d.ts +2 -0
  12. package/lib/esm/Importer/PreviewFirstTime.js +78 -0
  13. package/lib/esm/Importer/PreviewModeBanner.js +3 -8
  14. package/lib/esm/Importer/Review/AppResponseModal.js +3 -3
  15. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +27 -0
  16. package/lib/esm/Importer/Review/ReviewContextProvider.js +233 -0
  17. package/lib/esm/Importer/Review/ReviewWithContext.d.ts +3 -0
  18. package/lib/esm/Importer/Review/ReviewWithContext.js +23 -0
  19. package/lib/esm/Importer/Review/index.d.ts +3 -3
  20. package/lib/esm/Importer/Review/index.js +4 -91
  21. package/lib/esm/Importer/Stepper/Step.d.ts +7 -0
  22. package/lib/esm/Importer/Stepper/Step.js +19 -0
  23. package/lib/esm/Importer/Stepper/StepIndex.d.ts +6 -0
  24. package/lib/esm/Importer/Stepper/StepIndex.js +27 -0
  25. package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +8 -0
  26. package/lib/esm/Importer/Stepper/StepperSubmitModal.js +22 -0
  27. package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.d.ts +9 -0
  28. package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +23 -0
  29. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +8 -0
  30. package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +33 -0
  31. package/lib/esm/Importer/Stepper/common/icons.d.ts +3 -0
  32. package/lib/esm/Importer/Stepper/common/icons.js +18 -0
  33. package/lib/esm/Importer/{Stepper.d.ts → Stepper/index.d.ts} +2 -2
  34. package/lib/esm/Importer/Stepper/index.js +97 -0
  35. package/lib/esm/Importer/TrialModeBanner.js +3 -4
  36. package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +1 -1
  37. package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +4 -4
  38. package/lib/esm/Importer/Uploader/HeaderButtons.d.ts +2 -0
  39. package/lib/esm/Importer/Uploader/HeaderButtons.js +29 -0
  40. package/lib/esm/Importer/Uploader/HeadersPreview.js +6 -64
  41. package/lib/esm/Importer/Uploader/UploaderContextProvider.d.ts +2 -2
  42. package/lib/esm/Importer/Uploader/index.d.ts +3 -3
  43. package/lib/esm/Importer/Uploader/index.js +6 -6
  44. package/lib/esm/Importer/common/AppLoading.js +2 -2
  45. package/lib/esm/Importer/{Footer.d.ts → common/Footer.d.ts} +0 -0
  46. package/lib/esm/Importer/common/Footer.js +17 -0
  47. package/lib/esm/Importer/{FuseApi.d.ts → common/FuseApi.d.ts} +1 -1
  48. package/lib/esm/Importer/{FuseApi.js → common/FuseApi.js} +2 -2
  49. package/lib/esm/Importer/{GlobalStyle.d.ts → common/GlobalStyle.d.ts} +0 -0
  50. package/lib/esm/Importer/common/GlobalStyle.js +7 -0
  51. package/lib/esm/Importer/{ImporterFonts.d.ts → common/ImporterFonts.d.ts} +0 -0
  52. package/lib/esm/Importer/{ImporterFonts.js → common/ImporterFonts.js} +0 -0
  53. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider.d.ts +13 -26
  54. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider.js +51 -284
  55. package/lib/esm/Importer/common/Spreadsheet/common/index.d.ts +11 -14
  56. package/lib/esm/Importer/common/Spreadsheet/common/index.js +34 -94
  57. package/lib/esm/Importer/common/Spreadsheet/{common → components}/FieldHeader.d.ts +0 -0
  58. package/lib/esm/Importer/common/Spreadsheet/{common → components}/FieldHeader.js +2 -2
  59. package/lib/esm/Importer/common/Spreadsheet/{GlobalStyle.d.ts → components/GlobalStyle.d.ts} +0 -0
  60. package/lib/esm/Importer/common/Spreadsheet/{GlobalStyle.js → components/GlobalStyle.js} +0 -0
  61. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.d.ts +3 -0
  62. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +74 -0
  63. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetRowNumbers.d.ts → components/SpreadsheetRowNumbers.d.ts} +1 -1
  64. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetRowNumbers.js → components/SpreadsheetRowNumbers.js} +4 -4
  65. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +6 -0
  66. package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +19 -0
  67. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/SpeadsheetAutocomplete.d.ts +2 -1
  68. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/SpeadsheetAutocomplete.js +3 -5
  69. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/SpreadsheetInput.d.ts +0 -0
  70. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/SpreadsheetInput.js +0 -0
  71. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/index.d.ts +0 -4
  72. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/index.js +11 -59
  73. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/Boolean.d.ts +1 -1
  74. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/Boolean.js +1 -1
  75. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/EmailInput.d.ts +1 -1
  76. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/EmailInput.js +1 -1
  77. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/EnumInput.d.ts +1 -1
  78. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/EnumInput.js +1 -1
  79. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/FloatInput.d.ts +1 -1
  80. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/FloatInput.js +1 -1
  81. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/IntegerInput.d.ts +1 -1
  82. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/IntegerInput.js +1 -1
  83. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/StringInput.d.ts +1 -1
  84. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/StringInput.js +1 -1
  85. package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.d.ts +13 -0
  86. package/lib/esm/Importer/common/Spreadsheet/{inputs → components/inputs}/index.js +1 -1
  87. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +29 -0
  88. package/lib/esm/Importer/common/Spreadsheet/hooks.js +201 -0
  89. package/lib/esm/Importer/common/Spreadsheet/index.d.ts +10 -9
  90. package/lib/esm/Importer/common/Spreadsheet/index.js +10 -105
  91. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +3 -0
  92. package/lib/esm/Importer/common/Spreadsheet/styles.js +10 -0
  93. package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +20 -0
  94. package/lib/esm/Importer/common/Spreadsheet/validation/index.js +172 -0
  95. package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +6 -0
  96. package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +176 -0
  97. package/lib/esm/Importer/common/icons/index.d.ts +3 -0
  98. package/lib/esm/Importer/common/icons/index.js +3 -0
  99. package/lib/esm/Importer/common/index.js +3 -3
  100. package/lib/esm/Importer/{theme.d.ts → common/theme.d.ts} +19 -8
  101. package/lib/esm/Importer/{theme.js → common/theme.js} +1 -1
  102. package/lib/esm/Importer/common/utils.d.ts +2 -4
  103. package/lib/esm/Importer/common/utils.js +79 -24
  104. package/lib/esm/Importer/{ImporterContextProvider.d.ts → contexts/ImporterContextProvider.d.ts} +18 -51
  105. package/lib/esm/Importer/{ImporterContextProvider.js → contexts/ImporterContextProvider.js} +31 -27
  106. package/lib/esm/Importer/data/index.d.ts +28 -0
  107. package/lib/esm/Importer/data/index.js +134 -0
  108. package/lib/esm/Importer/index.d.ts +6 -11
  109. package/lib/esm/Importer/index.js +6 -60
  110. package/lib/esm/common/Modal.js +5 -2
  111. package/lib/esm/common/Table/TableView/TableRow.d.ts +2 -1
  112. package/lib/esm/common/Table/TableView/TableRow.js +10 -10
  113. package/lib/esm/common/Table/TableView/index.d.ts +2 -1
  114. package/lib/esm/common/Table/TableView/index.js +9 -8
  115. package/lib/esm/common/Table/icons.d.ts +1 -0
  116. package/lib/esm/common/Table/icons.js +2 -1
  117. package/lib/esm/common/Toast.d.ts +1 -1
  118. package/lib/esm/common/Toast.js +1 -1
  119. package/lib/esm/common/TooltipProvider.d.ts +5 -1
  120. package/lib/esm/common/TooltipProvider.js +11 -13
  121. package/lib/esm/common/buttons.d.ts +6 -3
  122. package/lib/esm/common/buttons.js +14 -4
  123. package/lib/esm/common/inputs/Autocomplete.d.ts +2 -1
  124. package/lib/esm/common/inputs/Autocomplete.js +7 -7
  125. package/lib/esm/common/inputs/SelectMenu.d.ts +2 -1
  126. package/lib/esm/common/inputs/SelectMenu.js +8 -8
  127. package/lib/esm/common/inputs/TextInput.d.ts +14 -6
  128. package/lib/esm/common/inputs/TextInput.js +18 -5
  129. package/lib/esm/common/inputs/index.d.ts +1 -0
  130. package/lib/esm/common/inputs/index.js +1 -0
  131. package/lib/esm/common/inputs/tooltip.d.ts +5 -0
  132. package/lib/esm/common/inputs/tooltip.js +38 -0
  133. package/lib/esm/index.d.ts +1 -2
  134. package/lib/esm/index.js +0 -1
  135. package/lib/esm/styled/theme/colorPalette.d.ts +18 -18
  136. package/lib/esm/styled/theme/debugCss.d.ts +1 -0
  137. package/lib/esm/styled/theme/debugCss.js +2 -1
  138. package/lib/esm/styled/theme/dimensionsCss.d.ts +6 -2
  139. package/lib/esm/styled/theme/dimensionsCss.js +3 -3
  140. package/lib/esm/styled/theme/globalCss.d.ts +3 -0
  141. package/lib/esm/styled/theme/globalCss.js +9 -8
  142. package/lib/esm/styled/theme/index.d.ts +37 -9
  143. package/lib/esm/styled/theme/index.js +2 -0
  144. package/lib/esm/styled/theme/textCss.d.ts +1 -0
  145. package/lib/esm/styled/theme/textCss.js +5 -4
  146. package/lib/esm/styled/theme/textStyles.d.ts +1 -0
  147. package/lib/esm/styled/theme/textStyles.js +2 -1
  148. package/lib/esm/styled/themeType.d.ts +0 -2
  149. package/lib/esm/styled/themeType.js +1 -0
  150. package/lib/esm/types.d.ts +64 -13
  151. package/lib/main.js +1 -1
  152. package/package.json +18 -9
  153. package/lib/esm/Importer/Footer.js +0 -19
  154. package/lib/esm/Importer/GlobalStyle.js +0 -7
  155. package/lib/esm/Importer/SpreadsheetReviewContextProvider.d.ts +0 -20
  156. package/lib/esm/Importer/SpreadsheetReviewContextProvider.js +0 -128
  157. package/lib/esm/Importer/Stepper.js +0 -153
  158. package/lib/esm/Importer/common/Spreadsheet/inputs/index.d.ts +0 -13
@@ -9,301 +9,68 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
28
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
- if (ar || !(i in from)) {
51
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
- ar[i] = from[i];
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
53
20
  }
54
- }
55
- return to.concat(ar || Array.prototype.slice.call(from));
21
+ return t;
56
22
  };
57
23
  import { jsx as _jsx } from "react/jsx-runtime";
58
- import { createContext, useContext, useEffect, useState, useMemo, useCallback, useRef, } from "react";
59
- import { formatBatchErrors } from "../../..";
60
- import { getRecordErrors, getRenderedRecordWithErrors, recordIsEmpty, } from "./common";
61
- import { sleep } from "../../../utils";
62
- import { useImporterContext } from "../../ImporterContextProvider";
63
- var MINIMUM_ROW_COUNT = 20;
64
- var getRowId = function (id) { return "r".concat(id); };
65
- export var getBatchErrors = function (records, onValidateRecord) { return __awaiter(void 0, void 0, void 0, function () {
66
- var batchErrors;
67
- return __generator(this, function (_a) {
68
- switch (_a.label) {
69
- case 0: return [4 /*yield*/, Promise.all(records.map(function (record) { return __awaiter(void 0, void 0, void 0, function () {
70
- var _a;
71
- return __generator(this, function (_b) {
72
- switch (_b.label) {
73
- case 0:
74
- _a = {
75
- rowId: record._meta.id
76
- };
77
- return [4 /*yield*/, onValidateRecord(record)];
78
- case 1: return [2 /*return*/, (_a.errors = _b.sent(),
79
- _a)];
80
- }
81
- });
82
- }); }))];
83
- case 1:
84
- batchErrors = _a.sent();
85
- return [2 /*return*/, formatBatchErrors(batchErrors)];
86
- }
87
- });
88
- }); };
24
+ import { get } from "lodash";
25
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
26
+ import { useValidationState } from "./hooks";
89
27
  var SpreadsheetContext = createContext({});
90
- var addMeta = function (d, i) { return (__assign(__assign({}, d), { _meta: { id: getRowId(i), rowIndex: i } })); };
91
28
  export var SpreadsheetContextProvider = function (_a) {
92
- var initialData = _a.initialData, _b = _a.rowWidth, rowWidth = _b === void 0 ? 1 : _b, _c = _a.onValidateRecord, onValidateRecord = _c === void 0 ? null : _c, _d = _a.onValidateBatch, onValidateBatch = _d === void 0 ? null : _d, appResponse = _a.appResponse, fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, highlightFirstRow = _a.highlightFirstRow, submittedData = _a.submittedData, setReviewedData = _a.setReviewedData, children = _a.children;
93
- var mappedInitialData = useMemo(function () { return initialData.map(addMeta); }, [
94
- initialData,
95
- ]);
96
- var _e = useState(mappedInitialData), data = _e[0], setData = _e[1];
97
- var dataRef = useRef(mappedInitialData);
98
- var _f = useState(false), isLoading = _f[0], setIsLoading = _f[1];
99
- var _g = useState(null), sortByFieldErrors = _g[0], setSortByFieldErrors = _g[1];
100
- var _h = useState(true), isScrollingEnabled = _h[0], setIsScrollingEnabled = _h[1];
101
- var _j = useState(null), batchValidationErrors = _j[0], setBatchValidationErrors = _j[1];
102
- var _k = useState(0), batchValidationPercentage = _k[0], setBatchValidationPercentage = _k[1];
103
- var _l = useValidationState({
104
- data: data,
29
+ var initialDataSet = _a.initialDataSet, _b = _a.rowWidth, rowWidth = _b === void 0 ? 1 : _b, fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, highlightFirstRow = _a.highlightFirstRow, children = _a.children, onValidateRecord = _a.onValidateRecord, onDataSetChanged = _a.onDataSetChanged, onValidationStateChanged = _a.onValidationStateChanged;
30
+ var _c = useState(initialDataSet), dataSet = _c[0], setDataSet = _c[1];
31
+ var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
32
+ var _e = useState(null), sortByFieldErrors = _e[0], setSortByFieldErrors = _e[1];
33
+ var sortByCurrentErrorsRef = useRef({});
34
+ var _f = useValidationState({
35
+ dataSet: dataSet,
36
+ initialDataSet: initialDataSet,
105
37
  fields: fields,
106
- batchValidationErrors: batchValidationErrors,
107
- submittedData: submittedData,
108
- }), columnErrorCounts = _l.columnErrorCounts, totalErrors = _l.totalErrors, isValidationComplete = _l.isValidationComplete;
109
- var updateData = useCallback(function (data) {
110
- dataRef.current = data;
111
- setData(data);
112
- }, []);
113
- useEffect(function () {
114
- var batchValidationDelayMs = options.batchValidationDelayMs, _a = options.batchValidationSize, batchValidationSize = _a === void 0 ? 1000 : _a;
115
- var batchSize = Math.min(Math.floor(batchValidationSize), data.length) || data.length;
116
- var batchCount = Math.ceil(data.length / batchSize);
117
- var isCancelled = false;
118
- var addEmptyRows = function () {
119
- var newData = __spreadArray([], data, true);
120
- var emptyRecord = fields.reduce(function (obj, f) {
121
- var _a;
122
- return (__assign(__assign({}, obj), (_a = {}, _a[f.name] = null, _a)));
123
- }, {});
124
- for (var i = newData.length; i < MINIMUM_ROW_COUNT; i++) {
125
- newData.push(__assign(__assign({}, emptyRecord), { _meta: {
126
- id: getRowId(i),
127
- rowIndex: i,
128
- } }));
129
- }
130
- updateData(newData);
131
- };
132
- var validateInBatches = function () { return __awaiter(void 0, void 0, void 0, function () {
133
- var validationErrors, batchIdx, idx, batch, errors, validationPercentage;
134
- return __generator(this, function (_a) {
135
- switch (_a.label) {
136
- case 0:
137
- validationErrors = {};
138
- batchIdx = 0;
139
- _a.label = 1;
140
- case 1:
141
- if (!(batchIdx < batchCount)) return [3 /*break*/, 5];
142
- if (isCancelled)
143
- return [3 /*break*/, 5];
144
- idx = batchIdx * batchSize;
145
- batch = data.slice(idx, idx + batchSize);
146
- return [4 /*yield*/, (onValidateBatch
147
- ? onValidateBatch(batch)
148
- : getBatchErrors(batch, onValidateRecord))];
149
- case 2:
150
- errors = _a.sent();
151
- validationErrors = __assign(__assign({}, validationErrors), errors);
152
- // unblocks main thread for rendering ui
153
- return [4 /*yield*/, sleep(batchValidationDelayMs)];
154
- case 3:
155
- // unblocks main thread for rendering ui
156
- _a.sent();
157
- validationPercentage = (Math.min(idx + batchSize, data.length) / data.length) * 100;
158
- setBatchValidationPercentage(Math.floor(validationPercentage));
159
- _a.label = 4;
160
- case 4:
161
- batchIdx++;
162
- return [3 /*break*/, 1];
163
- case 5:
164
- if (!isCancelled)
165
- setBatchValidationErrors(validationErrors);
166
- return [2 /*return*/];
167
- }
168
- });
169
- }); };
170
- var init = function () { return __awaiter(void 0, void 0, void 0, function () {
171
- return __generator(this, function (_a) {
172
- if (data.length < MINIMUM_ROW_COUNT)
173
- addEmptyRows();
174
- validateInBatches();
175
- return [2 /*return*/];
176
- });
177
- }); };
178
- if (!isReadOnly)
179
- init();
180
- return function () {
181
- isCancelled = true;
182
- };
183
- }, []);
184
- useEffect(function () {
185
- var appValidationErrors = appResponse === null || appResponse === void 0 ? void 0 : appResponse.errors;
186
- if (appValidationErrors) {
187
- updateData(__spreadArray([], data, true).map(function (record) { return (__assign(__assign({}, record), { _meta: __assign(__assign({}, record._meta), { appValidationErrors: appValidationErrors[record._meta.id] }) })); }));
188
- }
189
- }, [appResponse]);
190
- useEffect(function () {
191
- if (!setReviewedData)
192
- return;
193
- if (isValidationComplete)
194
- setReviewedData(data.filter(function (r) { return !recordIsEmpty(r, fields); }));
195
- else
196
- setReviewedData(null);
197
- }, [isValidationComplete, data]);
198
- useEffect(function () {
38
+ options: options,
39
+ isReadOnly: isReadOnly,
40
+ setDataSet: setDataSet,
41
+ setIsLoading: setIsLoading,
42
+ onValidateRecord: onValidateRecord,
43
+ }), errorsRef = _f.errorsRef, updateRecordAndRevalidate = _f.updateRecordAndRevalidate, validationState = __rest(_f, ["errorsRef", "updateRecordAndRevalidate"]);
44
+ // sort data based on errors (errors group on top and not errors group at bottom)
45
+ var data = useMemo(function () {
46
+ var errors = sortByCurrentErrorsRef.current; //Sort errors snapshot
47
+ var dataSetValues = Object.values(dataSet);
199
48
  if (!sortByFieldErrors)
200
- return;
201
- var sortedByFieldErrors = __spreadArray([], data, true).sort(function (a, b) {
202
- var recordHasErrors = function (record) {
203
- return !!getRecordErrors({
204
- record: record,
205
- fields: fields,
206
- batchValidationErrors: batchValidationErrors,
207
- submittedData: submittedData,
208
- })[sortByFieldErrors];
209
- };
210
- var aHasErrors = recordHasErrors(a);
211
- var bHasErrors = recordHasErrors(b);
212
- if (aHasErrors === bHasErrors)
49
+ return dataSetValues;
50
+ return dataSetValues.sort(function (a, b) {
51
+ var aHasErrors = !!get(errors, "".concat(get(a, "_meta.id"), ".").concat(sortByFieldErrors), false);
52
+ var bHasErrors = !!get(errors, "".concat(get(b, "_meta.id"), ".").concat(sortByFieldErrors), false);
53
+ if (aHasErrors === bHasErrors) {
213
54
  return a._meta.rowIndex > b._meta.rowIndex ? 1 : -1;
55
+ }
214
56
  return bHasErrors ? 1 : -1;
215
57
  });
216
- updateData(sortedByFieldErrors);
217
- }, [sortByFieldErrors]);
218
- var validateRenderedRecords = useCallback(function (renderedData) { return __awaiter(void 0, void 0, void 0, function () {
219
- var newData;
220
- return __generator(this, function (_a) {
221
- if (isReadOnly)
222
- return [2 /*return*/];
223
- setIsLoading(true);
224
- newData = __spreadArray([], data, true);
225
- renderedData.forEach(function (record) { return __awaiter(void 0, void 0, void 0, function () {
226
- var renderedRecordWithErrors, _a, rowIndex;
227
- var _b;
228
- return __generator(this, function (_c) {
229
- switch (_c.label) {
230
- case 0:
231
- _a = getRenderedRecordWithErrors;
232
- _b = {
233
- record: record
234
- };
235
- return [4 /*yield*/, onValidateRecord(record)];
236
- case 1:
237
- renderedRecordWithErrors = _a.apply(void 0, [(_b.validationErrors = _c.sent(),
238
- _b)]);
239
- rowIndex = newData.findIndex(function (r) { return r._meta.id === record._meta.id; });
240
- newData[rowIndex] = renderedRecordWithErrors;
241
- return [2 /*return*/];
242
- }
243
- });
244
- }); });
245
- setIsLoading(false);
246
- updateData(newData);
247
- return [2 /*return*/];
248
- });
249
- }); }, [data]);
250
- var value = {
251
- data: data,
252
- dataRef: dataRef,
253
- fields: fields,
254
- isLoading: isLoading,
255
- setIsLoading: setIsLoading,
256
- isScrollingEnabled: isScrollingEnabled,
257
- isValidationComplete: isValidationComplete,
258
- batchValidationErrors: batchValidationErrors,
259
- batchValidationPercentage: batchValidationPercentage,
260
- totalErrors: totalErrors,
261
- columnErrorCounts: columnErrorCounts,
262
- isReadOnly: isReadOnly,
263
- rowWidth: rowWidth,
264
- sortByFieldErrors: sortByFieldErrors,
265
- submittedData: submittedData,
266
- setSortByFieldErrors: setSortByFieldErrors,
267
- setData: updateData,
268
- onValidateRecord: onValidateRecord,
269
- validateRenderedRecords: validateRenderedRecords,
270
- setIsScrollingEnabled: setIsScrollingEnabled,
271
- highlightFirstRow: highlightFirstRow,
272
- };
273
- return (_jsx(SpreadsheetContext.Provider, __assign({ value: value }, { children: children })));
274
- };
275
- var useValidationState = function (_a) {
276
- var data = _a.data, fields = _a.fields, batchValidationErrors = _a.batchValidationErrors, submittedData = _a.submittedData;
277
- var _b = useState({}), columnErrorCounts = _b[0], setColumnErrorCounts = _b[1];
278
- var setIsSpreadsheetValid = useImporterContext().setIsSpreadsheetValid;
58
+ }, [dataSet, sortByFieldErrors]);
279
59
  useEffect(function () {
280
- var updateErrorCounts = function () {
281
- var newColumnErrorCounts = {};
282
- data.forEach(function (record) {
283
- var updateFieldErrorCount = function (recordErrors) {
284
- var fieldsWithErrors = Object.keys(recordErrors).filter(function (f) { return recordErrors[f]; });
285
- fieldsWithErrors.forEach(function (field) {
286
- var currentCount = newColumnErrorCounts[field] || 0;
287
- newColumnErrorCounts[field] = currentCount + 1;
288
- });
289
- };
290
- var recordErrors = getRecordErrors({
291
- record: record,
292
- fields: fields,
293
- batchValidationErrors: batchValidationErrors,
294
- submittedData: submittedData,
295
- });
296
- updateFieldErrorCount(recordErrors);
297
- });
298
- setIsSpreadsheetValid(Object.keys(newColumnErrorCounts).length === 0);
299
- setColumnErrorCounts(newColumnErrorCounts);
300
- };
301
- updateErrorCounts();
302
- }, [data, batchValidationErrors]);
303
- var totalErrors = useMemo(function () {
304
- return Object.keys(columnErrorCounts).reduce(function (total, key) { return total + (columnErrorCounts[key] || 0); }, 0);
60
+ onDataSetChanged && onDataSetChanged(dataSet);
61
+ }, [dataSet]);
62
+ useEffect(function () {
63
+ setDataSet(initialDataSet);
64
+ }, [initialDataSet]);
65
+ useEffect(function () {
66
+ onValidationStateChanged && onValidationStateChanged(validationState);
67
+ }, [validationState, onValidationStateChanged]);
68
+ var handleSortByFieldErrors = useCallback(function (value) {
69
+ //current errors snapshot for use on sort to keep data sorted without changing with each edit or revalidation.
70
+ sortByCurrentErrorsRef.current = __assign({}, errorsRef.current);
71
+ setSortByFieldErrors(value);
305
72
  }, []);
306
- var isValidationComplete = batchValidationErrors && totalErrors === 0;
307
- return { columnErrorCounts: columnErrorCounts, totalErrors: totalErrors, isValidationComplete: isValidationComplete };
73
+ var value = __assign(__assign({ data: data, fields: fields, isLoading: isLoading }, validationState), { isReadOnly: isReadOnly, rowWidth: rowWidth, sortByFieldErrors: sortByFieldErrors, highlightFirstRow: highlightFirstRow, setIsLoading: setIsLoading, setSortByFieldErrors: handleSortByFieldErrors, onValidateRecord: onValidateRecord, updateRecord: updateRecordAndRevalidate });
74
+ return (_jsx(SpreadsheetContext.Provider, __assign({ value: value }, { children: children })));
308
75
  };
309
76
  export var useSpreadsheetContext = function () { return useContext(SpreadsheetContext); };
@@ -1,19 +1,16 @@
1
- import { Field, Record, BatchValidationErrors } from "../../../../types";
1
+ import { Record, Field, FieldTypes } from "../../../../types";
2
2
  export declare const spreadsheetRowHeightPx = 40;
3
3
  export declare const spreadsheetHeaderHeightPx = 40;
4
+ export declare const isNullOrUndefined: (value: any) => boolean;
5
+ export declare const isEmpty: (value: any) => boolean;
6
+ export declare const isEmail: (value: any) => boolean;
7
+ export declare const isUrl: (value: any) => boolean;
4
8
  export declare const isTrue: (value: string) => boolean;
9
+ export declare const isFalse: (value: string) => boolean;
10
+ export declare const isBoolean: (value: string) => boolean;
5
11
  export declare const isInteger: (value: string) => boolean;
6
12
  export declare const isFloat: (value: string) => boolean;
7
- export declare const recordIsEmpty: (record: any, fields: any) => any;
8
- export declare const getRenderedRecordWithErrors: ({ record, validationErrors, }: {
9
- record: any;
10
- validationErrors: any;
11
- }) => Record;
12
- declare type GetRecordErrorsArgs = {
13
- record: Record;
14
- fields: Field[];
15
- batchValidationErrors: BatchValidationErrors;
16
- submittedData: Record[];
17
- };
18
- export declare const getRecordErrors: ({ record, fields, batchValidationErrors, submittedData, }: GetRecordErrorsArgs) => {};
19
- export {};
13
+ export declare const isEven: (value: number) => boolean;
14
+ export declare const ignoreNullOrUndefinedKeyValues: (obj: any) => {};
15
+ export declare const isRecordEmpty: (record: Record, fields: Field[]) => boolean;
16
+ export declare const parseValue: (fieldType: FieldTypes, value: any, enumSet?: any) => any;
@@ -1,80 +1,42 @@
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
- var _a;
13
- import { FieldTypes, } from "../../../../types";
14
- import { DateTime } from "luxon";
1
+ import { FieldTypes } from "../../../../types";
15
2
  export var spreadsheetRowHeightPx = 40;
16
3
  export var spreadsheetHeaderHeightPx = 40;
17
- var isEmpty = function (value) {
4
+ export var isNullOrUndefined = function (value) {
5
+ return value === null || value === undefined;
6
+ };
7
+ export var isEmpty = function (value) {
18
8
  return (value === undefined ||
19
9
  value === null ||
20
10
  (typeof value === "object" && Object.keys(value).length === 0) ||
21
11
  (typeof value === "string" && value.trim().length === 0));
22
12
  };
23
- var isEmail = function (value) {
13
+ export var isEmail = function (value) {
24
14
  var emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
25
15
  return emailRegex.test(value);
26
16
  };
27
- var isUrl = function (value) {
17
+ export var isUrl = function (value) {
28
18
  var urlRegex = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/g;
29
19
  return urlRegex.test(value);
30
20
  };
31
21
  export var isTrue = function (value) {
32
- var _value = (value || "").toString().toLowerCase();
22
+ var _a;
23
+ var _value = (_a = value === null || value === void 0 ? void 0 : value.toString()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
33
24
  return ["true", "yes", "1", "y", "on", "t"].includes(_value);
34
25
  };
26
+ export var isFalse = function (value) {
27
+ var _a;
28
+ var _value = (_a = value === null || value === void 0 ? void 0 : value.toString()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
29
+ return ["false", "no", "0", "n", "off", "f"].includes(_value);
30
+ };
31
+ export var isBoolean = function (value) {
32
+ return isTrue(value) || isFalse(value);
33
+ };
35
34
  export var isInteger = function (value) { return /^-?[0-9]+$/.test(value + ""); };
36
35
  export var isFloat = function (value) {
37
36
  return /^-?[0-9]+(?:\.[0-9]+)?$/.test(value + "");
38
37
  };
39
- export var recordIsEmpty = function (record, fields) {
40
- return fields.reduce(function (isEmptyRecord, f) { return isEmptyRecord && isEmpty(record[f.name]); }, true);
41
- };
42
- export var getRenderedRecordWithErrors = function (_a) {
43
- var record = _a.record, validationErrors = _a.validationErrors;
44
- return (__assign(__assign({}, record), { _meta: __assign(__assign({}, (record._meta || {})), { localValidationErrors: validationErrors, wasSeen: true }) }));
45
- };
46
- var validateDatePattern = function (field, fieldValue) {
47
- var date = DateTime.fromFormat(fieldValue, field.pattern);
48
- if (!date.isValid) {
49
- return "".concat(field.label, " must match the pattern ").concat(field.pattern);
50
- }
51
- };
52
- var validations = (_a = {},
53
- _a[FieldTypes.email] = function (field, fieldValue) {
54
- if (!isEmail(fieldValue)) {
55
- return "".concat(field.label, " is not a valid email");
56
- }
57
- },
58
- _a[FieldTypes.url] = function (field, fieldValue) {
59
- if (!isUrl(fieldValue)) {
60
- return "".concat(field.label, " is not a valid url");
61
- }
62
- },
63
- _a[FieldTypes.integer] = function (field, fieldValue) {
64
- if (!isInteger(fieldValue)) {
65
- return "".concat(field.label, " is not a valid integer");
66
- }
67
- },
68
- _a[FieldTypes.float] = function (field, fieldValue) {
69
- if (!isFloat(fieldValue)) {
70
- return "".concat(field.label, " is not a valid float");
71
- }
72
- },
73
- _a[FieldTypes.date] = validateDatePattern,
74
- _a[FieldTypes.time] = validateDatePattern,
75
- _a[FieldTypes.datetime] = validateDatePattern,
76
- _a);
77
- var ignoreNullOrUndefinedKeyValues = function (obj) {
38
+ export var isEven = function (value) { return value % 2 === 0; };
39
+ export var ignoreNullOrUndefinedKeyValues = function (obj) {
78
40
  var result = {};
79
41
  Object.keys(obj || {})
80
42
  .filter(function (key) { return obj[key] !== null && obj[key] !== undefined; })
@@ -83,41 +45,19 @@ var ignoreNullOrUndefinedKeyValues = function (obj) {
83
45
  });
84
46
  return result;
85
47
  };
86
- export var getRecordErrors = function (_a) {
87
- var record = _a.record, fields = _a.fields, batchValidationErrors = _a.batchValidationErrors, submittedData = _a.submittedData;
88
- var submittedRecord = submittedData === null || submittedData === void 0 ? void 0 : submittedData.find(function (r) { return r._meta.id === record._meta.id; });
89
- var recordHasData = !recordIsEmpty(record, fields);
90
- if (recordHasData) {
91
- var recordTemplateValidationErrors = fields.reduce(function (errors, field) {
92
- var newErrors = __assign({}, errors);
93
- var fieldValue = record[field.name];
94
- if (isEmpty(fieldValue) && field.isRequired) {
95
- newErrors[field.name] = "".concat(field.label, " is required");
96
- }
97
- else if (!isEmpty(fieldValue) && validations[field.type]) {
98
- newErrors[field.name] = validations[field.type](field, fieldValue);
99
- }
100
- return newErrors;
101
- }, {});
102
- var recordValidationErrors = (function () {
103
- var _a;
104
- if ((_a = record === null || record === void 0 ? void 0 : record._meta) === null || _a === void 0 ? void 0 : _a.wasSeen)
105
- return record._meta.localValidationErrors;
106
- return batchValidationErrors
107
- ? batchValidationErrors[record._meta.id]
108
- : {};
109
- })();
110
- var appValidationErrors = {};
111
- if (record._meta.appValidationErrors) {
112
- var appValidationErrorFields = Object.keys(record._meta.appValidationErrors);
113
- appValidationErrors = appValidationErrorFields.reduce(function (errors, field) {
114
- var newErrors = __assign({}, errors);
115
- if (record[field] === submittedRecord[field])
116
- newErrors[field] = record._meta.appValidationErrors[field];
117
- return newErrors;
118
- }, {});
119
- }
120
- return __assign(__assign(__assign({}, ignoreNullOrUndefinedKeyValues(recordValidationErrors)), ignoreNullOrUndefinedKeyValues(recordTemplateValidationErrors)), ignoreNullOrUndefinedKeyValues(appValidationErrors));
121
- }
122
- return {};
48
+ export var isRecordEmpty = function (record, fields) {
49
+ return fields.reduce(function (isEmptyRecord, f) { return isEmptyRecord && isEmpty(record[f.name]); }, true);
50
+ };
51
+ export var parseValue = function (fieldType, value, enumSet) {
52
+ if (isEmpty(value))
53
+ return value;
54
+ if (fieldType === FieldTypes.float)
55
+ return isFloat(value) ? parseFloat(value) : value;
56
+ if (fieldType === FieldTypes.integer)
57
+ return isInteger(value) ? parseInt(value) : value;
58
+ if (fieldType === FieldTypes.boolean)
59
+ return isTrue(value) ? true : false;
60
+ if (fieldType === FieldTypes.enum && enumSet)
61
+ return enumSet[value];
62
+ return value;
123
63
  };
@@ -14,10 +14,10 @@ var __assign = (this && this.__assign) || function () {
14
14
  return __assign.apply(this, arguments);
15
15
  };
16
16
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
17
+ import styled, { css } from "styled-components";
17
18
  import { TooltipProvider } from "../../../../common";
18
19
  import { Div } from "../../../../styled/utils";
19
20
  import { useSpreadsheetContext } from "../SpreadsheetContextProvider";
20
- import styled, { css } from "styled-components";
21
21
  var ErrorCount = styled(Div)(function (_a) {
22
22
  var _b = _a.theme, colors = _b.colors, c = _b.css;
23
23
  return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n color: ", ";\n background: ", ";\n border: solid 1px ", ";\n padding: 4px 7px;\n border-radius: 56px;\n min-width: 24px;\n ", ";\n "], ["\n color: ", ";\n background: ", ";\n border: solid 1px ", ";\n padding: 4px 7px;\n border-radius: 56px;\n min-width: 24px;\n ", ";\n "])), colors.error, colors.red100, colors.error, c.centered);
@@ -26,6 +26,6 @@ export var FieldHeader = function (_a) {
26
26
  var field = _a.field, sortByFieldErrors = _a.sortByFieldErrors;
27
27
  var columnErrorCounts = useSpreadsheetContext().columnErrorCounts;
28
28
  var fieldErrorCount = columnErrorCounts[field.name];
29
- return (_jsxs(Div, __assign({ p: "0 16px", spaceBetween: true, w100: true, alignCenter: true }, { children: [_jsxs(Div, __assign({ truncateText: true }, { children: [field.label, field.isRequired && "*"] })), fieldErrorCount && (_jsx(TooltipProvider, __assign({ mr: 3, w: 35, tooltip: "Sort by ".concat(field.label, " errors") }, { children: _jsx(ErrorCount, __assign({ onClick: function () { return sortByFieldErrors(field.name); } }, { children: _jsx(Div, __assign({ centered: true }, { children: _jsx(Div, __assign({ w: 35, textAlignCenter: true, label3: true, truncateText: true }, { children: fieldErrorCount })) })) })) })))] })));
29
+ return (_jsxs(Div, __assign({ "data-test-id": "column-header-".concat(field.name), p: "0 16px", spaceBetween: true, w100: true, alignCenter: true }, { children: [_jsxs(Div, __assign({ truncateText: true }, { children: [field.label, field.isRequired && "*"] })), fieldErrorCount && (_jsx(TooltipProvider, __assign({ mr: 3, w: 35, tooltip: "Sort by ".concat(field.label, " errors") }, { children: _jsx(ErrorCount, __assign({ "data-test-id": "column-errors-count-".concat(field.name), onClick: function () { return sortByFieldErrors(field.name); } }, { children: _jsx(Div, __assign({ centered: true }, { children: _jsx(Div, __assign({ w: 35, textAlignCenter: true, label3: true, truncateText: true }, { children: fieldErrorCount })) })) })) })))] })));
30
30
  };
31
31
  var templateObject_1;
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ declare const _default: React.MemoExoticComponent<() => JSX.Element>;
3
+ export default _default;