fuse-importer 0.26.7 → 0.26.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 (65) hide show
  1. package/lib/esm/Importer/ImporterWithContext.js +13 -11
  2. package/lib/esm/Importer/Review/ReviewContextProvider.d.ts +3 -2
  3. package/lib/esm/Importer/Review/ReviewContextProvider.js +20 -20
  4. package/lib/esm/Importer/Stepper/index.js +14 -13
  5. package/lib/esm/Importer/Uploader/HeadersPreview.js +16 -8
  6. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.d.ts +5 -0
  7. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/filterMethods.js +56 -0
  8. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.d.ts → SpreadsheetContextProvider/index.d.ts} +12 -8
  9. package/lib/esm/Importer/common/Spreadsheet/{SpreadsheetContextProvider.js → SpreadsheetContextProvider/index.js} +28 -18
  10. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.d.ts +14 -0
  11. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/useSpreadsheetFilter.js +45 -0
  12. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.d.ts +2 -0
  13. package/lib/esm/Importer/common/Spreadsheet/SpreadsheetContextProvider/utils.js +14 -0
  14. package/lib/esm/Importer/common/Spreadsheet/common/types.d.ts +2 -2
  15. package/lib/esm/Importer/common/Spreadsheet/components/FieldHeader.js +5 -2
  16. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.d.ts +2 -1
  17. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetData.js +9 -4
  18. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.d.ts +1 -2
  19. package/lib/esm/Importer/common/Spreadsheet/components/SpreadsheetRowCheckboxes.js +18 -13
  20. package/lib/esm/Importer/common/Spreadsheet/hooks.d.ts +1 -3
  21. package/lib/esm/Importer/common/Spreadsheet/hooks.js +7 -4
  22. package/lib/esm/Importer/common/Spreadsheet/index.js +1 -1
  23. package/lib/esm/Importer/common/Spreadsheet/styles.d.ts +1 -1
  24. package/lib/esm/Importer/common/Spreadsheet/transformation/index.d.ts +7 -0
  25. package/lib/esm/Importer/common/Spreadsheet/transformation/index.js +25 -0
  26. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.d.ts +8 -0
  27. package/lib/esm/Importer/common/Spreadsheet/transformation/transformators.js +106 -0
  28. package/lib/esm/Importer/contexts/ImporterContextProvider.d.ts +6 -2
  29. package/lib/esm/Importer/contexts/ImporterContextProvider.js +26 -22
  30. package/lib/esm/Importer/data/index.d.ts +19 -3
  31. package/lib/esm/Importer/data/index.js +29 -30
  32. package/lib/esm/Importer/index.js +1 -1
  33. package/lib/esm/common/Table/TableActions/FilterByErrors/FilterByErrors.js +9 -5
  34. package/lib/esm/common/Table/TableActions/RowFilters.d.ts +1 -0
  35. package/lib/esm/common/Table/TableActions/RowFilters.js +42 -0
  36. package/lib/esm/common/Table/TableActions/TableActions.js +2 -1
  37. package/lib/esm/common/Table/TableActions/hooks.d.ts +0 -2
  38. package/lib/esm/common/Table/TableActions/hooks.js +0 -39
  39. package/lib/esm/common/Table/TableView/TableRows/TableRow.d.ts +2 -2
  40. package/lib/esm/common/Table/TableView/TableRows/TableRow.js +4 -4
  41. package/lib/esm/common/Table/TableView/TableRows/index.js +7 -4
  42. package/lib/esm/common/Table/TableView/index.d.ts +1 -1
  43. package/lib/esm/common/Table/TableView/index.js +1 -2
  44. package/lib/esm/common/Table/TableView/types.d.ts +0 -1
  45. package/lib/esm/common/columnsTransformations.d.ts +15 -0
  46. package/lib/esm/common/columnsTransformations.js +92 -0
  47. package/lib/esm/common/columnsValidations.js +83 -3
  48. package/lib/esm/common/index.d.ts +1 -0
  49. package/lib/esm/common/index.js +1 -0
  50. package/lib/esm/common/inputs/Autocomplete.js +1 -1
  51. package/lib/esm/common/inputs/Checkbox.js +1 -1
  52. package/lib/esm/index.d.ts +3 -2
  53. package/lib/esm/index.js +15 -24
  54. package/lib/esm/locales/de.d.ts +5 -0
  55. package/lib/esm/locales/de.js +6 -1
  56. package/lib/esm/locales/en.d.ts +5 -0
  57. package/lib/esm/locales/en.js +6 -1
  58. package/lib/esm/locales/es.d.ts +5 -0
  59. package/lib/esm/locales/es.js +6 -1
  60. package/lib/esm/locales/fr.d.ts +5 -0
  61. package/lib/esm/locales/fr.js +6 -1
  62. package/lib/esm/types.d.ts +36 -8
  63. package/lib/esm/types.js +15 -0
  64. package/lib/main.js +24 -24
  65. package/package.json +1 -1
@@ -18,6 +18,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
18
18
  }
19
19
  return to.concat(ar || Array.prototype.slice.call(from));
20
20
  };
21
+ import { transformRecord } from "../../Importer/common/Spreadsheet/transformation";
21
22
  import { FieldTypes, } from "../../types";
22
23
  import { parseValue } from "../common/Spreadsheet/common";
23
24
  var MINIMUM_ROW_COUNT = 20;
@@ -54,7 +55,7 @@ export var recordListToDataSet = function (data, fields) {
54
55
  return dataSet;
55
56
  }, {});
56
57
  };
57
- var transformToRecords = function (_a) {
58
+ export var transformToRecords = function (_a) {
58
59
  var templateHeaderMatchings = _a.templateHeaderMatchings, enumFieldValueMatchings = _a.enumFieldValueMatchings, templateHeaders = _a.templateHeaders, uploadedDataHeaders = _a.uploadedDataHeaders, uploadedData = _a.uploadedData, formatRecord = _a.formatRecord;
59
60
  var matchedColumnsLabels = Object.keys(templateHeaderMatchings)
60
61
  .filter(function (label) { return !!templateHeaderMatchings[label]; })
@@ -84,17 +85,14 @@ var transformToRecords = function (_a) {
84
85
  });
85
86
  return formatRecord ? formatRecord(record) : record;
86
87
  };
87
- return uploadedData.slice(1).map(getRecord);
88
+ return uploadedData.map(getRecord);
88
89
  };
89
90
  export var getPreviewDataSet = function (_a) {
90
91
  var uploadedData = _a.uploadedData;
91
- var getFirstRowLen = function () {
92
- if (uploadedData.length > 0 && Array.isArray(uploadedData[0])) {
93
- return uploadedData[0].length;
94
- }
95
- return 0;
96
- };
97
- var fields = new Array(getFirstRowLen()).fill(null).map(function (_, i) {
92
+ var rowLen = 0;
93
+ for (var i = 0; i < uploadedData.length; i++)
94
+ rowLen = Math.max(rowLen, uploadedData[i].length);
95
+ var fields = new Array(rowLen).fill(null).map(function (_, i) {
98
96
  var key = String.fromCharCode(65 + i);
99
97
  return {
100
98
  label: key,
@@ -104,9 +102,7 @@ export var getPreviewDataSet = function (_a) {
104
102
  };
105
103
  });
106
104
  var getInitialDataSet = function () {
107
- //Showing only the first 100 rows to improve performance
108
- //TODO: Check with Mike
109
- var data = uploadedData.slice(0, 100).map(function (row, index) {
105
+ var data = uploadedData.map(function (row, index) {
110
106
  var entry = addMeta({}, index);
111
107
  fields.forEach(function (field, index) {
112
108
  entry[field.name] = row[index];
@@ -117,10 +113,9 @@ export var getPreviewDataSet = function (_a) {
117
113
  };
118
114
  return { fields: fields, initialDataSet: getInitialDataSet() };
119
115
  };
120
- export var getReviewDataSet = function (_a) {
121
- var _b;
122
- var templateHeaderMatchings = _a.templateHeaderMatchings, enumFieldValueMatchings = _a.enumFieldValueMatchings, templateHeaders = _a.templateHeaders, uploadedDataHeaders = _a.uploadedDataHeaders, uploadedData = _a.uploadedData, formatRecord = _a.formatRecord;
123
- var fields = templateHeaders.map(function (templateHeader) { return ({
116
+ export var getTemplateFields = function (_a) {
117
+ var templateHeaders = _a.templateHeaders;
118
+ return templateHeaders.map(function (templateHeader) { return ({
124
119
  label: templateHeader.label,
125
120
  name: templateHeader.internal_key,
126
121
  type: FieldTypes[templateHeader.column_type] || FieldTypes.string,
@@ -128,24 +123,28 @@ export var getReviewDataSet = function (_a) {
128
123
  options: templateHeader.values,
129
124
  pattern: templateHeader.pattern,
130
125
  validations: templateHeader.validations,
126
+ transformations: templateHeader.transformations,
131
127
  }); });
132
- var records = transformToRecords({
133
- templateHeaderMatchings: templateHeaderMatchings,
134
- enumFieldValueMatchings: enumFieldValueMatchings,
135
- templateHeaders: templateHeaders,
136
- uploadedDataHeaders: uploadedDataHeaders,
137
- uploadedData: uploadedData,
138
- formatRecord: formatRecord,
139
- });
128
+ };
129
+ export var getReviewDataSet = function (_a) {
130
+ var _b;
131
+ var records = _a.records, fields = _a.fields;
132
+ for (var _i = 0, records_1 = records; _i < records_1.length; _i++) {
133
+ var record = records_1[_i];
134
+ transformRecord({
135
+ record: record,
136
+ fields: fields,
137
+ });
138
+ }
140
139
  var baseInitialDataSet = recordListToDataSet(addEmptyRows(records, fields), fields);
141
140
  var highestRowIndex = 0;
142
- for (var _i = 0, records_1 = records; _i < records_1.length; _i++) {
143
- var obj = records_1[_i];
144
- if (obj._meta && obj._meta.rowIndex > highestRowIndex) {
145
- highestRowIndex = obj._meta.rowIndex;
141
+ Object.keys(baseInitialDataSet).forEach(function (key) {
142
+ var record = baseInitialDataSet[key];
143
+ if (record._meta.rowIndex > highestRowIndex) {
144
+ highestRowIndex = record._meta.rowIndex;
146
145
  }
147
- }
146
+ });
148
147
  var emptyRowAtBottom = addMeta({}, highestRowIndex + 1);
149
148
  var initialDataSet = __assign(__assign({}, baseInitialDataSet), (_b = {}, _b[emptyRowAtBottom._meta.id] = emptyRowAtBottom, _b));
150
- return { fields: fields, initialDataSet: initialDataSet };
149
+ return { initialDataSet: initialDataSet };
151
150
  };
@@ -20,7 +20,7 @@ var p = function (path) { return "".concat(ACCOUNT_VIEW_PATH).concat(path); };
20
20
  export var TEMPLATES_ROUTE = p(ACCOUNT_ROUTES.TEMPLATES);
21
21
  var Importer = function (_a) {
22
22
  var templateSlug = _a.templateSlug, apiToken = _a.apiToken, options = _a.options, formatRecord = _a.formatRecord, onValidateRecord = _a.onValidateRecord, onSubmit = _a.onSubmit, onClose = _a.onClose, dynamicColumns = _a.dynamicColumns;
23
- return (_jsx(ImporterContextProvider, __assign({ options: options, templateSlug: templateSlug, apiToken: apiToken, formatRecord: formatRecord, onValidateRecord: onValidateRecord, onClose: onClose, onSubmit: onSubmit, dynamicColumns: dynamicColumns }, { children: _jsx(ImporterWithContext, {}) })));
23
+ return (_jsx(ImporterContextProvider, __assign({ initialRecords: options.records, options: options, templateSlug: templateSlug, apiToken: apiToken, formatRecord: formatRecord, onValidateRecord: onValidateRecord, onClose: onClose, onSubmit: onSubmit, dynamicColumns: dynamicColumns }, { children: _jsx(ImporterWithContext, {}) })));
24
24
  };
25
25
  export * from "./common/Spreadsheet";
26
26
  export * from "./common/utils";
@@ -6,12 +6,13 @@ import { useTranslation } from "react-i18next";
6
6
  import { addToast } from "../../../../common/Toast";
7
7
  import { useState } from "react";
8
8
  export var FilterByErrors = function () {
9
- var _a;
10
- var _b = useSpreadsheetContext(), errors = _b.errors, fields = _b.fields, selectedErrorToFilter = _b.selectedErrorToFilter, setSelectedErrorToFilter = _b.setSelectedErrorToFilter;
9
+ var _a, _b;
10
+ var _c = useSpreadsheetContext(), errors = _c.errors, fields = _c.fields, spreadsheetFilter = _c.spreadsheetFilter, resetSpreadsheetFilter = _c.resetSpreadsheetFilter, filterRecordsByFieldErrors = _c.filterRecordsByFieldErrors;
11
11
  var t = useTranslation("review").t;
12
- var _c = useState(false), isMenuOpened = _c[0], setIsMenuOpened = _c[1];
12
+ var _d = useState(false), isMenuOpened = _d[0], setIsMenuOpened = _d[1];
13
13
  var prefix = t("table_actions.filter_by_errors.filter_by_errors");
14
14
  var search_or_select = t("table_actions.filter_by_errors.search_or_select");
15
+ var selectedErrorToFilter = ((_a = spreadsheetFilter === null || spreadsheetFilter === void 0 ? void 0 : spreadsheetFilter.byColumn) === null || _a === void 0 ? void 0 : _a.field) || null;
15
16
  var getSelectedErrorLabel = function (selectedFieldName) {
16
17
  var _a;
17
18
  var selectedField = fields.filter(function (field) { return (field === null || field === void 0 ? void 0 : field.name) === selectedFieldName; });
@@ -21,15 +22,18 @@ export var FilterByErrors = function () {
21
22
  var onChange = function (selected) {
22
23
  if (selected) {
23
24
  var label = getSelectedErrorLabel(selected);
25
+ filterRecordsByFieldErrors(selected);
24
26
  addToast("Showing only the rows with error on the ".concat(label, " column"), "success");
25
27
  }
26
- setSelectedErrorToFilter(selected || "");
28
+ else {
29
+ resetSpreadsheetFilter();
30
+ }
27
31
  };
28
32
  var uniqueErrors = getUniqueErrors(fields, errors);
29
33
  var errorArray = formatErrors(fields, uniqueErrors);
30
34
  // the average size of each character in the input (in px)
31
35
  var widthPerCharacter = 5.8;
32
- var amountOfCharacters = prefix.length + ((_a = getSelectedErrorLabel(selectedErrorToFilter)) === null || _a === void 0 ? void 0 : _a.length);
36
+ var amountOfCharacters = prefix.length + ((_b = getSelectedErrorLabel(selectedErrorToFilter)) === null || _b === void 0 ? void 0 : _b.length);
33
37
  // 24 -> padding + 64px of the X icon area
34
38
  var totalWidth = widthPerCharacter * amountOfCharacters + 24 + 64;
35
39
  var inputWidth = selectedErrorToFilter ? "".concat(totalWidth, "px") : "fit-content";
@@ -0,0 +1 @@
1
+ export declare const RowFilters: () => JSX.Element;
@@ -0,0 +1,42 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ var __assign = (this && this.__assign) || function () {
6
+ __assign = Object.assign || function(t) {
7
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8
+ s = arguments[i];
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
10
+ t[p] = s[p];
11
+ }
12
+ return t;
13
+ };
14
+ return __assign.apply(this, arguments);
15
+ };
16
+ import { Fragment as _Fragment, jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
17
+ import styled, { css } from "styled-components";
18
+ import { useSpreadsheetContext } from "../../../Importer";
19
+ import { Div } from "../../../styled";
20
+ import { useTranslation } from "react-i18next";
21
+ var FilterContainer = styled(Div)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 6px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n ", ";\n ", "\n"], ["\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 6px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n ", ";\n ", "\n"])), function (p) { return p.theme.css.body3; }, function (p) {
22
+ return p.isSelected && css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n background: ", ";\n color: ", ";\n border-radius: 4px;\n "], ["\n background: ", ";\n color: ", ";\n border-radius: 4px;\n "])), function (p) { return p.theme.colors.black; }, function (p) { return p.theme.colors.white; });
23
+ });
24
+ var Container = styled(Div)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n border-radius: 4px;\n background-color: ", ";\n"], ["\n display: flex;\n border-radius: 4px;\n background-color: ", ";\n"])), function (p) { return p.theme.colors.backgroundInterface; });
25
+ var FilteredDataCount = styled(Div)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n background: ", ";\n color: ", ";\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 8px;\n margin-left: -3px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n"], ["\n background: ", ";\n color: ", ";\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 8px;\n margin-left: -3px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n"])), function (p) { return p.theme.colors.highlight01; }, function (p) { return p.theme.colors.black; });
26
+ var Filter = function (_a) {
27
+ var label = _a.label, count = _a.count, isSelected = _a.isSelected, onClick = _a.onClick;
28
+ var _b = useSpreadsheetContext(), filteredInputValue = _b.filteredInputValue, filteredDataCount = _b.filteredDataCount;
29
+ var labelToId = function (label) {
30
+ return label.toLowerCase().replace(/\s/g, "_") + "_filter";
31
+ };
32
+ return (_jsxs(Div, __assign({ dflex: true, clickable: true, onClick: onClick, "data-test-id": labelToId(label) }, { children: [_jsxs(FilterContainer, __assign({ isSelected: isSelected }, { children: [label, count >= 0 && _jsxs(_Fragment, { children: ["\u00A0(", count, ")"] })] })), isSelected && filteredInputValue !== "" && (_jsx(FilteredDataCount, { children: _jsx(Div, __assign({ minw: 14, centered: true }, { children: filteredDataCount })) }))] })));
33
+ };
34
+ export var RowFilters = function () {
35
+ var _a = useSpreadsheetContext(), spreadsheetFilter = _a.spreadsheetFilter, errors = _a.errors, filterRecordsByRowType = _a.filterRecordsByRowType, recordsWithValuesCount = _a.recordsWithValuesCount;
36
+ var t = useTranslation("review").t;
37
+ var all_rows = t("table_actions.filters_by_rows.all_rows");
38
+ var valid_rows = t("table_actions.filters_by_rows.valid_rows");
39
+ var invalid_rows = t("table_actions.filters_by_rows.invalid_rows");
40
+ return (_jsxs(Container, { children: [_jsx(Filter, { isSelected: spreadsheetFilter.byRow === "all", label: all_rows, count: recordsWithValuesCount, onClick: function () { return filterRecordsByRowType("all"); } }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "valid", label: valid_rows, onClick: function () { return filterRecordsByRowType("valid"); } }), _jsx(Filter, { isSelected: spreadsheetFilter.byRow === "invalid", label: invalid_rows, count: Object.values(errors).length, onClick: function () { return filterRecordsByRowType("invalid"); } })] }));
41
+ };
42
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -27,7 +27,8 @@ import { SearchRows } from "./SearchRows";
27
27
  import { ExportData } from "./ExportData";
28
28
  import { ButtonActionsContainer, TableActionsContainer, TableActionsContent, } from "./TableActions.styles";
29
29
  import { FilterByErrors } from "./FilterByErrors/FilterByErrors";
30
+ import { RowFilters } from "./RowFilters";
30
31
  export var TableActions = function (_a) {
31
32
  var _b = _a.tableActionsHeight, tableActionsHeight = _b === void 0 ? defaultTableActionsHeightPx : _b, props = __rest(_a, ["tableActionsHeight"]);
32
- return (_jsx(TableActionsContainer, __assign({ height: tableActionsHeight }, props, { children: _jsxs(TableActionsContent, { children: [_jsx(SearchRows, {}), _jsx(FilterByErrors, {}), _jsxs(ButtonActionsContainer, { children: [_jsx(DeleteSelectedRows, {}), _jsx(ExportData, {})] })] }) })));
33
+ return (_jsx(TableActionsContainer, __assign({ height: tableActionsHeight }, props, { children: _jsxs(TableActionsContent, { children: [_jsx(SearchRows, {}), _jsx(RowFilters, {}), _jsx(FilterByErrors, {}), _jsxs(ButtonActionsContainer, { children: [_jsx(DeleteSelectedRows, {}), _jsx(ExportData, {})] })] }) })));
33
34
  };
@@ -14,7 +14,5 @@ interface UseTableActionsProps {
14
14
  }
15
15
  export declare const useTableActions: ({ setDataSet, setErrors, setWarnings, }: UseTableActionsProps) => {
16
16
  deleteRecords: (selectedRecords: string[], errors: BatchValidationErrors, warnings: BatchValidationErrors) => void;
17
- filterRecordsBySearchValue: (obj: RecordDataSet, value: string) => {};
18
- filterRecordsByError: (obj: RecordDataSet, keyToFilter: string, errors: BatchValidationErrors, fields: Field[]) => {};
19
17
  };
20
18
  export {};
@@ -22,17 +22,6 @@ var removeItemsFromObject = function (obj, idsToRemove) {
22
22
  }
23
23
  return newObj;
24
24
  };
25
- var isObject = function (value) {
26
- return typeof value === "object" && value !== null && !Array.isArray(value);
27
- };
28
- var includesSearchValue = function (value, searchValue) {
29
- if (typeof value === "string" || typeof value === "number") {
30
- var stringValue = String(value).toLowerCase();
31
- var searchValueLower = searchValue.toLowerCase();
32
- return stringValue.includes(searchValueLower);
33
- }
34
- return false;
35
- };
36
25
  export var useTableActions = function (_a) {
37
26
  var setDataSet = _a.setDataSet, setErrors = _a.setErrors, setWarnings = _a.setWarnings;
38
27
  // Delete records from dataSet and from validations
@@ -46,35 +35,7 @@ export var useTableActions = function (_a) {
46
35
  return newDataSet;
47
36
  });
48
37
  };
49
- // Filter records by search value
50
- var filterRecordsBySearchValue = function (obj, value) {
51
- var filteredObj = {};
52
- for (var _i = 0, _a = Object.entries(obj); _i < _a.length; _i++) {
53
- var _b = _a[_i], key = _b[0], currentObj = _b[1];
54
- if (!isObject(currentObj)) {
55
- continue;
56
- }
57
- var matches = Object.values(currentObj).some(function (propertyValue) {
58
- return includesSearchValue(propertyValue, value);
59
- });
60
- if (matches) {
61
- filteredObj[key] = currentObj;
62
- }
63
- }
64
- return filteredObj;
65
- };
66
- // Filter records by selected column error
67
- var filterRecordsByError = function (obj, keyToFilter, errors, fields) {
68
- var filteredObj = {};
69
- var filteredKeys = Object.keys(errors).filter(function (key) { var _a, _b; return ((_b = (_a = obj[key]) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.isInvalid) && errors[key][keyToFilter]; });
70
- for (var i = 0; i < filteredKeys.length; i++) {
71
- filteredObj[filteredKeys[i]] = obj[filteredKeys[i]];
72
- }
73
- return filteredObj;
74
- };
75
38
  return {
76
39
  deleteRecords: deleteRecords,
77
- filterRecordsBySearchValue: filterRecordsBySearchValue,
78
- filterRecordsByError: filterRecordsByError,
79
40
  };
80
41
  };
@@ -7,7 +7,7 @@ type TableViewRowProps = {
7
7
  isLast: boolean;
8
8
  };
9
9
  export declare const TableViewRow: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../../styled/utils").CSSProps & TableViewRowProps, never>;
10
- type Props = Pick<TableViewProps, "columns" | "onRowClick" | "highlightFirstRow"> & {
10
+ type Props = Pick<TableViewProps, "columns" | "onRowClick"> & {
11
11
  row: any;
12
12
  rowWidth: number;
13
13
  indexI: number;
@@ -15,5 +15,5 @@ type Props = Pick<TableViewProps, "columns" | "onRowClick" | "highlightFirstRow"
15
15
  getItemKey?: (row: any) => string;
16
16
  isRowSelected?: boolean;
17
17
  } & DivCSSProps;
18
- export declare const TableRow: ({ row, indexI, columns, isLast, highlightFirstRow, onRowClick, getItemKey, rowWidth, isRowSelected, ...props }: Props) => JSX.Element;
18
+ export declare const TableRow: ({ row, indexI, columns, isLast, onRowClick, getItemKey, rowWidth, isRowSelected, ...props }: Props) => JSX.Element;
19
19
  export {};
@@ -40,11 +40,11 @@ export var TableViewRow = styled(Div)(templateObject_3 || (templateObject_3 = __
40
40
  return p.isHighlighted && css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n background: ", ";\n box-shadow: inset 0 0 0 3px ", ";\n\n .input-content {\n background: transparent;\n border: none;\n box-shadow: none;\n\n &,\n input {\n color: ", ";\n }\n }\n "], ["\n background: ", ";\n box-shadow: inset 0 0 0 3px ", ";\n\n .input-content {\n background: transparent;\n border: none;\n box-shadow: none;\n\n &,\n input {\n color: ", ";\n }\n }\n "])), p.theme.colors.blue100, p.theme.colors.blue500, p.theme.colors.gray1000);
41
41
  });
42
42
  export var TableRow = function (_a) {
43
- var row = _a.row, indexI = _a.indexI, columns = _a.columns, isLast = _a.isLast, highlightFirstRow = _a.highlightFirstRow, onRowClick = _a.onRowClick, getItemKey = _a.getItemKey, rowWidth = _a.rowWidth, _b = _a.isRowSelected, isRowSelected = _b === void 0 ? false : _b, props = __rest(_a, ["row", "indexI", "columns", "isLast", "highlightFirstRow", "onRowClick", "getItemKey", "rowWidth", "isRowSelected"]);
44
- var isHighlighted = (indexI === 0 && highlightFirstRow) || isRowSelected;
45
- return (_jsx(TableViewRow, __assign({ "data-test-id": "row-".concat(indexI), dflex: true }, { isHighlighted: isHighlighted, isLast: isLast }, props, { children: columns.map(function (column, indexJ) {
43
+ var row = _a.row, indexI = _a.indexI, columns = _a.columns, isLast = _a.isLast, onRowClick = _a.onRowClick, getItemKey = _a.getItemKey, rowWidth = _a.rowWidth, _b = _a.isRowSelected, isRowSelected = _b === void 0 ? false : _b, props = __rest(_a, ["row", "indexI", "columns", "isLast", "onRowClick", "getItemKey", "rowWidth", "isRowSelected"]);
44
+ var isHighlighted = isRowSelected;
45
+ var key = getItemKey ? getItemKey(row) : "".concat(indexI);
46
+ return (_jsx(TableViewRow, __assign({ "data-test-id": "row-".concat(indexI), id: "row-id-".concat(key), dflex: true }, { isHighlighted: isHighlighted, isLast: isLast }, props, { children: columns.map(function (column, indexJ) {
46
47
  var Content = column.Content;
47
- var key = getItemKey ? getItemKey(row) : "".concat(indexI);
48
48
  var resolvedKey = "column-".concat(indexJ, "-row-").concat(key);
49
49
  var columnWidthPercentages = getColumnWidthsPx(columns, rowWidth);
50
50
  var columnWidthPercentage = columnWidthPercentages[indexJ];
@@ -10,17 +10,17 @@ 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 { CSS } from "@dnd-kit/utilities";
14
13
  import { useSortable } from "@dnd-kit/sortable";
14
+ import { CSS } from "@dnd-kit/utilities";
15
15
  import { Div } from "../../../../styled/utils";
16
- import { TableRow } from "./TableRow";
17
16
  import React from "react";
18
17
  import { areEqual } from "react-window";
19
18
  import { useSpreadsheetContext } from "../../../../Importer";
19
+ import { TableRow } from "./TableRow";
20
20
  var Row = React.memo(function (_a) {
21
21
  var _b;
22
22
  var data = _a.data, rowIndex = _a.rowIndex, style = _a.style;
23
- var items = data.items, rowWidth = data.rowWidth, isDraggable = data.isDraggable, onRowClick = data.onRowClick, columns = data.columns, highlightFirstRow = data.highlightFirstRow, rowHeight = data.rowHeight, getItemKey = data.getItemKey;
23
+ var items = data.items, rowWidth = data.rowWidth, isDraggable = data.isDraggable, onRowClick = data.onRowClick, columns = data.columns, rowHeight = data.rowHeight, getItemKey = data.getItemKey;
24
24
  var item = items[rowIndex];
25
25
  var selectedRows = useSpreadsheetContext().selectedRows;
26
26
  var isRowSelected = selectedRows === null || selectedRows === void 0 ? void 0 : selectedRows.includes((_b = item === null || item === void 0 ? void 0 : item._meta) === null || _b === void 0 ? void 0 : _b.id);
@@ -28,7 +28,10 @@ var Row = React.memo(function (_a) {
28
28
  var containerProps = { style: style };
29
29
  if (isDraggable)
30
30
  containerProps = __assign(__assign({}, containerProps), { item: item });
31
- return (_jsx(Container, __assign({}, containerProps, { children: _jsx(TableRow, { rowWidth: rowWidth, columns: columns, onRowClick: onRowClick, highlightFirstRow: highlightFirstRow, h: rowHeight, row: item, indexI: rowIndex, isLast: rowIndex === items.length - 1, pRelative: true, getItemKey: getItemKey, isRowSelected: isRowSelected || false }) })));
31
+ return (_jsx(Container, __assign({}, containerProps, { children: _jsx(TableRow, { rowWidth: rowWidth, columns: columns, onRowClick: onRowClick, h: rowHeight, row: item, indexI: rowIndex, isLast: rowIndex === items.length - 1, pRelative: true, getItemKey: getItemKey, isRowSelected: isRowSelected || false, className: rowIndex <
32
+ items.findIndex(function (item) { var _a; return ((_a = item === null || item === void 0 ? void 0 : item._meta) === null || _a === void 0 ? void 0 : _a.id) === (selectedRows === null || selectedRows === void 0 ? void 0 : selectedRows[0]); })
33
+ ? "before-selected-row"
34
+ : "" }) })));
32
35
  }, areEqual);
33
36
  var DraggableRow = React.memo(function (_a) {
34
37
  var item = _a.item, baseStyle = _a.style, children = _a.children;
@@ -8,4 +8,4 @@ type TableViewWrapperProps = {
8
8
  checkboxColumnWidth?: number;
9
9
  };
10
10
  export declare const TableViewWrapper: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, import("../../../styled/utils").CSSProps & TableViewWrapperProps, never>;
11
- export declare const TableView: React.MemoExoticComponent<({ data, columns, pageSize, onRowClick, sortBy, isLoading, highlightFirstRow, setSortBy, rowWidthScalingFactor, onSectionRendered, tableHeadersHeight, rowHeight, h, onTableScroll, getItemKey, isDraggable, checkboxColumnWidth, isFiltering, ...props }: TableViewProps) => JSX.Element>;
11
+ export declare const TableView: React.MemoExoticComponent<({ data, columns, pageSize, onRowClick, sortBy, isLoading, setSortBy, rowWidthScalingFactor, onSectionRendered, tableHeadersHeight, rowHeight, h, onTableScroll, getItemKey, isDraggable, checkboxColumnWidth, isFiltering, ...props }: TableViewProps) => JSX.Element>;
@@ -66,7 +66,7 @@ var buildGridStyles = function (rowWidthScalingFactor) {
66
66
  return gridStyles;
67
67
  };
68
68
  export var TableView = React.memo(function (_a) {
69
- var data = _a.data, columns = _a.columns, pageSize = _a.pageSize, _b = _a.onRowClick, onRowClick = _b === void 0 ? null : _b, _c = _a.sortBy, sortBy = _c === void 0 ? { field: null, direction: null } : _c, _d = _a.isLoading, isLoading = _d === void 0 ? false : _d, _e = _a.highlightFirstRow, highlightFirstRow = _e === void 0 ? false : _e, _f = _a.setSortBy, setSortBy = _f === void 0 ? null : _f, _g = _a.rowWidthScalingFactor, rowWidthScalingFactor = _g === void 0 ? 1 : _g, onSectionRendered = _a.onSectionRendered, _h = _a.tableHeadersHeight, tableHeadersHeight = _h === void 0 ? defaultTableHeaderHeightPx : _h, _j = _a.rowHeight, rowHeight = _j === void 0 ? defaultTableRowHeightPx : _j, _k = _a.h, h = _k === void 0 ? 500 : _k, _l = _a.onTableScroll, onTableScroll = _l === void 0 ? null : _l, _m = _a.getItemKey, getItemKey = _m === void 0 ? null : _m, _o = _a.isDraggable, isDraggable = _o === void 0 ? false : _o, checkboxColumnWidth = _a.checkboxColumnWidth, _p = _a.isFiltering, isFiltering = _p === void 0 ? false : _p, props = __rest(_a, ["data", "columns", "pageSize", "onRowClick", "sortBy", "isLoading", "highlightFirstRow", "setSortBy", "rowWidthScalingFactor", "onSectionRendered", "tableHeadersHeight", "rowHeight", "h", "onTableScroll", "getItemKey", "isDraggable", "checkboxColumnWidth", "isFiltering"]);
69
+ var data = _a.data, columns = _a.columns, pageSize = _a.pageSize, _b = _a.onRowClick, onRowClick = _b === void 0 ? null : _b, _c = _a.sortBy, sortBy = _c === void 0 ? { field: null, direction: null } : _c, _d = _a.isLoading, isLoading = _d === void 0 ? false : _d, _e = _a.setSortBy, setSortBy = _e === void 0 ? null : _e, _f = _a.rowWidthScalingFactor, rowWidthScalingFactor = _f === void 0 ? 1 : _f, onSectionRendered = _a.onSectionRendered, _g = _a.tableHeadersHeight, tableHeadersHeight = _g === void 0 ? defaultTableHeaderHeightPx : _g, _h = _a.rowHeight, rowHeight = _h === void 0 ? defaultTableRowHeightPx : _h, _j = _a.h, h = _j === void 0 ? 500 : _j, _k = _a.onTableScroll, onTableScroll = _k === void 0 ? null : _k, _l = _a.getItemKey, getItemKey = _l === void 0 ? null : _l, _m = _a.isDraggable, isDraggable = _m === void 0 ? false : _m, checkboxColumnWidth = _a.checkboxColumnWidth, _o = _a.isFiltering, isFiltering = _o === void 0 ? false : _o, props = __rest(_a, ["data", "columns", "pageSize", "onRowClick", "sortBy", "isLoading", "setSortBy", "rowWidthScalingFactor", "onSectionRendered", "tableHeadersHeight", "rowHeight", "h", "onTableScroll", "getItemKey", "isDraggable", "checkboxColumnWidth", "isFiltering"]);
70
70
  var headerContainerRef = useRef();
71
71
  var onScroll = function (_a) {
72
72
  var scrollTop = _a.scrollTop, scrollLeft = _a.scrollLeft;
@@ -107,7 +107,6 @@ export var TableView = React.memo(function (_a) {
107
107
  rowWidth: rowWidth,
108
108
  onRowClick: onRowClick,
109
109
  columns: columns,
110
- highlightFirstRow: highlightFirstRow,
111
110
  rowHeight: rowHeight,
112
111
  getItemKey: getItemKey,
113
112
  },
@@ -22,7 +22,6 @@ export type TableViewProps = {
22
22
  setSortBy?: React.Dispatch<React.SetStateAction<SortBy>>;
23
23
  isLoading?: boolean;
24
24
  pageSize?: number;
25
- highlightFirstRow?: boolean;
26
25
  rowWidthScalingFactor?: number;
27
26
  rowHeight?: number;
28
27
  tableHeadersHeight?: number;
@@ -0,0 +1,15 @@
1
+ import { TransformationOptionKeys, TransformationTypes } from "../types";
2
+ export type TransformationOption = {
3
+ type: "text" | "number";
4
+ key: TransformationOptionKeys;
5
+ tooltip: string;
6
+ };
7
+ export type Transformation = {
8
+ value: TransformationTypes;
9
+ label: string;
10
+ options?: TransformationOption[];
11
+ };
12
+ export declare const transformationsByColumnType: {
13
+ [key: string]: Transformation[];
14
+ };
15
+ export declare const transformationsByType: {};
@@ -0,0 +1,92 @@
1
+ var commonDateAndTimeTransformations = [
2
+ {
3
+ value: "autoformat",
4
+ label: "Autoformat",
5
+ },
6
+ ];
7
+ var stringTransformations = [
8
+ {
9
+ value: "sentence_case",
10
+ label: "Sentence Case",
11
+ },
12
+ {
13
+ value: "capitalize",
14
+ label: "Capitalize",
15
+ },
16
+ {
17
+ value: "uppercase",
18
+ label: "Uppercase",
19
+ },
20
+ {
21
+ value: "lowercase",
22
+ label: "Lowercase",
23
+ },
24
+ {
25
+ value: "trim_whitespace",
26
+ label: "Trim Whitespace",
27
+ },
28
+ ];
29
+ var urlTransformations = [
30
+ {
31
+ value: "prefix",
32
+ label: "Prefix",
33
+ options: [
34
+ {
35
+ key: "prefix",
36
+ type: "text",
37
+ tooltip: "Add Prefix (e.g., 'example.com' becomes 'https://example.com')",
38
+ },
39
+ ],
40
+ },
41
+ ];
42
+ var floatTransformations = [
43
+ {
44
+ value: "number_of_decimals",
45
+ label: "Number of Decimals",
46
+ options: [
47
+ {
48
+ key: "number_of_decimals",
49
+ type: "number",
50
+ tooltip: "Set Number of Decimals (e.g., '10.567' becomes '10.57' with 2 decimals)",
51
+ },
52
+ ],
53
+ },
54
+ ];
55
+ var integerTransformations = [
56
+ {
57
+ value: "round",
58
+ label: "Round",
59
+ },
60
+ {
61
+ value: "floor",
62
+ label: "Floor",
63
+ },
64
+ {
65
+ value: "ceiling",
66
+ label: "Ceiling",
67
+ },
68
+ ];
69
+ var enumTransformations = [
70
+ {
71
+ value: "autodetect",
72
+ label: "Autodetect",
73
+ },
74
+ ];
75
+ export var transformationsByColumnType = {
76
+ string: stringTransformations,
77
+ integer: integerTransformations,
78
+ float: floatTransformations,
79
+ enum: enumTransformations,
80
+ url: urlTransformations,
81
+ date: commonDateAndTimeTransformations,
82
+ datetime: commonDateAndTimeTransformations,
83
+ time: commonDateAndTimeTransformations,
84
+ };
85
+ // the final object will look like this:
86
+ // { autodetect: { value: "autodetect", label: "Autodetect" }, ... }
87
+ export var transformationsByType = Object.values(transformationsByColumnType)
88
+ .reduce(function (acc, arr) { return acc.concat(arr); }, [])
89
+ .reduce(function (result, p) {
90
+ result[p.value] = p;
91
+ return result;
92
+ }, {});
@@ -44,7 +44,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
44
44
  return to.concat(ar || Array.prototype.slice.call(from));
45
45
  };
46
46
  import * as yup from "yup";
47
- import { FieldTypes, mutableValidationTypes, } from "../types";
47
+ import { FieldTypes, mutableValidationTypes, mutableTransformationTypes, } from "../types";
48
48
  var commonValidations = [
49
49
  {
50
50
  value: "regex",
@@ -252,7 +252,7 @@ export var allowedPatterns = {
252
252
  };
253
253
  export var patternsColumnTypes = Object.keys(allowedPatterns);
254
254
  var iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
255
- var schema = yup
255
+ var validationsSchema = yup
256
256
  .mixed()
257
257
  .test("validations", "Invalid validations", function (value) {
258
258
  var isAnArray = Array.isArray(value);
@@ -263,6 +263,13 @@ var schema = yup
263
263
  var optionsPropertyIsNotRequiredFor = [
264
264
  "unique_case_insensitive",
265
265
  "unique_case_sensitive",
266
+ "integer",
267
+ "boolean",
268
+ "odd",
269
+ "even",
270
+ "email",
271
+ "url",
272
+ "float",
266
273
  ];
267
274
  if (mutableValidationTypes.includes(validation_type)) {
268
275
  if (optionsPropertyIsNotRequiredFor.includes(validation_type)) {
@@ -302,12 +309,85 @@ var schema = yup
302
309
  }
303
310
  return true;
304
311
  });
312
+ var transformationsOptionsPropIsRequiredFor = [
313
+ "prefix",
314
+ "number_of_decimals",
315
+ ];
316
+ var transformationsSchema = yup
317
+ .array()
318
+ .of(yup.object().shape({
319
+ transformation_type: yup
320
+ .string()
321
+ .oneOf(mutableTransformationTypes)
322
+ .required(),
323
+ options: yup.mixed().when("transformation_type", {
324
+ is: function (type) {
325
+ return transformationsOptionsPropIsRequiredFor.includes(type);
326
+ },
327
+ then: yup
328
+ .object()
329
+ .required("Options is required for this transformation type"),
330
+ }),
331
+ }))
332
+ .test("transformations", "Invalid transformations", function (value, context) {
333
+ var isAnArray = Array.isArray(value);
334
+ if (isAnArray) {
335
+ for (var _i = 0, value_2 = value; _i < value_2.length; _i++) {
336
+ var transformation = value_2[_i];
337
+ var transformation_type = transformation.transformation_type;
338
+ // if user is selecting autoformat (for date, datetime and time) but has not
339
+ // defined pattern, it should throw an error
340
+ if (transformation_type === "autoformat") {
341
+ var parentRecord = context.parent;
342
+ if (!(parentRecord === null || parentRecord === void 0 ? void 0 : parentRecord.pattern)) {
343
+ var columnType = parentRecord.column_type;
344
+ var availablePatternsForColumnType = null;
345
+ var getAvailablePatterns = function (patterns) {
346
+ var patternValues = patterns.map(function (pattern) { return pattern.value; });
347
+ return patternValues.join(", ");
348
+ };
349
+ switch (columnType) {
350
+ case "date":
351
+ availablePatternsForColumnType = getAvailablePatterns(datePatterns);
352
+ break;
353
+ case "datetime":
354
+ availablePatternsForColumnType = getAvailablePatterns(dateTimePatterns);
355
+ break;
356
+ case "time":
357
+ availablePatternsForColumnType = getAvailablePatterns(timePatterns);
358
+ break;
359
+ }
360
+ return this.createError({
361
+ path: "transformations",
362
+ message: "The selected transformation type requires you to specify a pattern to your column. Available patterns for your column_type: ".concat(availablePatternsForColumnType),
363
+ });
364
+ }
365
+ }
366
+ if (!mutableTransformationTypes.includes(transformation_type)) {
367
+ return this.createError({
368
+ path: "transformations",
369
+ message: "".concat(transformation_type, " is not a valid transformation type. Please check the values you inserted."),
370
+ });
371
+ }
372
+ }
373
+ return true;
374
+ }
375
+ var arrayIsNotDefined = !["undefined", "null"].includes(typeof value);
376
+ if (arrayIsNotDefined && !isAnArray) {
377
+ return this.createError({
378
+ path: "validations",
379
+ message: "Validations must be an array",
380
+ });
381
+ }
382
+ return true;
383
+ });
305
384
  var columnSchema = yup.object().shape({
306
385
  column_type: yup.string().oneOf(availableColumnTypes).required(),
307
386
  internal_key: yup.string().required(),
308
387
  label: yup.string().required(),
309
388
  required: yup.boolean().required(),
310
- validations: schema,
389
+ validations: validationsSchema,
390
+ transformations: transformationsSchema,
311
391
  });
312
392
  var dateColumnSchema = columnSchema.shape({
313
393
  pattern: yup.string().oneOf(datePatterns.map(function (p) { return p.value; })),
@@ -24,3 +24,4 @@ export * from "./Spinner";
24
24
  export * from "./TooltipProvider";
25
25
  export * from "./ConfirmationModal";
26
26
  export * from "./columnsValidations";
27
+ export * from "./columnsTransformations";
@@ -41,4 +41,5 @@ export * from "./Spinner";
41
41
  export * from "./TooltipProvider";
42
42
  export * from "./ConfirmationModal";
43
43
  export * from "./columnsValidations";
44
+ export * from "./columnsTransformations";
44
45
  var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;