fuse-importer 0.23.8 → 0.24.0

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 (152) 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 -3
  8. package/lib/esm/Importer/Matcher/HeaderMatcher/tableColumns.js +1 -1
  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 +80 -0
  13. package/lib/esm/Importer/PreviewModeBanner.js +3 -6
  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 +234 -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 -92
  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 -286
  55. package/lib/esm/Importer/common/Spreadsheet/common/index.d.ts +8 -15
  56. package/lib/esm/Importer/common/Spreadsheet/common/index.js +31 -101
  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 +1 -1
  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 +1 -1
  68. package/lib/esm/Importer/common/Spreadsheet/{common → components}/fields/SpeadsheetAutocomplete.js +2 -4
  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 -64
  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} +14 -4
  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 -53
  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 +10 -10
  109. package/lib/esm/Importer/index.js +12 -60
  110. package/lib/esm/common/Modal.js +5 -2
  111. package/lib/esm/common/Table/TableView/TableHeaders.js +1 -1
  112. package/lib/esm/common/Table/TableView/TableRow.d.ts +2 -1
  113. package/lib/esm/common/Table/TableView/TableRow.js +10 -10
  114. package/lib/esm/common/Table/TableView/index.d.ts +2 -1
  115. package/lib/esm/common/Table/TableView/index.js +9 -8
  116. package/lib/esm/common/Table/icons.d.ts +1 -0
  117. package/lib/esm/common/Table/icons.js +2 -1
  118. package/lib/esm/common/TooltipProvider.d.ts +5 -1
  119. package/lib/esm/common/TooltipProvider.js +11 -13
  120. package/lib/esm/common/buttons.d.ts +6 -3
  121. package/lib/esm/common/buttons.js +11 -5
  122. package/lib/esm/common/inputs/Autocomplete.d.ts +2 -1
  123. package/lib/esm/common/inputs/Autocomplete.js +7 -6
  124. package/lib/esm/common/inputs/SelectMenu.d.ts +2 -1
  125. package/lib/esm/common/inputs/SelectMenu.js +8 -8
  126. package/lib/esm/common/inputs/TextInput.d.ts +10 -6
  127. package/lib/esm/common/inputs/TextInput.js +12 -3
  128. package/lib/esm/common/inputs/index.d.ts +1 -0
  129. package/lib/esm/common/inputs/index.js +1 -0
  130. package/lib/esm/common/inputs/tooltip.d.ts +5 -0
  131. package/lib/esm/common/inputs/tooltip.js +38 -0
  132. package/lib/esm/index.d.ts +1 -2
  133. package/lib/esm/index.js +0 -1
  134. package/lib/esm/styled/theme/colorPalette.d.ts +18 -18
  135. package/lib/esm/styled/theme/debugCss.d.ts +1 -0
  136. package/lib/esm/styled/theme/debugCss.js +2 -1
  137. package/lib/esm/styled/theme/dimensionsCss.d.ts +6 -2
  138. package/lib/esm/styled/theme/dimensionsCss.js +3 -3
  139. package/lib/esm/styled/theme/globalCss.d.ts +3 -0
  140. package/lib/esm/styled/theme/globalCss.js +9 -8
  141. package/lib/esm/styled/theme/index.d.ts +24 -5
  142. package/lib/esm/styled/theme/textStyles.d.ts +1 -0
  143. package/lib/esm/styled/theme/textStyles.js +2 -1
  144. package/lib/esm/types.d.ts +64 -14
  145. package/lib/main.js +1 -1
  146. package/package.json +18 -8
  147. package/lib/esm/Importer/Footer.js +0 -19
  148. package/lib/esm/Importer/GlobalStyle.js +0 -7
  149. package/lib/esm/Importer/SpreadsheetReviewContextProvider.d.ts +0 -20
  150. package/lib/esm/Importer/SpreadsheetReviewContextProvider.js +0 -128
  151. package/lib/esm/Importer/Stepper.js +0 -153
  152. package/lib/esm/Importer/common/Spreadsheet/inputs/index.d.ts +0 -13
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { DivCSSProps } from "../../../styled/utils";
2
+ import { DivCSSProps } from "../../../../styled/utils";
3
3
  declare type Props = {
4
4
  height?: number;
5
5
  spreadsheetHasXScroll?: boolean;
@@ -27,10 +27,10 @@ var __rest = (this && this.__rest) || function (s, e) {
27
27
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
28
  import { FixedSizeGrid as Grid } from "react-window";
29
29
  import styled, { css } from "styled-components";
30
- import { Div } from "../../../styled/utils";
31
- import { spreadsheetRowHeightPx } from "./common";
32
- import { spreadsheetHeaderHeightPx } from "./common/index";
33
- import { useSpreadsheetContext } from "./SpreadsheetContextProvider";
30
+ import { Div } from "../../../../styled/utils";
31
+ import { spreadsheetRowHeightPx } from "../common";
32
+ import { spreadsheetHeaderHeightPx } from "../common/index";
33
+ import { useSpreadsheetContext } from "../SpreadsheetContextProvider";
34
34
  var SPREADSHEET_ROW_NUMBERS_WIDTH = 75;
35
35
  var gridStyles = {
36
36
  outline: "none",
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ declare const ValidationProgress: ({ totalErrors, validationPercentage, }: {
3
+ totalErrors: number;
4
+ validationPercentage: number;
5
+ }) => JSX.Element;
6
+ export default ValidationProgress;
@@ -0,0 +1,19 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { colors } from "../../../../styled/theme/colorPalette";
14
+ import { Div } from "../../../../styled/utils";
15
+ var ValidationProgress = function (_a) {
16
+ var totalErrors = _a.totalErrors, validationPercentage = _a.validationPercentage;
17
+ return (_jsxs(Div, __assign({ body1: true, dflex: true, mb: 22 }, { children: ["Calculating Data...", _jsxs(Div, __assign({ bold: true, ml: 5 }, { children: [validationPercentage, "%"] })), _jsxs(Div, __assign({ bold: true, c: colors.error, ml: 5 }, { children: ["(", totalErrors, " errors)"] }))] })));
18
+ };
19
+ export default ValidationProgress;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { Option } from "../../../../../common/inputs/Autocomplete";
3
- import { Record, FieldTypes } from "../../../../../types";
3
+ import { FieldTypes, Record } from "../../../../../types";
4
4
  export declare type AutoCompleteOption = Option;
5
5
  export declare type SpreadsheetAutocompleteProps = {
6
6
  name: string;
@@ -16,11 +16,10 @@ var __assign = (this && this.__assign) || function () {
16
16
  import { jsx as _jsx } from "react/jsx-runtime";
17
17
  import styled, { css } from "styled-components";
18
18
  import { SpreadsheetField, useSpreadsheetField } from ".";
19
- import { spreadsheetRowHeightPx } from "..";
20
19
  import { Autocomplete as AutocompleteBase, } from "../../../../../common/inputs/Autocomplete";
21
20
  import { SelectMenuDiv, SelectMenuScrollArea, } from "../../../../../common/inputs/SelectMenu";
22
21
  import { HTMLInput, TextInputIcon, } from "../../../../../common/inputs/TextInput";
23
- import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
22
+ import { spreadsheetRowHeightPx } from "../../common";
24
23
  var Autocomplete = styled(AutocompleteBase)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n ", " {\n border: none;\n border-radius: 0;\n margin: 0;\n background: transparent;\n height: ", "px;\n padding: 0 12px;\n\n ", "\n\n ::placeholder {\n ", "\n }\n :focus {\n border: none;\n box-shadow: none;\n }\n }\n ", " {\n right: 6px;\n }\n ", " {\n border-radius: 7px;\n }\n ", " {\n padding: 4px;\n }\n"], ["\n ", " {\n border: none;\n border-radius: 0;\n margin: 0;\n background: transparent;\n height: ", "px;\n padding: 0 12px;\n\n ", "\n\n ::placeholder {\n ", "\n }\n :focus {\n border: none;\n box-shadow: none;\n }\n }\n ", " {\n right: 6px;\n }\n ", " {\n border-radius: 7px;\n }\n ", " {\n padding: 4px;\n }\n"])), HTMLInput, spreadsheetRowHeightPx - 5, function (p) {
25
24
  return p.hasError && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n color: ", ";\n "], ["\n color: ", ";\n "])), function (p) { return p.theme.colors.error; });
26
25
  }, function (p) {
@@ -29,8 +28,7 @@ var Autocomplete = styled(AutocompleteBase)(templateObject_3 || (templateObject_
29
28
  export var SpreadsheetAutocomplete = function (props) {
30
29
  var name = props.name, record = props.record, options = props.options, fieldType = props.fieldType, _a = props.isInputDisabled, isInputDisabled = _a === void 0 ? false : _a, id = props.id;
31
30
  var _b = useSpreadsheetField(name, record, fieldType), value = _b.value, setValue = _b.setValue, validationError = _b.validationError;
32
- var setIsScrollingEnabled = useSpreadsheetContext().setIsScrollingEnabled;
33
- return (_jsx(SpreadsheetField, __assign({ validationError: validationError }, { children: _jsx(Autocomplete, { placement: "bottom", isInputDisabled: isInputDisabled, hasError: !!validationError, onToggle: function (isOpen) { return setIsScrollingEnabled(!isOpen); }, options: options, value: value, icon: chevronDownIcon, onChange: function (v) { return setValue(v); }, id: id }) })));
31
+ return (_jsx(SpreadsheetField, __assign({ validationError: validationError }, { children: _jsx(Autocomplete, { placement: "bottom", isInputDisabled: isInputDisabled, hasError: !!validationError, options: options, value: value, icon: chevronDownIcon, onChange: function (v) { return setValue(v); }, id: id }) })));
34
32
  };
35
33
  var chevronDownIcon = (_jsx("svg", __assign({ width: "10", height: "6", viewBox: "0 0 10 6", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: _jsx("path", { d: "M8.46289 1L4.98131 4.48159L1.49972 1", stroke: "black", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })));
36
34
  var templateObject_1, templateObject_2, templateObject_3;
@@ -1,9 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { FieldTypes, Record } from "../../../../../types";
3
- export declare const parseValue: (fieldType: FieldTypes, value: any) => any;
4
- export declare const useValidationError: (fieldName: string, record: Record) => {
5
- validationError: any;
6
- };
7
3
  export declare const useSpreadsheetField: (name: any, record: Record, fieldType: FieldTypes) => {
8
4
  value: any;
9
5
  setValue: (value: any) => void;
@@ -49,78 +49,25 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
49
49
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
50
50
  }
51
51
  };
52
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
53
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
54
- if (ar || !(i in from)) {
55
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
56
- ar[i] = from[i];
57
- }
58
- }
59
- return to.concat(ar || Array.prototype.slice.call(from));
60
- };
61
52
  import { jsx as _jsx } from "react/jsx-runtime";
62
- import { useState, useCallback } from "react";
63
- import { debounce } from "lodash";
53
+ import { debounce, get } from "lodash";
54
+ import { useCallback, useState } from "react";
64
55
  import styled, { css } from "styled-components";
65
- import { getRecordErrors, getRenderedRecordWithErrors, isFloat, isInteger, isTrue, isEmpty, } from "..";
66
56
  import { TooltipProvider } from "../../../../../common/TooltipProvider";
67
57
  import { Div } from "../../../../../styled/utils";
68
- import { FieldTypes } from "../../../../../types";
69
- import { useSpreadsheetReviewContext } from "../../../../SpreadsheetReviewContextProvider";
58
+ import { parseValue } from "../../common";
70
59
  import { useSpreadsheetContext } from "../../SpreadsheetContextProvider";
71
- export var parseValue = function (fieldType, value) {
72
- if (isEmpty(value))
73
- return value;
74
- if (fieldType === FieldTypes.float)
75
- return isFloat(value) ? parseFloat(value) : value;
76
- if (fieldType === FieldTypes.integer)
77
- return isInteger(value) ? parseInt(value) : value;
78
- if (fieldType === FieldTypes.boolean)
79
- return isTrue(value) ? true : false;
80
- return value;
81
- };
82
- export var useValidationError = function (fieldName, record) {
83
- var isSubmitting = useSpreadsheetReviewContext().isSubmitting;
84
- var _a = useSpreadsheetContext(), fields = _a.fields, submittedData = _a.submittedData, batchValidationErrors = _a.batchValidationErrors, data = _a.data;
85
- var validationError = null;
86
- if (!isSubmitting) {
87
- var recordErrors = getRecordErrors({
88
- record: record,
89
- fields: fields,
90
- submittedData: submittedData,
91
- batchValidationErrors: batchValidationErrors,
92
- data: data,
93
- });
94
- validationError = recordErrors[fieldName];
95
- }
96
- return { validationError: validationError };
97
- };
98
60
  export var useSpreadsheetField = function (name, record, fieldType) {
99
- var _a = useSpreadsheetContext(), dataRef = _a.dataRef, setData = _a.setData, onValidateRecord = _a.onValidateRecord;
61
+ var _a = useSpreadsheetContext(), updateRecord = _a.updateRecord, errors = _a.errors;
100
62
  var _b = useState(record[name]), value = _b[0], setValue = _b[1];
101
- var validationError = useValidationError(name, record).validationError;
63
+ var validationError = get(errors, "".concat(record._meta.id, ".").concat(name), null);
102
64
  var updateData = useCallback(debounce(function (value) { return __awaiter(void 0, void 0, void 0, function () {
103
- var newData, newRecord, rowIndex, _a, _b, _c;
104
- var _d, _e;
105
- return __generator(this, function (_f) {
106
- switch (_f.label) {
107
- case 0:
108
- newData = __spreadArray([], dataRef.current, true);
109
- newRecord = __assign(__assign({}, record), (_d = {}, _d[name] = parseValue(fieldType, value), _d));
110
- rowIndex = newData.findIndex(function (r) { return r._meta.id === record._meta.id; });
111
- _a = newData;
112
- _b = rowIndex;
113
- _c = getRenderedRecordWithErrors;
114
- _e = {
115
- record: newRecord
116
- };
117
- return [4 /*yield*/, onValidateRecord(newRecord)];
118
- case 1:
119
- _a[_b] = _c.apply(void 0, [(_e.validationErrors = _f.sent(),
120
- _e)]);
121
- setData(newData);
122
- return [2 /*return*/];
123
- }
65
+ var newRecord;
66
+ var _a;
67
+ return __generator(this, function (_b) {
68
+ newRecord = __assign(__assign({}, record), (_a = {}, _a[name] = parseValue(fieldType, value), _a));
69
+ updateRecord(newRecord);
70
+ return [2 /*return*/];
124
71
  });
125
72
  }); }, 300), [record]);
126
73
  var updateValue = useCallback(function (value) {
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import { SpreadsheetAutocompleteProps } from "../common/fields/SpeadsheetAutocomplete";
2
+ import { SpreadsheetAutocompleteProps } from "../fields/SpeadsheetAutocomplete";
3
3
  export declare const BooleanInput: React.FC<SpreadsheetAutocompleteProps>;
@@ -10,7 +10,7 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { SpreadsheetAutocomplete, } from "../common/fields/SpeadsheetAutocomplete";
13
+ import { SpreadsheetAutocomplete, } from "../fields/SpeadsheetAutocomplete";
14
14
  var booleanOptions = [
15
15
  { label: "True", value: true },
16
16
  { label: "False", value: false },
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import { SpreadsheetTextInputArgs } from "../common/fields/SpreadsheetInput";
2
+ import { SpreadsheetTextInputArgs } from "../fields/SpreadsheetInput";
3
3
  export declare const EmailInput: React.FC<SpreadsheetTextInputArgs>;
@@ -10,5 +10,5 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { SpreadsheetInput, } from "../common/fields/SpreadsheetInput";
13
+ import { SpreadsheetInput, } from "../fields/SpreadsheetInput";
14
14
  export var EmailInput = function (props) { return (_jsx(SpreadsheetInput, __assign({}, props, { type: "email" }))); };
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { SpreadsheetAutocompleteProps } from "../common/fields/SpeadsheetAutocomplete";
2
+ import { SpreadsheetAutocompleteProps } from "../fields/SpeadsheetAutocomplete";
3
3
  export declare type EnumInputProps = {
4
4
  options: any;
5
5
  } & SpreadsheetAutocompleteProps;
@@ -22,7 +22,7 @@ var __rest = (this && this.__rest) || function (s, e) {
22
22
  };
23
23
  import { jsx as _jsx } from "react/jsx-runtime";
24
24
  import { useMemo } from "react";
25
- import { SpreadsheetAutocomplete, } from "../common/fields/SpeadsheetAutocomplete";
25
+ import { SpreadsheetAutocomplete, } from "../fields/SpeadsheetAutocomplete";
26
26
  export var EnumInput = function (_a) {
27
27
  var options = _a.options, props = __rest(_a, ["options"]);
28
28
  var mapped = useMemo(function () { return options === null || options === void 0 ? void 0 : options.map(function (o) { return ({ label: o, value: o }); }); }, [options]);
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import { SpreadsheetTextInputArgs } from "../common/fields/SpreadsheetInput";
2
+ import { SpreadsheetTextInputArgs } from "../fields/SpreadsheetInput";
3
3
  export declare const FloatInput: React.FC<SpreadsheetTextInputArgs>;
@@ -10,7 +10,7 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { SpreadsheetInput, } from "../common/fields/SpreadsheetInput";
13
+ import { SpreadsheetInput, } from "../fields/SpreadsheetInput";
14
14
  export var FloatInput = function (props) {
15
15
  return _jsx(SpreadsheetInput, __assign({}, props, { type: "text" }));
16
16
  };
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import { SpreadsheetTextInputArgs } from "../common/fields/SpreadsheetInput";
2
+ import { SpreadsheetTextInputArgs } from "../fields/SpreadsheetInput";
3
3
  export declare const IntegerInput: React.FC<SpreadsheetTextInputArgs>;
@@ -10,7 +10,7 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { SpreadsheetInput, } from "../common/fields/SpreadsheetInput";
13
+ import { SpreadsheetInput, } from "../fields/SpreadsheetInput";
14
14
  export var IntegerInput = function (props) {
15
15
  return _jsx(SpreadsheetInput, __assign({}, props, { type: "text", step: "1" }));
16
16
  };
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import { SpreadsheetTextInputArgs } from "../common/fields/SpreadsheetInput";
2
+ import { SpreadsheetTextInputArgs } from "../fields/SpreadsheetInput";
3
3
  export declare const StringInput: React.FC<SpreadsheetTextInputArgs>;
@@ -10,5 +10,5 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
- import { SpreadsheetInput, } from "../common/fields/SpreadsheetInput";
13
+ import { SpreadsheetInput, } from "../fields/SpreadsheetInput";
14
14
  export var StringInput = function (props) { return (_jsx(SpreadsheetInput, __assign({}, props, { type: "text" }))); };
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ export declare const inputTypes: {
3
+ boolean: import("react").FC<import("../fields/SpeadsheetAutocomplete").SpreadsheetAutocompleteProps>;
4
+ email: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
5
+ enum: import("react").FC<import("./EnumInput").EnumInputProps>;
6
+ float: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
7
+ integer: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
8
+ string: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
9
+ url: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
10
+ date: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
11
+ datetime: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
12
+ time: import("react").FC<import("../fields/SpreadsheetInput").SpreadsheetTextInputArgs>;
13
+ };
@@ -1,5 +1,5 @@
1
1
  var _a;
2
- import { FieldTypes } from "../../../../types";
2
+ import { FieldTypes } from "../../../../../types";
3
3
  import { BooleanInput } from "./Boolean";
4
4
  import { EmailInput } from "./EmailInput";
5
5
  import { EnumInput } from "./EnumInput";
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { SpreadsheetOptions } from "../../..";
3
+ import { BatchValidationErrors, Field, OnValidateRecord, Record, RecordDataSet } from "../../../types";
4
+ declare type UseValidationStateArgs = {
5
+ onValidateRecord?: OnValidateRecord;
6
+ setDataSet: React.Dispatch<React.SetStateAction<RecordDataSet>>;
7
+ setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
8
+ initialDataSet: RecordDataSet;
9
+ dataSet: RecordDataSet;
10
+ fields: Field[];
11
+ options: SpreadsheetOptions;
12
+ isReadOnly: boolean;
13
+ };
14
+ export declare type ValidationState = {
15
+ isValid: boolean;
16
+ isValidationCompleted: boolean;
17
+ validationPercentage: number;
18
+ errors: BatchValidationErrors;
19
+ totalErrors: number;
20
+ columnErrorCounts: {
21
+ [column: string]: number;
22
+ };
23
+ };
24
+ declare type UseValidationStateReturnValue = ValidationState & {
25
+ updateRecordAndRevalidate: (record: Record) => Promise<void>;
26
+ errorsRef: React.MutableRefObject<BatchValidationErrors>;
27
+ };
28
+ export declare const useValidationState: ({ initialDataSet, dataSet, fields, options, isReadOnly, setDataSet, setIsLoading, onValidateRecord, }: UseValidationStateArgs) => UseValidationStateReturnValue;
29
+ export {};
@@ -0,0 +1,201 @@
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 __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
+ import { omit, set } from "lodash";
49
+ import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
50
+ import { sleep } from "../../..";
51
+ import { selectValidatorsFor, validateRecord } from "./validation";
52
+ var checkIfHasErrors = function (errors) {
53
+ return Object.keys(errors).length > 0;
54
+ };
55
+ export var useValidationState = function (_a) {
56
+ var initialDataSet = _a.initialDataSet, //Initial Data Set, used to run the initial validation
57
+ dataSet = _a.dataSet, //Current Updated Data Set
58
+ fields = _a.fields, options = _a.options, isReadOnly = _a.isReadOnly, setDataSet = _a.setDataSet, setIsLoading = _a.setIsLoading, onValidateRecord = _a.onValidateRecord;
59
+ var _b = useState({}), errors = _b[0], setErrors = _b[1];
60
+ var _c = useState(0), validationPercentage = _c[0], setValidationPercentage = _c[1];
61
+ var validatorsCache = useMemo(function () { return selectValidatorsFor(fields); }, [fields]);
62
+ var errorsRef = useRef(errors);
63
+ //Validate record and update dataSet
64
+ var updateRecordAndRevalidate = useCallback(function (record) { return __awaiter(void 0, void 0, void 0, function () {
65
+ var recordId, newDataSet, data, recordErrors, hasError;
66
+ var _a;
67
+ return __generator(this, function (_b) {
68
+ switch (_b.label) {
69
+ case 0:
70
+ recordId = record._meta.id;
71
+ newDataSet = __assign(__assign({}, dataSet), (_a = {}, _a[recordId] = __assign({}, record), _a));
72
+ data = Object.values(newDataSet);
73
+ return [4 /*yield*/, validateRecord({
74
+ validatorsCache: validatorsCache,
75
+ onValidateRecord: onValidateRecord,
76
+ data: data,
77
+ fields: fields,
78
+ record: record,
79
+ })];
80
+ case 1:
81
+ recordErrors = _b.sent();
82
+ hasError = checkIfHasErrors(recordErrors);
83
+ newDataSet[recordId]._meta.isInvalid = hasError;
84
+ newDataSet[recordId]._meta.touched = true;
85
+ setErrors(function (errors) {
86
+ var newErrors = __assign({}, errors);
87
+ var newState = hasError
88
+ ? set(newErrors, recordId, recordErrors)
89
+ : omit(newErrors, recordId);
90
+ errorsRef.current = newState;
91
+ return newState;
92
+ });
93
+ setDataSet(newDataSet); //Update the dataSet
94
+ return [2 /*return*/];
95
+ }
96
+ });
97
+ }); }, [dataSet, validatorsCache]);
98
+ //Initial data validation and update dataSet
99
+ useEffect(function () {
100
+ if (isReadOnly)
101
+ return;
102
+ var isCancelled = false;
103
+ setIsLoading(true);
104
+ var initialValidation = function () { return __awaiter(void 0, void 0, void 0, function () {
105
+ var errors, initialData, length, _a, batchValidationDelayMs, _b, batchValidationSize, batchSize, batchCount, batchIdx, idx, batch, index, record, recordId, recordErrors, hasError, validationPercentage_1, newState;
106
+ return __generator(this, function (_c) {
107
+ switch (_c.label) {
108
+ case 0:
109
+ errors = {};
110
+ initialData = Object.values(initialDataSet);
111
+ length = initialData.length;
112
+ _a = options.batchValidationDelayMs, batchValidationDelayMs = _a === void 0 ? 400 : _a, _b = options.batchValidationSize, batchValidationSize = _b === void 0 ? 1000 : _b;
113
+ batchSize = Math.min(Math.floor(batchValidationSize), length) || length;
114
+ batchCount = Math.ceil(length / batchSize);
115
+ batchIdx = 0;
116
+ _c.label = 1;
117
+ case 1:
118
+ if (!(batchIdx < batchCount)) return [3 /*break*/, 8];
119
+ if (isCancelled)
120
+ return [2 /*return*/];
121
+ idx = batchIdx * batchSize;
122
+ batch = initialData.slice(idx, idx + batchSize);
123
+ index = 0;
124
+ _c.label = 2;
125
+ case 2:
126
+ if (!(index < batch.length)) return [3 /*break*/, 5];
127
+ if (isCancelled)
128
+ return [2 /*return*/];
129
+ record = initialData[index];
130
+ recordId = record._meta.id;
131
+ return [4 /*yield*/, validateRecord({
132
+ onValidateRecord: onValidateRecord,
133
+ data: initialData,
134
+ fields: fields,
135
+ record: record,
136
+ validatorsCache: validatorsCache,
137
+ })];
138
+ case 3:
139
+ recordErrors = _c.sent();
140
+ hasError = checkIfHasErrors(recordErrors);
141
+ record._meta.isInvalid = hasError;
142
+ if (hasError)
143
+ errors[recordId] = recordErrors;
144
+ _c.label = 4;
145
+ case 4:
146
+ index++;
147
+ return [3 /*break*/, 2];
148
+ case 5:
149
+ validationPercentage_1 = (Math.min(idx + batchSize, initialData.length) / initialData.length) *
150
+ 100;
151
+ setValidationPercentage(Math.round((validationPercentage_1 + Number.EPSILON) * 10) / 10);
152
+ return [4 /*yield*/, sleep(batchValidationDelayMs)];
153
+ case 6:
154
+ _c.sent();
155
+ newState = __assign({}, errors);
156
+ errorsRef.current = newState;
157
+ setErrors(newState);
158
+ _c.label = 7;
159
+ case 7:
160
+ batchIdx++;
161
+ return [3 /*break*/, 1];
162
+ case 8: return [2 /*return*/];
163
+ }
164
+ });
165
+ }); };
166
+ initialValidation().then(function () {
167
+ if (!isCancelled)
168
+ setIsLoading(false);
169
+ }, console.error);
170
+ return function () {
171
+ isCancelled = true;
172
+ };
173
+ }, [initialDataSet]);
174
+ var columnErrorCounts = useMemo(function () {
175
+ return Object.keys(errors).reduce(function (errorsByColumns, rowId) {
176
+ var recordErrors = errors[rowId];
177
+ return Object.keys(recordErrors).reduce(function (internalErrorsByColumns, fieldKey) {
178
+ var _a;
179
+ var hasError = !!recordErrors[fieldKey];
180
+ var count = (_a = internalErrorsByColumns[fieldKey]) !== null && _a !== void 0 ? _a : 0;
181
+ internalErrorsByColumns[fieldKey] = hasError ? count + 1 : count;
182
+ return internalErrorsByColumns;
183
+ }, errorsByColumns);
184
+ }, {});
185
+ }, [errors]);
186
+ var totalErrors = useMemo(function () {
187
+ return Object.keys(columnErrorCounts).reduce(function (count, column) { return count + columnErrorCounts[column]; }, 0);
188
+ }, [columnErrorCounts]);
189
+ var isValidationCompleted = validationPercentage === 100;
190
+ var isValid = isValidationCompleted && totalErrors === 0;
191
+ return {
192
+ errors: errors,
193
+ totalErrors: totalErrors,
194
+ columnErrorCounts: columnErrorCounts,
195
+ validationPercentage: validationPercentage,
196
+ isValidationCompleted: isValidationCompleted,
197
+ isValid: isValid,
198
+ errorsRef: errorsRef,
199
+ updateRecordAndRevalidate: updateRecordAndRevalidate,
200
+ };
201
+ };
@@ -1,18 +1,19 @@
1
1
  import React from "react";
2
- import { AppResponse } from "../../..";
3
- import { Field, OnValidateBatch, OnValidateRecord, Record, SpreadsheetOptions } from "../../../types";
2
+ import { Field, OnValidateRecord, Record, RecordDataSet, SpreadsheetOptions } from "../../../types";
3
+ import { OnDataSetChanged, OnValidationStateChanged } from "./SpreadsheetContextProvider";
4
4
  export declare type SpreadsheetProps = {
5
- initialData: any[];
5
+ initialDataSet: RecordDataSet;
6
6
  rowWidth?: number;
7
- appResponse?: AppResponse;
8
7
  isReadOnly?: boolean;
9
- onValidateRecord?: OnValidateRecord;
10
- onValidateBatch?: OnValidateBatch;
11
8
  fields?: Field[];
12
9
  submittedData?: Record[];
13
10
  highlightFirstRow?: boolean;
14
11
  options?: SpreadsheetOptions;
15
- setReviewedData?: React.Dispatch<React.SetStateAction<Record[]>>;
12
+ onValidateRecord?: OnValidateRecord;
13
+ onDataSetChanged?: OnDataSetChanged;
14
+ onValidationStateChanged?: OnValidationStateChanged;
16
15
  };
17
- declare const Spreadsheet: ({ isReadOnly, initialData, rowWidth, fields, appResponse, options, onValidateRecord, submittedData, setReviewedData, onValidateBatch, highlightFirstRow, }: SpreadsheetProps) => JSX.Element;
18
- export { Spreadsheet };
16
+ declare const _default: React.MemoExoticComponent<({ isReadOnly, initialDataSet, rowWidth, fields, options, highlightFirstRow, onValidateRecord, onDataSetChanged, onValidationStateChanged, }: SpreadsheetProps) => JSX.Element>;
17
+ export default _default;
18
+ export * from "./hooks";
19
+ export * from "./SpreadsheetContextProvider";