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.
- package/lib/esm/Importer/ImporterWithContext.js +38 -7
- package/lib/esm/Importer/Matcher/EnumFieldsMatchers/EnumFieldMatcher/index.js +1 -1
- package/lib/esm/Importer/Matcher/EnumFieldsMatchers/index.js +4 -3
- package/lib/esm/Importer/Matcher/HeaderMatcher/index.js +14 -9
- package/lib/esm/Importer/Matcher/index.js +0 -11
- package/lib/esm/Importer/PreviewFirstTime.js +1 -1
- package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +6 -6
- package/lib/esm/Importer/Review/ReviewContextProvider.js +53 -184
- package/lib/esm/Importer/Review/ReviewWithContext.js +2 -2
- package/lib/esm/Importer/Stepper/StepperSubmitModal.d.ts +2 -1
- package/lib/esm/Importer/Stepper/StepperSubmitModal.js +4 -2
- package/lib/esm/Importer/Stepper/UnmatchedHeadersModal.js +1 -1
- package/lib/esm/Importer/Stepper/index.js +21 -11
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.d.ts +2 -1
- package/lib/esm/Importer/Uploader/DragAndDropImporter/ImporterDropzone.js +14 -86
- package/lib/esm/Importer/Uploader/DragAndDropImporter/index.js +11 -3
- package/lib/esm/Importer/Uploader/HeadersPreview.js +1 -1
- package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.d.ts +16 -0
- package/lib/esm/Importer/common/Spreadsheet/DataSetContextProvider/index.js +63 -0
- package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.d.ts +18 -0
- package/lib/esm/Importer/common/Spreadsheet/DuplicateDataContextProvider/index.js +101 -0
- package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.d.ts +29 -0
- package/lib/esm/Importer/common/Spreadsheet/FilteredDataContextProvider/index.js +150 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +6 -4
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +37 -37
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.d.ts +6 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/hashCalculators.js +138 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.d.ts +7 -29
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/index.js +11 -193
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useBatchProcessing.js +72 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.d.ts +4 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useDataSetManipulation.js +46 -0
- package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +2 -1
- package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.d.ts +31 -0
- package/lib/esm/Importer/common/Spreadsheet/ValidationContextProvider/index.js +304 -0
- package/lib/esm/Importer/common/Spreadsheet/common/index.js +5 -4
- package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -3
- package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.d.ts +0 -2
- package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +26 -11
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +21 -13
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +35 -36
- package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowNumbers.js +3 -3
- package/lib/esm/Importer/common/Spreadsheet/components/fields/SpreadsheetInput.js +5 -1
- package/lib/esm/Importer/common/Spreadsheet/components/fields/index.js +57 -26
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/index.js +1 -2
- package/lib/esm/Importer/common/Spreadsheet/index.d.ts +0 -1
- package/lib/esm/Importer/common/Spreadsheet/index.js +1 -84
- package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -2
- package/lib/esm/Importer/common/Spreadsheet/styles.js +13 -1
- package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.d.ts +5 -0
- package/lib/esm/Importer/common/Spreadsheet/useFieldSorting.js +81 -0
- package/lib/esm/Importer/common/Spreadsheet/validation/index.d.ts +5 -3
- package/lib/esm/Importer/common/Spreadsheet/validation/index.js +13 -17
- package/lib/esm/Importer/common/Spreadsheet/validation/validators.d.ts +3 -2
- package/lib/esm/Importer/common/Spreadsheet/validation/validators.js +16 -7
- package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +4 -2
- package/lib/esm/Importer/contexts/ImporterContextProvider.js +137 -18
- package/lib/esm/Importer/data/index.js +7 -5
- package/lib/esm/Importer/hooks/useExportDataToFile.d.ts +5 -0
- package/lib/esm/Importer/hooks/useExportDataToFile.js +54 -0
- package/lib/esm/Importer/hooks/useSubmitToServer.d.ts +7 -0
- package/lib/esm/Importer/hooks/useSubmitToServer.js +192 -0
- package/lib/esm/common/EventManagerContextProvider/index.d.ts +22 -0
- package/lib/esm/common/EventManagerContextProvider/index.js +38 -0
- package/lib/esm/common/FileUploadDropzone/ImporterDropzone.d.ts +16 -0
- package/lib/esm/common/FileUploadDropzone/ImporterDropzone.js +108 -0
- package/lib/esm/common/FileUploadDropzone/index.d.ts +1 -0
- package/lib/esm/common/FileUploadDropzone/index.js +1 -0
- package/lib/esm/common/Table/TableActions/CustomActions/CustomActions.js +55 -41
- package/lib/esm/common/Table/TableActions/DeleteSelectedRows.js +25 -16
- package/lib/esm/common/Table/TableActions/ExportData.js +5 -3
- package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +36 -9
- package/lib/esm/common/Table/TableActions/RowFilters.js +53 -5
- package/lib/esm/common/Table/TableActions/SearchRows.js +3 -1
- package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
- package/lib/esm/common/Table/TableActions/TransformedRecordsCount.js +16 -9
- package/lib/esm/common/Table/TableActions/ValidationProgress.d.ts +2 -0
- package/lib/esm/common/Table/TableActions/ValidationProgress.js +22 -0
- package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +1 -1
- package/lib/esm/common/Table/TableView/TableRows/TableRow.js +2 -2
- package/lib/esm/common/Table/TableView/TableRows/index.js +21 -6
- package/lib/esm/common/Table/TableView/index.d.ts +1 -1
- package/lib/esm/common/Table/TableView/index.js +6 -15
- package/lib/esm/common/Table/TableView/types.d.ts +8 -9
- package/lib/esm/common/Table/index.d.ts +2 -1
- package/lib/esm/common/Table/index.js +2 -2
- package/lib/esm/common/Toast.js +3 -2
- package/lib/esm/common/TooltipProvider.d.ts +2 -0
- package/lib/esm/common/TooltipProvider.js +12 -9
- package/lib/esm/common/buttons.d.ts +5 -1
- package/lib/esm/common/buttons.js +13 -7
- package/lib/esm/common/columnsTransformations.js +1 -1
- package/lib/esm/common/datePatterns.js +10 -10
- package/lib/esm/common/icons/index.d.ts +1 -0
- package/lib/esm/common/icons/index.js +1 -0
- package/lib/esm/common/index.d.ts +1 -0
- package/lib/esm/common/index.js +1 -0
- package/lib/esm/common/inputs/Autocomplete.js +1 -1
- package/lib/esm/locales/de.d.ts +1 -1
- package/lib/esm/locales/de.js +1 -1
- package/lib/esm/locales/en.d.ts +1 -1
- package/lib/esm/locales/en.js +4 -4
- package/lib/esm/locales/es.d.ts +1 -1
- package/lib/esm/locales/es.js +1 -1
- package/lib/esm/locales/fr.d.ts +1 -1
- package/lib/esm/locales/fr.js +1 -1
- package/lib/esm/types.d.ts +27 -4
- package/lib/main.js +24 -24
- package/package.json +6 -4
- package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.d.ts +0 -8
- package/lib/esm/Importer/Stepper/common/getEnumFieldValueMatchingsInitialValue.js +0 -33
- package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.d.ts +0 -5
- package/lib/esm/Importer/common/Spreadsheet/components/ValidationProgress.js +0 -19
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.d.ts +0 -3
- package/lib/esm/Importer/common/Spreadsheet/components/inputs/EmailInput.js +0 -14
- package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +0 -33
- package/lib/esm/Importer/common/Spreadsheet/hooks.js +0 -256
- package/lib/esm/common/Table/TableActions/FilterByErrors/functions.d.ts +0 -11
- package/lib/esm/common/Table/TableActions/FilterByErrors/functions.js +0 -35
- package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -18
- package/lib/esm/common/Table/TableActions/hooks.js +0 -41
|
@@ -14,10 +14,12 @@ var __assign = (this && this.__assign) || function () {
|
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
17
|
-
import { useState } from "react";
|
|
17
|
+
import { useEffect, useState } from "react";
|
|
18
18
|
import { useTranslation } from "react-i18next";
|
|
19
19
|
import styled, { css } from "styled-components";
|
|
20
|
+
import { useValidationContext } from "../../Importer/common/Spreadsheet/ValidationContextProvider";
|
|
20
21
|
import { Button, ChevronRightIcon, closeIconCondensed } from "../../common";
|
|
22
|
+
import { useEventManagerContext } from "../../common/EventManagerContextProvider";
|
|
21
23
|
import { Div } from "../../styled/utils";
|
|
22
24
|
import { ColumnType } from "../Matcher/common/types";
|
|
23
25
|
import { useReviewContext } from "../Review/ReviewContextProvider";
|
|
@@ -26,7 +28,6 @@ import { ConfirmCloseModal } from "./ConfirmCloseModal";
|
|
|
26
28
|
import { Step } from "./Step";
|
|
27
29
|
import { StepperSubmitModal } from "./StepperSubmitModal";
|
|
28
30
|
import { UnmatchedHeadersModal } from "./UnmatchedHeadersModal";
|
|
29
|
-
import { getEnumFieldValueMatchingsInitialValue } from "./common/getEnumFieldValueMatchingsInitialValue";
|
|
30
31
|
var StepperWrapper = styled(Div)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"], ["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n user-select: none;\n"])), function (p) { return p.theme.colors.white; }, function (p) { return p.theme.colors.gray300; });
|
|
31
32
|
var StepperContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"], ["\n align-items: center;\n display: flex;\n gap: 16px;\n justify-content: space-between;\n padding-left: 32px;\n padding-right: 32px;\n width: 100%;\n"])));
|
|
32
33
|
var Steps = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n @media (max-width: 630px) {\n display: none;\n }\n"], ["\n @media (max-width: 630px) {\n display: none;\n }\n"])));
|
|
@@ -43,21 +44,30 @@ export var Stepper = function (_a) {
|
|
|
43
44
|
var t = useTranslation("general").t;
|
|
44
45
|
var _c = useState(false), isSubmitModalOpen = _c[0], setIsSubmitModalOpen = _c[1];
|
|
45
46
|
var _d = useState(false), isConfirmCloseModalOpen = _d[0], setIsConfirmCloseModalOpen = _d[1];
|
|
46
|
-
var _e =
|
|
47
|
-
var _f =
|
|
47
|
+
var _e = useState(false), isSubmitDisabled = _e[0], setIsSubmitDisabled = _e[1];
|
|
48
|
+
var _f = useReviewContext(), appResponse = _f.appResponse, onSubmit = _f.onSubmit;
|
|
49
|
+
var totalErrorCount = useValidationContext().totalErrorCount;
|
|
50
|
+
var _g = useEventManagerContext(), on = _g.on, off = _g.off, EVENTS = _g.EVENTS;
|
|
51
|
+
useEffect(function () {
|
|
52
|
+
var listener = function () {
|
|
53
|
+
var isDisabled = totalErrorCount.current > 0;
|
|
54
|
+
setIsSubmitDisabled(isDisabled);
|
|
55
|
+
};
|
|
56
|
+
on(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
|
|
57
|
+
return function () {
|
|
58
|
+
off(EVENTS.UPDATE_TOTAL_ERROR_COUNT, listener);
|
|
59
|
+
};
|
|
60
|
+
}, [appResponse]);
|
|
61
|
+
var _h = useImporterContext(), initialRecords = _h.initialRecords, currentStepIndex = _h.currentStepIndex, templateHeaderMatchings = _h.templateHeaderMatchings, matcherSubstep = _h.matcherSubstep, templateHeaders = _h.templateHeaders, enumFieldValueMatchings = _h.enumFieldValueMatchings, setMatcherSubstep = _h.setMatcherSubstep, setCurrentStepIndex = _h.setCurrentStepIndex, onClose = _h.onClose, isUsingManualImport = _h.isUsingManualImport, resetImporterWhenUsingManualImport = _h.resetImporterWhenUsingManualImport, uploadedData = _h.uploadedData;
|
|
48
62
|
var templateHeaderLabels = Object.keys(templateHeaderMatchings || []);
|
|
49
63
|
var unmatchedHeadersCount = templateHeaderLabels.filter(function (templateHeaderLabel) { return !templateHeaderMatchings[templateHeaderLabel]; }).length;
|
|
50
64
|
var isLastSubMatchStep = matcherSubstep === 1;
|
|
51
65
|
var setStep = function () {
|
|
52
66
|
var templateHasEnumFields = !!(templateHeaders === null || templateHeaders === void 0 ? void 0 : templateHeaders.find(function (header) { return header.column_type === ColumnType.enum; }));
|
|
53
67
|
if (templateHasEnumFields) {
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
templateHeaders: templateHeaders,
|
|
57
|
-
});
|
|
58
|
-
var anyTemplateEnumFieldsMatched = Object.keys(_enumFieldValueMatchings).length > 0;
|
|
68
|
+
var anyTemplateEnumFieldsMatched = !!enumFieldValueMatchings &&
|
|
69
|
+
Object.keys(enumFieldValueMatchings).length > 0;
|
|
59
70
|
if (anyTemplateEnumFieldsMatched) {
|
|
60
|
-
setEnumFieldValueMatchings(_enumFieldValueMatchings);
|
|
61
71
|
setMatcherSubstep(1);
|
|
62
72
|
}
|
|
63
73
|
else {
|
|
@@ -110,7 +120,7 @@ export var Stepper = function (_a) {
|
|
|
110
120
|
return (_jsxs(Div, __assign({ centered: true }, { children: [_jsx(Step, { index: index, label: label, isCompleted: isCompleted, isSelected: index === currentStepIndex }), !isLast && (_jsx(Div, __assign({ ml: 18, mr: 18, dflex: true }, { children: _jsx(ChevronRightIcon, {}) })))] }), index));
|
|
111
121
|
}) })));
|
|
112
122
|
var leftButtonUI = (_jsx(Div, __assign({ style: { flex: 1 } }, { children: !initialRecords && (_jsxs(StepperButtonContainer, __assign({ align: "left" }, { children: [logoURL && (_jsx(Div, __assign({ forDesktop: true }, { children: _jsx(Logo, { src: logoURL, alt: "" }) }))), currentStepIndex > 0 && !appResponse && (_jsx(GoBackButtonWrapper, { children: _jsx(Button, __assign({ variant: "secondary", onClick: goBack }, { children: t("stepper.go_back") })) }))] }))) })));
|
|
113
|
-
var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
|
|
123
|
+
var rightButtonUI = (_jsxs(StepperButtonContainer, __assign({ align: "right" }, { children: [(isMatchStep || isVerifyStep) && (_jsx(Button, __assign({ "data-cy": "continue-button", variant: "primary", onClick: continueToNextStep }, { children: t("stepper.continue") }))), isReviewStep && (_jsx(Button, __assign({ variant: "primary", isDisabled: isSubmitDisabled, "data-cy": "submit_disabled_" + isSubmitDisabled, onClick: function () { return setIsSubmitModalOpen(true); } }, { children: t("stepper.submit") }))), _jsx(CloseIcon, __assign({ "data-test-id": "close-importer", centered: true, clickable: true, onClick: handleOnClose }, { children: closeIconCondensed }))] })));
|
|
114
124
|
return (_jsxs(_Fragment, { children: [_jsx(StepperWrapper, __assign({ pRelative: true, alignCenter: true, w100: true, h: 72, centered: true }, { children: _jsxs(StepperContainer, { children: [leftButtonUI, _jsx(Steps, __assign({ alignCenter: true }, { children: stepsUI })), rightButtonUI] }) })), _jsx(UnmatchedHeadersModal, { isUnmatchedHeadersModalOpen: isUnmatchedHeadersModalOpen, unmatchedHeadersCount: unmatchedHeadersCount, onSetStep: function () { return setStep(); }, onCloseUnmatchedHeadersModal: function () {
|
|
115
125
|
return setIsUnmatchedHeadersModalOpen(false);
|
|
116
126
|
} }), _jsx(StepperSubmitModal, { isSubmitModalOpen: isSubmitModalOpen, onCloseModal: function () { return setIsSubmitModalOpen(false); }, onSubmit: onSubmit }), _jsx(ConfirmCloseModal, { isOpen: isConfirmCloseModalOpen, onClose: function () { return setIsConfirmCloseModalOpen(false); }, onCloseImporter: onClose })] }));
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { DropzoneProps as ImporterDropzoneProps } from "../../../common";
|
|
2
|
+
declare const ImporterDropzone: ({ onComplete, setIsLoading, saveFileName, }: ImporterDropzoneProps) => JSX.Element;
|
|
2
3
|
export { ImporterDropzone };
|
|
@@ -14,35 +14,29 @@ var __assign = (this && this.__assign) || function () {
|
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
-
import { useDropzone } from "react-dropzone";
|
|
18
17
|
import styled, { css } from "styled-components";
|
|
19
|
-
import {
|
|
20
|
-
import { useImporterContext } from "../../contexts/ImporterContextProvider";
|
|
18
|
+
import { useImporterContext } from "../../../Importer/contexts/ImporterContextProvider";
|
|
21
19
|
import { Div } from "../../../styled/utils";
|
|
22
20
|
import { theme } from "../../../styled/theme";
|
|
23
|
-
import {
|
|
24
|
-
import { Button } from "../../../common/buttons";
|
|
25
|
-
import { DragAndDropSvg, UploadIndicatorSvg } from "./backgrounds";
|
|
21
|
+
import { DragAndDropSvg, UploadIndicatorSvg, } from "../../../Importer/Uploader/DragAndDropImporter/backgrounds";
|
|
26
22
|
import { useTranslation } from "react-i18next";
|
|
27
|
-
import
|
|
28
|
-
import * as XLSX from "xlsx";
|
|
23
|
+
import { Button, addToast, useDragAndDrop, } from "../../../common";
|
|
29
24
|
var DragAndDropCard = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n border-radius: 8px;\n margin-right: ", ";\n width: 100%;\n height: 100%;\n display: flex;\n background: ", ";\n border: 1px dashed ", ";\n\n @media (max-width: 1050px) {\n padding: 24px;\n width: auto;\n }\n\n ", "\n"], ["\n border-radius: 8px;\n margin-right: ", ";\n width: 100%;\n height: 100%;\n display: flex;\n background: ", ";\n border: 1px dashed ", ";\n\n @media (max-width: 1050px) {\n padding: 24px;\n width: auto;\n }\n\n ", "\n"])), function (props) { return (props.isDragActive ? "-10px" : "revert"); }, theme.colors.white, theme.colors.red50, function (props) {
|
|
30
25
|
return props.isDragActive && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n border: 1px solid ", ";\n justify-content: center;\n "], ["\n background: ", ";\n border: 1px solid ", ";\n justify-content: center;\n "])), function (p) { return p.theme.colors.blue100; }, function (p) { return p.theme.colors.blue500; });
|
|
31
26
|
});
|
|
32
27
|
var DropzoneUploadingContainer = styled(Div)(function (_a) {
|
|
33
|
-
var
|
|
34
|
-
return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "], ["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "])),
|
|
28
|
+
var colors = _a.theme.colors;
|
|
29
|
+
return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "], ["\n position: absolute;\n height: 100%;\n width: 100%;\n background: ", ";\n border: 1px solid ", ";\n "])), colors.blue100, colors.blue500);
|
|
35
30
|
});
|
|
36
31
|
var dropzoneUploadingUI = (_jsx(DropzoneUploadingContainer, __assign({ centered: true }, { children: _jsxs(Div, { children: [_jsx(Div, __assign({ centered: true, mb: 12 }, { children: UploadIndicatorSvg })), _jsx(Div, __assign({ h5: true }, { children: " Drop your file here to upload!" }))] }) })));
|
|
37
32
|
var DragAndDropComponent = function (_a) {
|
|
38
33
|
var openUploadFileDialog = _a.openUploadFileDialog;
|
|
39
34
|
var t = useTranslation("upload").t;
|
|
40
35
|
var manualDataImportSelected = useImporterContext().manualDataImportSelected;
|
|
41
|
-
return (_jsxs(Div, __assign({ centered: true, flexColumn: true }, { children: [_jsx(Div, __assign({ mb: 12 }, { children: DragAndDropSvg })), _jsx(Div, __assign({ h5: true }, { children: t("dropzone.title") })), _jsx(Button, __assign({ mt: 20, variant: "secondary", w: "fit-content", p: 12, isSmall: true, onClick: openUploadFileDialog }, { children: t("dropzone.button") })), _jsx(Div, __assign({ body1: true, textAlignCenter: true, m: 4, mt: 24 }, { children: t("dropzone.description") })), _jsx(Div, { children: _jsx(Button, __assign({ variant: "link", w: "fit-content", p: 12, isSmall: true, onClick: manualDataImportSelected }, { children: t("dropzone.enter_data_manually") })) })] })));
|
|
36
|
+
return (_jsxs(Div, __assign({ centered: true, flexColumn: true }, { children: [_jsx(Div, __assign({ mb: 12 }, { children: DragAndDropSvg })), _jsx(Div, __assign({ h5: true }, { children: t("dropzone.title") })), _jsx(Button, __assign({ mt: 20, variant: "secondary", w: "fit-content", p: 12, isSmall: true, onClick: openUploadFileDialog }, { children: t("dropzone.button") })), _jsx(Div, __assign({ body1: true, textAlignCenter: true, m: 4, mt: 24 }, { children: t("dropzone.description") })), _jsx(Div, { children: _jsx(Button, __assign({ "data-cy": "enter-manually", variant: "link", w: "fit-content", p: 12, isSmall: true, onClick: manualDataImportSelected }, { children: t("dropzone.enter_data_manually") })) })] })));
|
|
42
37
|
};
|
|
43
|
-
var ImporterDropzone = function () {
|
|
44
|
-
var
|
|
45
|
-
var setUploadedData = useImporterContext().setUploadedData;
|
|
38
|
+
var ImporterDropzone = function (_a) {
|
|
39
|
+
var onComplete = _a.onComplete, setIsLoading = _a.setIsLoading, saveFileName = _a.saveFileName;
|
|
46
40
|
var validHeadersCount = function (headersLength) {
|
|
47
41
|
var headersCountLimit = 70;
|
|
48
42
|
if (headersLength > headersCountLimit) {
|
|
@@ -53,78 +47,12 @@ var ImporterDropzone = function () {
|
|
|
53
47
|
return true;
|
|
54
48
|
}
|
|
55
49
|
};
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
reader.onabort = function () { return console.log("file reading was aborted"); };
|
|
63
|
-
reader.onerror = function () { return console.log("file reading has failed"); };
|
|
64
|
-
reader.onload = function (event) {
|
|
65
|
-
var _a;
|
|
66
|
-
var results = event.target.result;
|
|
67
|
-
if (isCsvFile) {
|
|
68
|
-
Papa.parse(results, {
|
|
69
|
-
worker: true,
|
|
70
|
-
complete: function (parserResults) {
|
|
71
|
-
setUploadedData(parserResults.data);
|
|
72
|
-
setIsUploading(false);
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
var getDataFromFile = function (fileResults) {
|
|
78
|
-
// rounded value to 20MB
|
|
79
|
-
var isLargeFile = file.size > 20000000;
|
|
80
|
-
var workBook = XLSX.read(fileResults, {
|
|
81
|
-
type: "array",
|
|
82
|
-
codepage: 65001,
|
|
83
|
-
raw: true,
|
|
84
|
-
dense: isLargeFile,
|
|
85
|
-
});
|
|
86
|
-
var workBookName = workBook.SheetNames[0];
|
|
87
|
-
var sheet = workBook.Sheets[workBookName];
|
|
88
|
-
return XLSX.utils.sheet_to_json(sheet, { header: 1, raw: false });
|
|
89
|
-
};
|
|
90
|
-
var fileData = getDataFromFile(results);
|
|
91
|
-
var headersCount = (_a = fileData[0]) === null || _a === void 0 ? void 0 : _a.length;
|
|
92
|
-
if (validHeadersCount(headersCount)) {
|
|
93
|
-
setUploadedData(fileData);
|
|
94
|
-
}
|
|
95
|
-
setIsUploading(false);
|
|
96
|
-
};
|
|
97
|
-
if (isCsvFile) {
|
|
98
|
-
reader.readAsText(file);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
reader.readAsArrayBuffer(file);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
var onDropRejected = function (rejectedFiles) {
|
|
106
|
-
var errorMessages = rejectedFiles.map(function (file) {
|
|
107
|
-
if (file.errors[0].code === "file-too-large") {
|
|
108
|
-
return "Maximum file size is 200MB";
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return file.errors[0].message;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
var uniqueMessages = Array.from(new Set(errorMessages));
|
|
115
|
-
uniqueMessages.forEach(function (message) {
|
|
116
|
-
addToast(message, "error");
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
var _b = useDropzone({
|
|
120
|
-
onDrop: onDrop,
|
|
121
|
-
onDropRejected: onDropRejected,
|
|
122
|
-
noClick: true,
|
|
123
|
-
noKeyboard: true,
|
|
124
|
-
accept: ".csv, .xls, .xlsx",
|
|
125
|
-
maxFiles: 1,
|
|
126
|
-
maxSize: 200000000, // 200MB
|
|
127
|
-
}), getRootProps = _b.getRootProps, getInputProps = _b.getInputProps, open = _b.open, isDragActive = _b.isDragActive;
|
|
50
|
+
var _b = useDragAndDrop({
|
|
51
|
+
onComplete: onComplete,
|
|
52
|
+
saveFileName: saveFileName,
|
|
53
|
+
setIsLoading: setIsLoading,
|
|
54
|
+
validHeadersCount: validHeadersCount,
|
|
55
|
+
}), getInputProps = _b.getInputProps, getRootProps = _b.getRootProps, isDragActive = _b.isDragActive, open = _b.open;
|
|
128
56
|
return (_jsxs(DragAndDropCard, __assign({ isDragActive: isDragActive, centered: true, pRelative: true }, getRootProps(), { children: [_jsx("input", __assign({}, getInputProps())), isDragActive && dropzoneUploadingUI, _jsx(DragAndDropComponent, { openUploadFileDialog: open })] })));
|
|
129
57
|
};
|
|
130
58
|
export { ImporterDropzone };
|
|
@@ -15,10 +15,10 @@ import { Div } from "../../../styled/utils";
|
|
|
15
15
|
import { closeIconWithCircle, errorIcon, fileExtensionIcon, } from "../../common/icons";
|
|
16
16
|
import { useImporterContext } from "../../contexts/ImporterContextProvider";
|
|
17
17
|
import { useUploaderContext } from "../UploaderContextProvider";
|
|
18
|
-
import { ImporterDropzone } from "./ImporterDropzone";
|
|
19
18
|
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { HeaderCard } from "./ImporterSectionHeader";
|
|
21
20
|
import * as S from "./DragAndDropImporter.styles";
|
|
21
|
+
import { ImporterDropzone } from "./ImporterDropzone";
|
|
22
22
|
export var ErrorCard = function () {
|
|
23
23
|
var templateError = useImporterContext().templateError;
|
|
24
24
|
var t = useTranslation("upload").t;
|
|
@@ -33,8 +33,16 @@ var LoadingCard = function () {
|
|
|
33
33
|
return (_jsxs(S.LoadingCardWrapper, __assign({ spaceBetween: true, centered: true }, { children: [fileExtensionUI, _jsxs(Div, __assign({ mr: 30, ml: 30 }, { children: [_jsx(Div, __assign({ label2: true }, { children: fileName })), _jsx(Div, __assign({ helperText: true, c: colors.gray500 }, { children: t("loading.title") }))] })), _jsx(Div, __assign({ clickable: true, onClick: resetImport }, { children: closeIconWithCircle }))] })));
|
|
34
34
|
};
|
|
35
35
|
var ImporterSection = function () {
|
|
36
|
-
var _a = useImporterContext(), templateHeaders = _a.templateHeaders, templateError = _a.templateError;
|
|
37
|
-
|
|
36
|
+
var _a = useImporterContext(), templateHeaders = _a.templateHeaders, templateError = _a.templateError, setUploadedData = _a.setUploadedData;
|
|
37
|
+
var _b = useUploaderContext(), setIsUploading = _b.setIsUploading, setFileName = _b.setFileName;
|
|
38
|
+
var onComplete = function (data) {
|
|
39
|
+
setUploadedData(data);
|
|
40
|
+
setIsUploading(false);
|
|
41
|
+
};
|
|
42
|
+
var saveFileName = function (fileName) {
|
|
43
|
+
setFileName(fileName);
|
|
44
|
+
};
|
|
45
|
+
return templateError ? (_jsx(ErrorCard, {})) : (_jsx(_Fragment, { children: templateHeaders && (_jsxs(S.ImporterSectionContainer, { children: [_jsx(ImporterDropzone, { onComplete: onComplete, saveFileName: saveFileName, setIsLoading: setIsUploading }), _jsx(HeaderCard, { templateHeaders: templateHeaders })] })) }));
|
|
38
46
|
};
|
|
39
47
|
var DragAndDropImporter = function () {
|
|
40
48
|
var isUploading = useUploaderContext().isUploading;
|
|
@@ -14,6 +14,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
14
14
|
return __assign.apply(this, arguments);
|
|
15
15
|
};
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
+
import { useEffect } from "react";
|
|
17
18
|
import { useTranslation } from "react-i18next";
|
|
18
19
|
import styled, { css } from "styled-components";
|
|
19
20
|
import { Div } from "../../styled/utils";
|
|
@@ -21,7 +22,6 @@ import { useReviewContext } from "../Review/ReviewContextProvider";
|
|
|
21
22
|
import SpreadsheetBase from "../common/Spreadsheet";
|
|
22
23
|
import { useImporterContext } from "../contexts/ImporterContextProvider";
|
|
23
24
|
import { HeaderButtons } from "./HeaderButtons";
|
|
24
|
-
import { useEffect } from "react";
|
|
25
25
|
var Spreadsheet = styled(SpreadsheetBase)(function () { return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n /* rows will be removed for match and review steps */\n .before-selected-row {\n opacity: 0.2;\n }\n "], ["\n /* rows will be removed for match and review steps */\n .before-selected-row {\n opacity: 0.2;\n }\n "]))); });
|
|
26
26
|
var HeaderContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n margin-left: 32px;\n\n @media (max-width: 1050px) {\n margin-left: 0px;\n\n > div:first-of-type {\n text-align: center;\n }\n\n div:last-of-type {\n margin-left: 0px;\n }\n }\n"], ["\n margin-left: 32px;\n\n @media (max-width: 1050px) {\n margin-left: 0px;\n\n > div:first-of-type {\n text-align: center;\n }\n\n div:last-of-type {\n margin-left: 0px;\n }\n }\n"])));
|
|
27
27
|
var DescriptionAndButtons = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n @media (max-width: 1050px) {\n flex-direction: column;\n gap: 16px;\n }\n"], ["\n @media (max-width: 1050px) {\n flex-direction: column;\n gap: 16px;\n }\n"])));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { Record, RecordDataSet } from "../../../../types";
|
|
3
|
+
export type State = {
|
|
4
|
+
getRecord: (recordId: string) => Record;
|
|
5
|
+
setRecord: (recordId: string, record: Record) => Record;
|
|
6
|
+
deleteRecord: (recordId: string) => void;
|
|
7
|
+
dataSet: MutableRefObject<RecordDataSet>;
|
|
8
|
+
dataSetLength: MutableRefObject<number>;
|
|
9
|
+
emptyRecordIds: MutableRefObject<Set<string>>;
|
|
10
|
+
};
|
|
11
|
+
export declare const DataSetContext: React.Context<State>;
|
|
12
|
+
export declare const DataSetContextProvider: ({ initialDataSet, children }: {
|
|
13
|
+
initialDataSet: any;
|
|
14
|
+
children: any;
|
|
15
|
+
}) => JSX.Element;
|
|
16
|
+
export declare const useDataSetContext: () => State;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { createContext, useContext, useEffect, useRef, } from "react";
|
|
14
|
+
import { rowIsEmpty } from "../SpreadsheetContextProvider/utils";
|
|
15
|
+
export var DataSetContext = createContext({});
|
|
16
|
+
export var DataSetContextProvider = function (_a) {
|
|
17
|
+
var initialDataSet = _a.initialDataSet, children = _a.children;
|
|
18
|
+
var dataSet = useRef(initialDataSet);
|
|
19
|
+
var dataSetLength = useRef(Object.keys(dataSet.current).length);
|
|
20
|
+
var emptyRecordIds = useRef(new Set());
|
|
21
|
+
var reset = function () {
|
|
22
|
+
emptyRecordIds.current = new Set();
|
|
23
|
+
};
|
|
24
|
+
useEffect(function () {
|
|
25
|
+
reset();
|
|
26
|
+
// without the hook, with the changes on where the context would
|
|
27
|
+
// live, the dataSet was not being correctly updated for the Match step
|
|
28
|
+
dataSet.current = initialDataSet;
|
|
29
|
+
dataSetLength.current = Object.keys(initialDataSet).length;
|
|
30
|
+
}, [initialDataSet]);
|
|
31
|
+
var getRecord = function (recordId) {
|
|
32
|
+
return dataSet.current[recordId];
|
|
33
|
+
};
|
|
34
|
+
var deleteRecord = function (recordId) {
|
|
35
|
+
if (dataSet.current[recordId]) {
|
|
36
|
+
dataSetLength.current -= 1;
|
|
37
|
+
}
|
|
38
|
+
delete dataSet.current[recordId];
|
|
39
|
+
};
|
|
40
|
+
var setRecord = function (recordId, record) {
|
|
41
|
+
if (!dataSet.current[recordId]) {
|
|
42
|
+
dataSetLength.current += 1;
|
|
43
|
+
}
|
|
44
|
+
if (rowIsEmpty(record)) {
|
|
45
|
+
emptyRecordIds.current.add(recordId);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
emptyRecordIds.current.delete(recordId);
|
|
49
|
+
}
|
|
50
|
+
dataSet.current[recordId] = record;
|
|
51
|
+
return getRecord(recordId);
|
|
52
|
+
};
|
|
53
|
+
var value = {
|
|
54
|
+
getRecord: getRecord,
|
|
55
|
+
setRecord: setRecord,
|
|
56
|
+
deleteRecord: deleteRecord,
|
|
57
|
+
dataSet: dataSet,
|
|
58
|
+
dataSetLength: dataSetLength,
|
|
59
|
+
emptyRecordIds: emptyRecordIds,
|
|
60
|
+
};
|
|
61
|
+
return (_jsx(DataSetContext.Provider, __assign({ value: value }, { children: children })));
|
|
62
|
+
};
|
|
63
|
+
export var useDataSetContext = function () { return useContext(DataSetContext); };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { DuplicateValuesCollection, Field, RecordDataSet } from "../../../../types";
|
|
3
|
+
type DuplicateDataProps = {
|
|
4
|
+
fields: Field[];
|
|
5
|
+
isReadOnly: boolean;
|
|
6
|
+
children: any;
|
|
7
|
+
};
|
|
8
|
+
export type State = {
|
|
9
|
+
duplicateRecordIds: Set<string>;
|
|
10
|
+
duplicateValues: MutableRefObject<DuplicateValuesCollection>;
|
|
11
|
+
fieldsWithUniquenessConstraints: MutableRefObject<Field[]>;
|
|
12
|
+
calculateDuplicateRecords: () => void;
|
|
13
|
+
updateDuplicateValues: (oldRecord: RecordDataSet, newRecord: RecordDataSet, initialValidation: boolean, updateRecordAndRevalidate: (record: RecordDataSet) => void) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare const DuplicateDataContext: React.Context<State>;
|
|
16
|
+
export declare const DuplicateDataContextProvider: ({ fields, isReadOnly, children, }: DuplicateDataProps) => JSX.Element;
|
|
17
|
+
export declare const useDuplicateDataContext: () => State;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { useMemo, useRef, useState, createContext, useContext, } from "react";
|
|
14
|
+
import { RecordHashCalculator } from "../SpreadsheetContextProvider/hashCalculators";
|
|
15
|
+
import { useDataSetContext } from "../DataSetContextProvider";
|
|
16
|
+
export var DuplicateDataContext = createContext({});
|
|
17
|
+
export var DuplicateDataContextProvider = function (_a) {
|
|
18
|
+
var fields = _a.fields, isReadOnly = _a.isReadOnly, children = _a.children;
|
|
19
|
+
var _b = useState(new Set()), duplicateRecordIds = _b[0], setDuplicateRecordIds = _b[1];
|
|
20
|
+
var _c = useDataSetContext(), dataSet = _c.dataSet, getRecord = _c.getRecord;
|
|
21
|
+
var duplicateValues = useRef({});
|
|
22
|
+
var fieldsWithUniquenessConstraints = useRef([]);
|
|
23
|
+
var reset = function () {
|
|
24
|
+
fieldsWithUniquenessConstraints.current = [];
|
|
25
|
+
duplicateValues.current = {};
|
|
26
|
+
setDuplicateRecordIds(new Set());
|
|
27
|
+
};
|
|
28
|
+
var calculateFieldsWithUniquenessConstraints = function () {
|
|
29
|
+
var uniqueFields = fields.filter(function (f) {
|
|
30
|
+
if (!f.validations)
|
|
31
|
+
return;
|
|
32
|
+
return (f.validations.find(function (v) {
|
|
33
|
+
return (["unique_case_sensitive", "unique_case_insensitive"].indexOf(v.validation_type) >= 0);
|
|
34
|
+
}) !== undefined);
|
|
35
|
+
});
|
|
36
|
+
fieldsWithUniquenessConstraints.current = uniqueFields;
|
|
37
|
+
};
|
|
38
|
+
var updateDuplicateValues = function (oldRecord, newRecord, initialValidation, updateRecordAndRevalidate) {
|
|
39
|
+
fieldsWithUniquenessConstraints.current.forEach(function (f) {
|
|
40
|
+
duplicateValues.current[f.name] = duplicateValues.current[f.name] || {};
|
|
41
|
+
var duplicatesForField = duplicateValues.current[f.name];
|
|
42
|
+
var isCaseInsensitive = f.validations.find(function (v) { return v.validation_type === "unique_case_insensitive"; }) !== undefined;
|
|
43
|
+
var recordId = oldRecord._meta.id;
|
|
44
|
+
var oldValue = oldRecord[f.name];
|
|
45
|
+
var newValue = newRecord[f.name];
|
|
46
|
+
if (newValue === oldValue && !initialValidation) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (oldValue && !initialValidation) {
|
|
50
|
+
var oldValueAccessor = isCaseInsensitive
|
|
51
|
+
? oldValue.toLowerCase()
|
|
52
|
+
: oldValue;
|
|
53
|
+
if (duplicatesForField[oldValueAccessor]) {
|
|
54
|
+
var oldIndex = duplicatesForField[oldValueAccessor].indexOf(recordId);
|
|
55
|
+
if (oldIndex >= 0) {
|
|
56
|
+
duplicatesForField[oldValueAccessor].splice(oldIndex, 1);
|
|
57
|
+
}
|
|
58
|
+
if (duplicatesForField[oldValueAccessor].length === 1) {
|
|
59
|
+
var remainingRecordId = duplicatesForField[oldValueAccessor][0];
|
|
60
|
+
updateRecordAndRevalidate(getRecord(remainingRecordId));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (newValue) {
|
|
65
|
+
var newValueAccessor = isCaseInsensitive
|
|
66
|
+
? newValue.toLowerCase()
|
|
67
|
+
: newValue;
|
|
68
|
+
duplicatesForField[newValueAccessor] =
|
|
69
|
+
duplicatesForField[newValueAccessor] || [];
|
|
70
|
+
duplicatesForField[newValueAccessor].push(recordId);
|
|
71
|
+
if (duplicatesForField[newValueAccessor].length === 2) {
|
|
72
|
+
var firstRecordIdToHaveValue = duplicatesForField[newValueAccessor][0];
|
|
73
|
+
updateRecordAndRevalidate(getRecord(firstRecordIdToHaveValue));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
var calculateDuplicateRecords = function () {
|
|
79
|
+
var computeHashesForRecords = RecordHashCalculator().computeHashesForRecords;
|
|
80
|
+
computeHashesForRecords(dataSet.current, fields, function (hashes) {
|
|
81
|
+
var duplicateIds = hashes.map(function (hash) { return hash["id"]; });
|
|
82
|
+
setDuplicateRecordIds(new Set(duplicateIds));
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
useMemo(function () {
|
|
86
|
+
if (dataSet.current && !isReadOnly) {
|
|
87
|
+
reset();
|
|
88
|
+
calculateDuplicateRecords();
|
|
89
|
+
calculateFieldsWithUniquenessConstraints();
|
|
90
|
+
}
|
|
91
|
+
}, [dataSet.current]);
|
|
92
|
+
var value = {
|
|
93
|
+
duplicateRecordIds: duplicateRecordIds,
|
|
94
|
+
duplicateValues: duplicateValues,
|
|
95
|
+
fieldsWithUniquenessConstraints: fieldsWithUniquenessConstraints,
|
|
96
|
+
calculateDuplicateRecords: calculateDuplicateRecords,
|
|
97
|
+
updateDuplicateValues: updateDuplicateValues,
|
|
98
|
+
};
|
|
99
|
+
return (_jsx(DuplicateDataContext.Provider, __assign({ value: value }, { children: children })));
|
|
100
|
+
};
|
|
101
|
+
export var useDuplicateDataContext = function () { return useContext(DuplicateDataContext); };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { MutableRefObject } from "react";
|
|
2
|
+
import { SpreadsheetFilter } from "../SpreadsheetContextProvider/useSpreadsheetFilter";
|
|
3
|
+
import { SortBy } from "../common/types";
|
|
4
|
+
export type State = {
|
|
5
|
+
filteredDataIds: string[];
|
|
6
|
+
filteredInputValue: string;
|
|
7
|
+
setFilteredInputValue: (value: string) => void;
|
|
8
|
+
sortByFieldErrors: string;
|
|
9
|
+
sortByFieldWarnings: string;
|
|
10
|
+
handleSortByFieldErrors: (field: string) => void;
|
|
11
|
+
handleSortByFieldWarnings: (field: string) => void;
|
|
12
|
+
resetSpreadsheetFilter: () => void;
|
|
13
|
+
filterRecordsByRowType: (filterByRow: string) => void;
|
|
14
|
+
filterRecordsByFieldErrors: (filterByColumn: string) => void;
|
|
15
|
+
sortBy: SortBy;
|
|
16
|
+
setSortBy: React.Dispatch<React.SetStateAction<SortBy>>;
|
|
17
|
+
spreadsheetFilter: SpreadsheetFilter;
|
|
18
|
+
isFiltering: boolean;
|
|
19
|
+
lastFilteredRecordId: MutableRefObject<string>;
|
|
20
|
+
setRecalculateFilters: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
|
+
};
|
|
22
|
+
type ContextArgs = {
|
|
23
|
+
getSortCompareFn: any;
|
|
24
|
+
children: any;
|
|
25
|
+
};
|
|
26
|
+
export declare const FilteredDataContext: React.Context<State>;
|
|
27
|
+
export declare const FilteredDataContextProvider: ({ getSortCompareFn, children, }: ContextArgs) => JSX.Element;
|
|
28
|
+
export declare const useFilteredDataContext: () => State;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
|
|
14
|
+
import { useEventManagerContext } from "../../../../common/EventManagerContextProvider";
|
|
15
|
+
import { useDataSetContext } from "../DataSetContextProvider";
|
|
16
|
+
import { useDuplicateDataContext } from "../DuplicateDataContextProvider";
|
|
17
|
+
import { getFilterConditions } from "../SpreadsheetContextProvider/filterMethods";
|
|
18
|
+
import { useSpreadsheetFilter, } from "../SpreadsheetContextProvider/useSpreadsheetFilter";
|
|
19
|
+
import { useValidationContext } from "../ValidationContextProvider";
|
|
20
|
+
var getDefaultSortCompareFn = function (sortBy) {
|
|
21
|
+
return function (a, b) {
|
|
22
|
+
var aField = a[sortBy.field];
|
|
23
|
+
var bField = b[sortBy.field];
|
|
24
|
+
if (aField === bField)
|
|
25
|
+
return a._meta.rowIndex > b._meta.rowIndex ? 1 : -1;
|
|
26
|
+
if (!aField)
|
|
27
|
+
return 1;
|
|
28
|
+
if (!bField)
|
|
29
|
+
return -1;
|
|
30
|
+
if (sortBy.direction === "asc")
|
|
31
|
+
return aField > bField ? 1 : -1;
|
|
32
|
+
return aField < bField ? 1 : -1;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export var FilteredDataContext = createContext({});
|
|
36
|
+
export var FilteredDataContextProvider = function (_a) {
|
|
37
|
+
var _b = _a.getSortCompareFn, getSortCompareFn = _b === void 0 ? getDefaultSortCompareFn : _b, children = _a.children;
|
|
38
|
+
var _c = useSpreadsheetFilter(), spreadsheetFilter = _c.spreadsheetFilter, filterRecordsByRowType = _c.filterRecordsByRowType, filterRecordsByFieldErrors = _c.filterRecordsByFieldErrors, resetSpreadsheetFilter = _c.resetSpreadsheetFilter;
|
|
39
|
+
var _d = useState(""), filteredInputValue = _d[0], setFilteredInputValue = _d[1];
|
|
40
|
+
var _e = useState(null), sortByFieldErrors = _e[0], setSortByFieldErrors = _e[1];
|
|
41
|
+
var _f = useState(null), sortByFieldWarnings = _f[0], setSortByFieldWarnings = _f[1];
|
|
42
|
+
var _g = useState(null), sortBy = _g[0], setSortBy = _g[1];
|
|
43
|
+
var _h = useState(false), recalculateFilters = _h[0], setRecalculateFilters = _h[1];
|
|
44
|
+
var lastFilteredRecordId = useRef(null);
|
|
45
|
+
var _j = useEventManagerContext(), on = _j.on, off = _j.off, EVENTS = _j.EVENTS;
|
|
46
|
+
var _k = useDataSetContext(), getRecord = _k.getRecord, dataSet = _k.dataSet;
|
|
47
|
+
var duplicateRecordIds = useDuplicateDataContext().duplicateRecordIds;
|
|
48
|
+
var _l = useValidationContext(), errors = _l.errors, warnings = _l.warnings;
|
|
49
|
+
var reset = function () {
|
|
50
|
+
resetSpreadsheetFilter();
|
|
51
|
+
setFilteredInputValue("");
|
|
52
|
+
setSortByFieldErrors(null);
|
|
53
|
+
setSortBy(null);
|
|
54
|
+
};
|
|
55
|
+
var sortByFieldError = function (a, b, errors, warnings, sortByFieldErrors, sortByFieldWarnings) {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
var aRecordId = a._meta.id;
|
|
58
|
+
var bRecordId = b._meta.id;
|
|
59
|
+
var aHasErrors = !!((_a = (sortByFieldErrors
|
|
60
|
+
? errors.current
|
|
61
|
+
: warnings.current)[aRecordId]) === null || _a === void 0 ? void 0 : _a[sortByFieldErrors || sortByFieldWarnings]);
|
|
62
|
+
var bHasErrors = !!((_b = (sortByFieldErrors
|
|
63
|
+
? errors.current
|
|
64
|
+
: warnings.current)[bRecordId]) === null || _b === void 0 ? void 0 : _b[sortByFieldErrors || sortByFieldWarnings]);
|
|
65
|
+
if (aHasErrors === bHasErrors) {
|
|
66
|
+
return a._meta.rowIndex > b._meta.rowIndex ? 1 : -1;
|
|
67
|
+
}
|
|
68
|
+
return bHasErrors ? 1 : -1;
|
|
69
|
+
};
|
|
70
|
+
var recalculateFilteredIds = function () {
|
|
71
|
+
var filterConditions = getFilterConditions(spreadsheetFilter, getRecord, errors, filteredInputValue, duplicateRecordIds);
|
|
72
|
+
var ids = [];
|
|
73
|
+
var lastRecordId;
|
|
74
|
+
var _loop_1 = function (key) {
|
|
75
|
+
if (filterConditions.every(function (condition) { return condition(key); })) {
|
|
76
|
+
lastRecordId = key;
|
|
77
|
+
ids.push(key);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
for (var key in dataSet.current) {
|
|
81
|
+
_loop_1(key);
|
|
82
|
+
}
|
|
83
|
+
lastFilteredRecordId.current = lastRecordId;
|
|
84
|
+
if (sortBy) {
|
|
85
|
+
ids.sort(function (a, b) { return getSortCompareFn(sortBy)(getRecord(a), getRecord(b)); });
|
|
86
|
+
}
|
|
87
|
+
else if (!!sortByFieldErrors || !!sortByFieldWarnings) {
|
|
88
|
+
ids.sort(function (a, b) {
|
|
89
|
+
return sortByFieldError(getRecord(a), getRecord(b), errors, warnings, sortByFieldErrors, sortByFieldWarnings);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return ids;
|
|
93
|
+
};
|
|
94
|
+
var filteredDataIds = useMemo(function () {
|
|
95
|
+
return recalculateFilteredIds();
|
|
96
|
+
}, [
|
|
97
|
+
filteredInputValue,
|
|
98
|
+
spreadsheetFilter,
|
|
99
|
+
sortBy,
|
|
100
|
+
dataSet.current,
|
|
101
|
+
duplicateRecordIds.size,
|
|
102
|
+
sortByFieldErrors,
|
|
103
|
+
sortByFieldWarnings,
|
|
104
|
+
recalculateFilters,
|
|
105
|
+
]);
|
|
106
|
+
useEffect(function () {
|
|
107
|
+
reset();
|
|
108
|
+
setRecalculateFilters(function (prev) { return !prev; });
|
|
109
|
+
}, [dataSet.current]);
|
|
110
|
+
useEffect(function () {
|
|
111
|
+
var listener = function () {
|
|
112
|
+
setRecalculateFilters(function (prev) { return !prev; });
|
|
113
|
+
};
|
|
114
|
+
on(EVENTS.ON_LAST_ROW_CHANGED, listener);
|
|
115
|
+
return function () {
|
|
116
|
+
off(EVENTS.ON_LAST_ROW_CHANGED, listener);
|
|
117
|
+
};
|
|
118
|
+
}, []);
|
|
119
|
+
var isFiltering = useMemo(function () { return !!filteredInputValue; }, [filteredInputValue]);
|
|
120
|
+
var handleSortByFieldErrors = useCallback(function (field) {
|
|
121
|
+
setSortByFieldErrors(field === sortByFieldErrors ? null : field);
|
|
122
|
+
setSortByFieldWarnings(null);
|
|
123
|
+
setSortBy(null);
|
|
124
|
+
}, [sortByFieldErrors]);
|
|
125
|
+
var handleSortByFieldWarnings = useCallback(function (field) {
|
|
126
|
+
setSortByFieldWarnings(field === sortByFieldWarnings ? null : field);
|
|
127
|
+
setSortByFieldErrors(null);
|
|
128
|
+
setSortBy(null);
|
|
129
|
+
}, [sortByFieldWarnings]);
|
|
130
|
+
var value = {
|
|
131
|
+
filteredDataIds: filteredDataIds,
|
|
132
|
+
filteredInputValue: filteredInputValue,
|
|
133
|
+
setFilteredInputValue: setFilteredInputValue,
|
|
134
|
+
sortByFieldErrors: sortByFieldErrors,
|
|
135
|
+
sortByFieldWarnings: sortByFieldWarnings,
|
|
136
|
+
handleSortByFieldErrors: handleSortByFieldErrors,
|
|
137
|
+
handleSortByFieldWarnings: handleSortByFieldWarnings,
|
|
138
|
+
resetSpreadsheetFilter: resetSpreadsheetFilter,
|
|
139
|
+
filterRecordsByRowType: filterRecordsByRowType,
|
|
140
|
+
filterRecordsByFieldErrors: filterRecordsByFieldErrors,
|
|
141
|
+
sortBy: sortBy,
|
|
142
|
+
setSortBy: setSortBy,
|
|
143
|
+
spreadsheetFilter: spreadsheetFilter,
|
|
144
|
+
isFiltering: isFiltering,
|
|
145
|
+
lastFilteredRecordId: lastFilteredRecordId,
|
|
146
|
+
setRecalculateFilters: setRecalculateFilters,
|
|
147
|
+
};
|
|
148
|
+
return (_jsx(FilteredDataContext.Provider, __assign({ value: value }, { children: children })));
|
|
149
|
+
};
|
|
150
|
+
export var useFilteredDataContext = function () { return useContext(FilteredDataContext); };
|