@adaptabletools/adaptable 16.0.10-canary.0 → 16.1.0-canary.1

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 (103) hide show
  1. package/agGrid.d.ts +4 -0
  2. package/agGrid.js +4 -0
  3. package/base.css +2 -0
  4. package/base.css.map +1 -1
  5. package/bundle.cjs.js +162 -161
  6. package/index.css +4 -0
  7. package/index.css.map +1 -1
  8. package/package.json +1 -1
  9. package/publishTimestamp.d.ts +1 -1
  10. package/publishTimestamp.js +1 -1
  11. package/src/AdaptableOptions/AdaptableFrameworkComponent.d.ts +12 -1
  12. package/src/AdaptableOptions/AdaptableOptions.d.ts +5 -0
  13. package/src/AdaptableOptions/ChartingOptions.d.ts +44 -39
  14. package/src/AdaptableOptions/DataImportOptions.d.ts +67 -0
  15. package/src/AdaptableOptions/DataImportOptions.js +2 -0
  16. package/src/AdaptableOptions/MenuOptions.d.ts +147 -8
  17. package/src/AdaptableOptions/MenuOptions.js +75 -0
  18. package/src/Api/AdaptableApi.d.ts +5 -0
  19. package/src/Api/DataImportApi.d.ts +9 -0
  20. package/src/Api/DataImportApi.js +2 -0
  21. package/src/Api/Implementation/AdaptableApiImpl.d.ts +2 -0
  22. package/src/Api/Implementation/AdaptableApiImpl.js +2 -0
  23. package/src/Api/Implementation/DataImportApiImpl.d.ts +10 -0
  24. package/src/Api/Implementation/DataImportApiImpl.js +14 -0
  25. package/src/Api/Implementation/ExpressionApiImpl.js +1 -1
  26. package/src/Api/Implementation/OptionsApiImpl.d.ts +1 -0
  27. package/src/Api/Implementation/OptionsApiImpl.js +3 -0
  28. package/src/Api/Implementation/UserInterfaceApiImpl.d.ts +5 -1
  29. package/src/Api/Implementation/UserInterfaceApiImpl.js +22 -0
  30. package/src/Api/Internal/ChartingInternalApi.js +15 -15
  31. package/src/Api/Internal/DataImportInternalApi.d.ts +4 -0
  32. package/src/Api/Internal/DataImportInternalApi.js +53 -0
  33. package/src/Api/OptionsApi.d.ts +5 -0
  34. package/src/Api/UserInterfaceApi.d.ts +14 -0
  35. package/src/PredefinedConfig/Common/AdaptableIcon.d.ts +1 -1
  36. package/src/PredefinedConfig/Common/Menu.d.ts +1 -6
  37. package/src/PredefinedConfig/Common/Types.d.ts +4 -4
  38. package/src/PredefinedConfig/Common/Types.js +2 -0
  39. package/src/Strategy/ChartingModule.js +1 -1
  40. package/src/Strategy/DataImportModule.d.ts +11 -0
  41. package/src/Strategy/DataImportModule.js +36 -0
  42. package/src/Strategy/Fdc3Module.js +3 -2
  43. package/src/Strategy/LayoutModule.js +1 -0
  44. package/src/Utilities/Constants/ModuleConstants.d.ts +3 -0
  45. package/src/Utilities/Constants/ModuleConstants.js +4 -1
  46. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +2 -0
  47. package/src/Utilities/Defaults/DefaultSettingsPanel.js +1 -0
  48. package/src/Utilities/Helpers/AdaptableHelper.js +2 -0
  49. package/src/Utilities/Interface/MessagePopups.d.ts +2 -2
  50. package/src/Utilities/Services/ModuleService.js +2 -0
  51. package/src/View/AdaptableViewFactory.js +2 -0
  52. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/ExternalChartingWizard.js +1 -1
  53. package/src/View/Components/ExternalRenderer.d.ts +1 -0
  54. package/src/View/Components/ExternalRenderer.js +2 -1
  55. package/src/View/Components/Panels/PanelWithImage.js +3 -3
  56. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopup.js +1 -1
  57. package/src/View/Components/Popups/AdaptablePopup/Navigation.js +4 -1
  58. package/src/View/Components/Popups/AdaptablePopup/useMenuItems.js +3 -0
  59. package/src/View/Components/Popups/WindowPopups/WindowPopups.d.ts +1 -0
  60. package/src/View/Components/Popups/WindowPopups/WindowPopups.js +14 -4
  61. package/src/View/DataImport/DataImportPopup.d.ts +6 -0
  62. package/src/View/DataImport/DataImportPopup.js +32 -0
  63. package/src/View/DataImport/DataImportWizard/DataImportWizard.d.ts +8 -0
  64. package/src/View/DataImport/DataImportWizard/DataImportWizard.js +176 -0
  65. package/src/View/DataImport/DataImportWizard/index.d.ts +1 -0
  66. package/src/View/DataImport/DataImportWizard/index.js +4 -0
  67. package/src/View/DataImport/DataImportWizard/sections/DataPreview.d.ts +10 -0
  68. package/src/View/DataImport/DataImportWizard/sections/DataPreview.js +154 -0
  69. package/src/View/DataImport/DataImportWizard/sections/ImportSection.d.ts +9 -0
  70. package/src/View/DataImport/DataImportWizard/sections/ImportSection.js +24 -0
  71. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadFileSection.d.ts +8 -0
  72. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadFileSection.js +11 -0
  73. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadSection.d.ts +13 -0
  74. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadSection.js +23 -0
  75. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadTextSection.d.ts +8 -0
  76. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadTextSection.js +13 -0
  77. package/src/View/DataImport/DataImportWizard/sections/UploadSection/index.d.ts +1 -0
  78. package/src/View/DataImport/DataImportWizard/sections/UploadSection/index.js +4 -0
  79. package/src/View/DataImport/DataImportWizard/sections/ValidationSection.d.ts +11 -0
  80. package/src/View/DataImport/DataImportWizard/sections/ValidationSection.js +35 -0
  81. package/src/View/DataImport/systemFileHandlers.d.ts +3 -0
  82. package/src/View/DataImport/systemFileHandlers.js +44 -0
  83. package/src/View/Wizard/OnePageAdaptableWizard.d.ts +1 -0
  84. package/src/View/Wizard/OnePageWizards.d.ts +1 -0
  85. package/src/View/Wizard/OnePageWizards.js +2 -2
  86. package/src/agGrid/agGridHelper.js +2 -0
  87. package/src/agGrid/agGridMenuHelper.d.ts +20 -9
  88. package/src/agGrid/agGridMenuHelper.js +288 -133
  89. package/src/components/FileDroppable/index.d.ts +2 -1
  90. package/src/components/FileDroppable/index.js +8 -7
  91. package/src/components/icons/import.d.ts +3 -0
  92. package/src/components/icons/import.js +7 -0
  93. package/src/components/icons/index.js +2 -0
  94. package/src/metamodel/adaptable.metamodel.d.ts +171 -2
  95. package/src/metamodel/adaptable.metamodel.js +1 -1
  96. package/src/parser/src/index.d.ts +2 -2
  97. package/src/parser/src/index.js +4 -4
  98. package/src/parser/src/tokenizer.d.ts +1 -1
  99. package/src/parser/src/tokenizer.js +14 -6
  100. package/src/parser/src/types.d.ts +2 -2
  101. package/src/types.d.ts +5 -4
  102. package/version.d.ts +1 -1
  103. package/version.js +1 -1
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataImportWizard = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const HelpBlock_1 = tslib_1.__importDefault(require("../../../components/HelpBlock"));
7
+ const Tag_1 = require("../../../components/Tag");
8
+ const ObjectFactory_1 = require("../../../Utilities/ObjectFactory");
9
+ const AdaptableContext_1 = require("../../AdaptableContext");
10
+ const OnePageAdaptableWizard_1 = require("../../Wizard/OnePageAdaptableWizard");
11
+ const systemFileHandlers_1 = require("../systemFileHandlers");
12
+ const UploadSection_1 = require("./sections/UploadSection");
13
+ const ValidationSection_1 = require("./sections/ValidationSection");
14
+ const DataImportWizard = (props) => {
15
+ var _a;
16
+ const adaptable = (0, AdaptableContext_1.useAdaptable)();
17
+ const primaryKey = adaptable.api.optionsApi.getPrimaryKey();
18
+ const dataImportOptions = adaptable.api.optionsApi.getDataImportOptions();
19
+ const module = adaptable.ModuleService.getModuleById('DataImport');
20
+ const [rowData, setRowData] = React.useState(null);
21
+ const [file, setFile] = React.useState(null);
22
+ const [text, setText] = React.useState('');
23
+ const [importType, setImportType] = React.useState('file');
24
+ const handleRowDataChange = React.useCallback((data) => {
25
+ if (Array.isArray(data)) {
26
+ setRowData(data);
27
+ }
28
+ else {
29
+ setRowData(null);
30
+ }
31
+ }, []);
32
+ const handleChangeImportType = React.useCallback((importType) => {
33
+ setImportType(importType);
34
+ // clear data
35
+ handleRowDataChange(null);
36
+ setFile(null);
37
+ setText('');
38
+ }, []);
39
+ // ---- FILE HANDLERS ----
40
+ const fileHandlers = React.useMemo(() => {
41
+ var _a, _b;
42
+ const userDefinedHandlers = (_b = (_a = adaptable.api.optionsApi.getDataImportOptions()) === null || _a === void 0 ? void 0 : _a.fileHandlers) !== null && _b !== void 0 ? _b : [];
43
+ return [...userDefinedHandlers, ...systemFileHandlers_1.systemFileHandlers];
44
+ }, []);
45
+ const supportedFileFormats = React.useMemo(() => {
46
+ return fileHandlers.map((h) => h.fileExtension).join(', ');
47
+ }, [fileHandlers]);
48
+ const readFile = React.useCallback(async (file) => {
49
+ var _a, _b;
50
+ const userDefinedFileHandlers = (_b = (_a = adaptable.api.optionsApi.getDataImportOptions()) === null || _a === void 0 ? void 0 : _a.fileHandlers) !== null && _b !== void 0 ? _b : [];
51
+ const fileExtension = `.${file.name.split('.').pop()}`;
52
+ const handler = [...userDefinedFileHandlers, ...systemFileHandlers_1.systemFileHandlers].find((fh) => fh.fileExtension === fileExtension);
53
+ if (!handler) {
54
+ adaptable.api.logError(`No file handler found for file extension ${fileExtension}. Please provide a file handler in Data Import Options.`);
55
+ return;
56
+ }
57
+ try {
58
+ const data = await handler.handleFile(file);
59
+ setFile(file);
60
+ handleRowDataChange(data);
61
+ return data;
62
+ }
63
+ catch (_c) {
64
+ adaptable.api.logError(`Error reading file ${file.name}. Please check the file is valid.`);
65
+ }
66
+ }, [adaptable]);
67
+ const fileMessage = file ? (React.createElement(HelpBlock_1.default, { mb: 2 },
68
+ "File ",
69
+ React.createElement(Tag_1.Tag, null, file.name),
70
+ " is ready to be imported.")) : (React.createElement(HelpBlock_1.default, { mb: 2 },
71
+ "Supported file types: ",
72
+ supportedFileFormats));
73
+ // ---- TEXT IMPORT ----
74
+ const [textError, setTextError] = React.useState(null);
75
+ const handleTextChange = React.useCallback(async (text) => {
76
+ var _a;
77
+ //
78
+ let textHandler = (_a = adaptable.api.optionsApi.getDataImportOptions()) === null || _a === void 0 ? void 0 : _a.textHandler;
79
+ if (!textHandler) {
80
+ // regex to test for json
81
+ const jsonRegex = /^\s*[\[{]/;
82
+ if (text && jsonRegex.test(text)) {
83
+ textHandler = JSON.parse;
84
+ }
85
+ else {
86
+ textHandler = systemFileHandlers_1.parseCSV;
87
+ }
88
+ }
89
+ setText(text);
90
+ let textRawData = null;
91
+ if (!text || text === '') {
92
+ setTextError(null);
93
+ }
94
+ else {
95
+ try {
96
+ textRawData = await textHandler(text);
97
+ if (Array.isArray(textRawData)) {
98
+ handleRowDataChange(textRawData);
99
+ setTextError('');
100
+ }
101
+ else {
102
+ throw 'Error parsing text';
103
+ }
104
+ }
105
+ catch (_b) {
106
+ handleRowDataChange(null);
107
+ setTextError('Error parsing text');
108
+ }
109
+ }
110
+ }, []);
111
+ const textMessage = textError !== null && textError !== void 0 ? textError : (!rowData ? 'Paste your data here' : '');
112
+ // ---- VALIDATION ----
113
+ const errors = (_a = React.useMemo(() => {
114
+ var _a;
115
+ if (!(dataImportOptions === null || dataImportOptions === void 0 ? void 0 : dataImportOptions.validate)) {
116
+ return null;
117
+ }
118
+ if (!rowData) {
119
+ return null;
120
+ }
121
+ return (_a = rowData === null || rowData === void 0 ? void 0 : rowData.reduce) === null || _a === void 0 ? void 0 : _a.call(rowData, (acc, rowData) => {
122
+ const error = dataImportOptions.validate(Object.assign({ rowData }, (0, ObjectFactory_1.createBaseContext)(adaptable.api)));
123
+ if (error && rowData[primaryKey] && error.length) {
124
+ acc[rowData[primaryKey]] = error;
125
+ }
126
+ return acc;
127
+ }, {});
128
+ }, [rowData])) !== null && _a !== void 0 ? _a : {};
129
+ const [skipInvalidRows, setSkipInvalidRows] = React.useState(false);
130
+ const handleValidationDataChange = (data) => {
131
+ handleRowDataChange(data);
132
+ };
133
+ const handleFinish = () => {
134
+ const validData = rowData.filter((row) => {
135
+ const rowErrors = errors[row[primaryKey]];
136
+ return !rowErrors || rowErrors.length === 0;
137
+ });
138
+ adaptable.api.dataImportApi.internalApi.importData(validData);
139
+ };
140
+ return (React.createElement(OnePageAdaptableWizard_1.OnePageAdaptableWizard, { data: null, moduleInfo: module.moduleInfo, finishText: "Import", onFinish: () => {
141
+ handleFinish();
142
+ props.onClose();
143
+ }, onHide: () => {
144
+ props.onClose();
145
+ }, sections: [
146
+ {
147
+ title: 'Upload',
148
+ isValid: () => {
149
+ return rowData ? true : 'No valid data uploaded';
150
+ },
151
+ details: 'Upload the data',
152
+ render: () => {
153
+ return (React.createElement(UploadSection_1.UploadSection, { importType: importType, onImportTypeChange: handleChangeImportType,
154
+ // FILE
155
+ readFile: readFile, supportedFileFormats: supportedFileFormats, fileMessage: fileMessage,
156
+ // TEXT
157
+ text: text, onTextChange: handleTextChange, textMessage: textMessage }));
158
+ },
159
+ },
160
+ {
161
+ title: 'Validation',
162
+ details: 'Check the Data is Valid',
163
+ isValid: () => {
164
+ if (errors && Object.keys(errors).length > 0) {
165
+ if (!skipInvalidRows)
166
+ return 'There are errors in the data.';
167
+ }
168
+ return true;
169
+ },
170
+ render: () => {
171
+ return (React.createElement(ValidationSection_1.ValidationSection, { errors: errors, data: rowData, onDataChange: handleValidationDataChange, skipInvalidRows: skipInvalidRows, onSkipInvalidRowsChange: setSkipInvalidRows }));
172
+ },
173
+ },
174
+ ] }));
175
+ };
176
+ exports.DataImportWizard = DataImportWizard;
@@ -0,0 +1 @@
1
+ export * from './DataImportWizard';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./DataImportWizard"), exports);
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { ValidationErrorsMap } from '../DataImportWizard';
3
+ interface DataPreviewProps {
4
+ data?: Record<string, unknown>[];
5
+ onDataChange?: (data: Record<string, unknown>[]) => void;
6
+ errors: ValidationErrorsMap | null;
7
+ editable?: boolean;
8
+ }
9
+ export declare const DataPreview: React.FunctionComponent<DataPreviewProps>;
10
+ export {};
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataPreview = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const lodash_1 = require("lodash");
6
+ const React = tslib_1.__importStar(require("react"));
7
+ const HelpBlock_1 = tslib_1.__importDefault(require("../../../../components/HelpBlock"));
8
+ const icons_1 = require("../../../../components/icons");
9
+ const InfiniteTable_1 = require("../../../../components/InfiniteTable");
10
+ const Tag_1 = require("../../../../components/Tag");
11
+ const AdaptableContext_1 = require("../../../AdaptableContext");
12
+ const AdaptablePopover_1 = require("../../../AdaptablePopover");
13
+ const UIHelper_1 = tslib_1.__importDefault(require("../../../UIHelper"));
14
+ const tableDOMProps = {
15
+ style: {
16
+ height: '100%',
17
+ minWidth: '10rem',
18
+ minHeight: 300,
19
+ flex: 1,
20
+ },
21
+ };
22
+ const getRowErrors = (errors, primaryKeyValue) => {
23
+ if (!errors) {
24
+ return null;
25
+ }
26
+ if (!errors[primaryKeyValue]) {
27
+ return null;
28
+ }
29
+ return errors[primaryKeyValue];
30
+ };
31
+ const getCellError = (errors, primaryKeyValue, columnId) => {
32
+ var _a, _b;
33
+ return (_b = (_a = getRowErrors(errors, primaryKeyValue)) === null || _a === void 0 ? void 0 : _a.find((e) => e.columnId === columnId)) !== null && _b !== void 0 ? _b : null;
34
+ };
35
+ const DataPreview = (props) => {
36
+ const adaptable = (0, AdaptableContext_1.useAdaptable)();
37
+ if (!props.data) {
38
+ return (React.createElement(HelpBlock_1.default, { color: 'var(--ab-color-error)' },
39
+ "No Data has been Imported. Go to ",
40
+ React.createElement(Tag_1.Tag, null, "Upload"),
41
+ " step and provide Data"));
42
+ }
43
+ const primaryKey = adaptable.api.optionsApi.getPrimaryKey();
44
+ const dataSample = props.data[0];
45
+ const columns = React.useMemo(() => {
46
+ if (!dataSample) {
47
+ return {};
48
+ }
49
+ const adaptableColumnsInData = adaptable.api.columnApi.getColumns().filter((c) => {
50
+ var _a;
51
+ return dataSample && ((_a = c.field) !== null && _a !== void 0 ? _a : c.columnId) in dataSample;
52
+ });
53
+ const mapDataType = (dataType) => {
54
+ switch (dataType) {
55
+ case 'Boolean':
56
+ return 'boolean';
57
+ case 'Date':
58
+ return 'date';
59
+ case 'String':
60
+ return 'number';
61
+ }
62
+ return dataType;
63
+ };
64
+ const infiniteColumns = adaptableColumnsInData.reduce((acc, column) => {
65
+ const isPrimaryKey = column.columnId === primaryKey;
66
+ let editable = !isPrimaryKey;
67
+ if (props.editable !== undefined && !isPrimaryKey) {
68
+ editable = props.editable;
69
+ }
70
+ acc[column.columnId] = {
71
+ field: column.field,
72
+ header: adaptable.api.columnApi.getFriendlyNameForColumnId(column.columnId),
73
+ dataType: mapDataType(column.dataType),
74
+ defaultEditable: editable,
75
+ valueGetter: (params) => {
76
+ if (column.dataType === 'Boolean') {
77
+ return params.data[column.columnId] ? 'True' : 'False';
78
+ }
79
+ else {
80
+ return params.data[params.field];
81
+ }
82
+ },
83
+ };
84
+ return acc;
85
+ }, {});
86
+ infiniteColumns['valid'] = {
87
+ header: 'Valid',
88
+ maxWidth: 100,
89
+ minWidth: 90,
90
+ align: 'center',
91
+ renderValue: (params) => {
92
+ const cellErrors = getRowErrors(props.errors, params.data[primaryKey]);
93
+ const successColor = UIHelper_1.default.getColorByMessageType('Success');
94
+ if (!cellErrors || cellErrors.length === 0) {
95
+ return React.createElement(icons_1.Icon, { name: "check", style: { color: successColor, fill: 'currentColor' } });
96
+ }
97
+ const errorsStr = cellErrors.map((e) => e.error).join(', ');
98
+ return (React.createElement(AdaptablePopover_1.AdaptablePopover, { popoverMinWidth: 200, showEvent: "mouseenter", hideEvent: "mouseleave", headerText: 'Validation Error', bodyText: [errorsStr], MessageType: 'Error' }));
99
+ },
100
+ };
101
+ infiniteColumns['type'] = {
102
+ header: 'Type',
103
+ maxWidth: 100,
104
+ minWidth: 90,
105
+ renderValue: (params) => {
106
+ try {
107
+ const isExistingRow = adaptable.api.gridApi.getRowNodeForPrimaryKey(params.data[primaryKey]);
108
+ return isExistingRow ? 'Update' : 'New';
109
+ }
110
+ catch (error) {
111
+ // empty
112
+ }
113
+ return React.createElement(React.Fragment, null);
114
+ },
115
+ };
116
+ return infiniteColumns;
117
+ }, [props.data]);
118
+ const getCellErrorStyle = (columnId, primaryKeyValue) => {
119
+ const cellError = getCellError(props.errors, primaryKeyValue, columnId);
120
+ if (!cellError) {
121
+ return {};
122
+ }
123
+ return {
124
+ border: 'var(--ab-Dataimport-validation-error__border)',
125
+ };
126
+ };
127
+ return (React.createElement(InfiniteTable_1.DataSource, { data: props.data, primaryKey: primaryKey, onDataMutations: (params) => {
128
+ const newRowData = [...props.data];
129
+ const mutationsList = (0, lodash_1.flatten)(Array.from(params.mutations.values()));
130
+ if (!mutationsList.length) {
131
+ return;
132
+ }
133
+ mutationsList.forEach((mutation) => {
134
+ const index = newRowData.findIndex((row) => row[primaryKey] === mutation.primaryKey);
135
+ if (index !== -1) {
136
+ newRowData[index] = Object.assign(Object.assign({}, newRowData[index]), mutation.data);
137
+ }
138
+ });
139
+ props.onDataChange(newRowData);
140
+ } },
141
+ React.createElement(InfiniteTable_1.InfiniteTable, { columnPinning: {
142
+ valid: 'end',
143
+ type: 'end',
144
+ }, columnTypes: {
145
+ default: {
146
+ style: (params) => {
147
+ return getCellErrorStyle(params.column.id, params.rowInfo.id);
148
+ },
149
+ minWidth: 100,
150
+ defaultFlex: 1,
151
+ },
152
+ }, domProps: tableDOMProps, columns: columns })));
153
+ };
154
+ exports.DataPreview = DataPreview;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import { ValidationErrorsMap } from '../DataImportWizard';
3
+ interface ImportSectionProps {
4
+ data?: Record<string, unknown>[];
5
+ onDataChange?: (data: Record<string, unknown>[]) => void;
6
+ errors: ValidationErrorsMap | null;
7
+ }
8
+ export declare const ImportSection: React.FunctionComponent<ImportSectionProps>;
9
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImportSection = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const rebass_1 = require("rebass");
7
+ const FormLayout_1 = tslib_1.__importStar(require("../../../../components/FormLayout"));
8
+ const check_box_1 = tslib_1.__importDefault(require("../../../../components/icons/check-box"));
9
+ const Tabs_1 = require("../../../../components/Tabs");
10
+ const DataPreview_1 = require("./DataPreview");
11
+ const ImportSection = (props) => {
12
+ return (React.createElement(rebass_1.Flex, { flexDirection: "column", p: 2, height: "100%" },
13
+ React.createElement(Tabs_1.Tabs, { mb: 2 },
14
+ React.createElement(Tabs_1.Tabs.Tab, null, "Import Options"),
15
+ React.createElement(Tabs_1.Tabs.Content, null,
16
+ React.createElement(FormLayout_1.default, null,
17
+ React.createElement(FormLayout_1.FormRow, { label: "Exclude Invalid Rows" },
18
+ React.createElement(check_box_1.default, null))))),
19
+ React.createElement(Tabs_1.Tabs, { flex: 1 },
20
+ React.createElement(Tabs_1.Tabs.Tab, null, "Preview"),
21
+ React.createElement(Tabs_1.Tabs.Content, null,
22
+ React.createElement(DataPreview_1.DataPreview, { onDataChange: props.onDataChange, data: props.data, errors: props.errors, editable: false })))));
23
+ };
24
+ exports.ImportSection = ImportSection;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ interface ImportFileSectionProps {
3
+ readFile: (data: File) => Promise<Record<string, unknown>[]>;
4
+ supportedFileFormats: string;
5
+ message: React.ReactNode;
6
+ }
7
+ export declare const ImportFileSection: React.FunctionComponent<ImportFileSectionProps>;
8
+ export {};
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImportFileSection = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const index_1 = tslib_1.__importDefault(require("../../../../../components/FileDroppable/index"));
7
+ const index_2 = tslib_1.__importDefault(require("../../../../../components/HelpBlock/index"));
8
+ const ImportFileSection = (props) => {
9
+ return (React.createElement(index_1.default, { loadingText: React.createElement(index_2.default, { mb: 2 }, "File loaded , file ready to be imported."), message: props.message, helpText: "Data Import", defaultText: "Click here to select a file to load, or drag it here", dragOverText: "Drop file here to start Data Import", height: "100%", fileAccept: props.supportedFileFormats, readFile: props.readFile }));
10
+ };
11
+ exports.ImportFileSection = ImportFileSection;
@@ -0,0 +1,13 @@
1
+ import React, { ReactNode } from 'react';
2
+ declare type UploadSectionProps = {
3
+ readFile: (data: File) => Promise<Record<string, unknown>[]>;
4
+ supportedFileFormats: string;
5
+ fileMessage: ReactNode;
6
+ onTextChange: (text: string) => void;
7
+ text?: string;
8
+ textMessage?: string;
9
+ importType: 'file' | 'text';
10
+ onImportTypeChange: (importType: 'file' | 'text') => void;
11
+ };
12
+ export declare const UploadSection: React.FC<UploadSectionProps>;
13
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UploadSection = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const rebass_1 = require("rebass");
7
+ const index_1 = tslib_1.__importDefault(require("../../../../../components/Radio/index"));
8
+ const index_2 = require("../../../../../components/Tabs/index");
9
+ const UploadFileSection_1 = require("./UploadFileSection");
10
+ const UploadTextSection_1 = require("./UploadTextSection");
11
+ const UploadSection = (props) => {
12
+ return (react_1.default.createElement(rebass_1.Flex, { p: 2, height: "100%", flexDirection: "column" },
13
+ react_1.default.createElement(index_2.Tabs, { mb: 2 },
14
+ react_1.default.createElement(index_2.Tabs.Tab, null, "Import Type"),
15
+ react_1.default.createElement(index_2.Tabs.Content, null,
16
+ react_1.default.createElement(rebass_1.Flex, { flexDirection: "column" },
17
+ react_1.default.createElement(index_1.default, { onClick: () => props.onImportTypeChange('file'), checked: props.importType === 'file' }, "File"),
18
+ react_1.default.createElement(index_1.default, { onClick: () => props.onImportTypeChange('text'), checked: props.importType === 'text' }, "Text")))),
19
+ react_1.default.createElement(index_2.Tabs, { flex: 1 },
20
+ react_1.default.createElement(index_2.Tabs.Tab, null, props.importType === 'file' ? 'File Upload' : 'Text'),
21
+ react_1.default.createElement(index_2.Tabs.Content, null, props.importType === 'file' ? (react_1.default.createElement(UploadFileSection_1.ImportFileSection, { readFile: props.readFile, supportedFileFormats: props.supportedFileFormats, message: props.fileMessage })) : (react_1.default.createElement(UploadTextSection_1.ImportTextSection, { message: props.textMessage, text: props.text, onTextChange: props.onTextChange }))))));
22
+ };
23
+ exports.UploadSection = UploadSection;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ interface ImportTextSectionProps {
3
+ text?: string;
4
+ onTextChange: (text: string) => void;
5
+ message?: string;
6
+ }
7
+ export declare const ImportTextSection: React.FunctionComponent<ImportTextSectionProps>;
8
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImportTextSection = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const index_1 = tslib_1.__importDefault(require("../../../../../components/HelpBlock/index"));
7
+ const index_2 = tslib_1.__importDefault(require("../../../../../components/Textarea/index"));
8
+ const ImportTextSection = (props) => {
9
+ return (React.createElement(React.Fragment, null,
10
+ React.createElement(index_2.default, { value: props.text, onChange: (event) => props.onTextChange(event.target.value), height: "100%" }),
11
+ props.message && React.createElement(index_1.default, null, props.message)));
12
+ };
13
+ exports.ImportTextSection = ImportTextSection;
@@ -0,0 +1 @@
1
+ export * from './UploadSection';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./UploadSection"), exports);
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { ValidationErrorsMap } from '../DataImportWizard';
3
+ interface ValidationSectionProps {
4
+ data?: Record<string, unknown>[];
5
+ onDataChange?: (data: Record<string, unknown>[]) => void;
6
+ errors: ValidationErrorsMap | null;
7
+ skipInvalidRows: boolean;
8
+ onSkipInvalidRowsChange: (skipInvalidRows: boolean) => void;
9
+ }
10
+ export declare const ValidationSection: React.FunctionComponent<ValidationSectionProps>;
11
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationSection = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const rebass_1 = require("rebass");
7
+ const CheckBox_1 = require("../../../../components/CheckBox");
8
+ const FormLayout_1 = tslib_1.__importStar(require("../../../../components/FormLayout"));
9
+ const Tabs_1 = require("../../../../components/Tabs");
10
+ const DataPreview_1 = require("./DataPreview");
11
+ const getRowErrors = (errors, primaryKeyValue) => {
12
+ if (!errors) {
13
+ return null;
14
+ }
15
+ if (!errors[primaryKeyValue]) {
16
+ return null;
17
+ }
18
+ return errors[primaryKeyValue];
19
+ };
20
+ const ValidationSection = (props) => {
21
+ return (React.createElement(rebass_1.Flex, { flexDirection: "column", p: 2, height: "100%" },
22
+ React.createElement(Tabs_1.Tabs, { mb: 2 },
23
+ React.createElement(Tabs_1.Tabs.Tab, null, "Import Options"),
24
+ React.createElement(Tabs_1.Tabs.Content, null,
25
+ React.createElement(FormLayout_1.default, null,
26
+ React.createElement(FormLayout_1.FormRow, { label: "Exclude Invalid Rows" },
27
+ React.createElement(CheckBox_1.CheckBox, { onChange: () => {
28
+ props.onSkipInvalidRowsChange(!props.skipInvalidRows);
29
+ }, checked: props.skipInvalidRows }))))),
30
+ React.createElement(Tabs_1.Tabs, { flex: 1 },
31
+ React.createElement(Tabs_1.Tabs.Tab, null, "Preview"),
32
+ React.createElement(Tabs_1.Tabs.Content, null,
33
+ React.createElement(DataPreview_1.DataPreview, { data: props.data, errors: props.errors, editable: true, onDataChange: props.onDataChange })))));
34
+ };
35
+ exports.ValidationSection = ValidationSection;
@@ -0,0 +1,3 @@
1
+ import { DataImportFileHandler } from '../../types';
2
+ export declare const parseCSV: (content: string) => Record<string, unknown>[];
3
+ export declare const systemFileHandlers: DataImportFileHandler<Record<string, unknown>>[];
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.systemFileHandlers = exports.parseCSV = void 0;
4
+ const FileDroppable_1 = require("../../components/FileDroppable");
5
+ const jsonHandler = {
6
+ fileExtension: '.json',
7
+ handleFile: (file) => (0, FileDroppable_1.readJSONFile)(file),
8
+ };
9
+ const parseCSV = (content) => {
10
+ const lines = content.split('\n');
11
+ const headers = lines[0].split(',');
12
+ const data = [];
13
+ if (lines.length <= 1) {
14
+ return null;
15
+ }
16
+ for (let i = 1; i < lines.length; i++) {
17
+ const values = lines[i].split(',');
18
+ if (values.length === headers.length) {
19
+ const item = {};
20
+ for (let j = 0; j < headers.length; j++) {
21
+ const value = values[j];
22
+ item[headers[j]] = isNaN(Number(value)) ? value : Number(value);
23
+ }
24
+ data.push(item);
25
+ }
26
+ }
27
+ return data;
28
+ };
29
+ exports.parseCSV = parseCSV;
30
+ const csvFileHandler = {
31
+ fileExtension: '.csv',
32
+ handleFile: (file) => {
33
+ return new Promise((resolve, reject) => {
34
+ const reader = new FileReader();
35
+ reader.onload = (event) => {
36
+ var _a;
37
+ const content = (_a = event.target) === null || _a === void 0 ? void 0 : _a.result;
38
+ resolve((0, exports.parseCSV)(content));
39
+ };
40
+ reader.readAsText(file);
41
+ });
42
+ },
43
+ };
44
+ exports.systemFileHandlers = [jsonHandler, csvFileHandler];
@@ -39,6 +39,7 @@ export interface OnePageAdaptableWizardProps<ENTITY> {
39
39
  titleContainerStyle?: CSSProperties;
40
40
  closeText?: React.ReactNode;
41
41
  closeTooltip?: string;
42
+ finishText?: React.ReactNode;
42
43
  }
43
44
  export declare const OnePageAdaptableWizard: <ENTITY extends unknown>(props: OnePageAdaptableWizardProps<ENTITY>) => JSX.Element;
44
45
  export declare const OnePageWizardSummary: <ENTITY extends unknown>() => JSX.Element;
@@ -34,5 +34,6 @@ export interface OnePageWizardProps<ENTITY> {
34
34
  titleContainerStyle?: CSSProperties;
35
35
  closeText?: React.ReactNode;
36
36
  closeTooltip?: string;
37
+ finishText?: React.ReactNode;
37
38
  }
38
39
  export declare const OnePageWizard: <ENTITY extends unknown>(props: OnePageWizardProps<ENTITY>) => JSX.Element;
@@ -30,7 +30,7 @@ function useOnePageWizardContext() {
30
30
  }
31
31
  exports.useOnePageWizardContext = useOnePageWizardContext;
32
32
  const OnePageWizard = (props) => {
33
- var _a, _b;
33
+ var _a, _b, _c;
34
34
  let defaultCurrentIndex = 0;
35
35
  if (props.defaultCurrentSectionName) {
36
36
  const candidate = props.sections.findIndex((section) => section !== '-' && (section === null || section === void 0 ? void 0 : section.title) === props.defaultCurrentSectionName);
@@ -188,6 +188,6 @@ const OnePageWizard = (props) => {
188
188
  color: 'var(--ab-color-error)',
189
189
  textAlign: 'end',
190
190
  } }, firstErrorMessage),
191
- React.createElement(SimpleButton_1.default, { tone: "accent", "data-name": "finish", variant: "raised", disabled: canFinish !== true, onClick: () => handleClickFinish(), icon: 'check', accessLevel: 'Full' }, "Finish")))))));
191
+ React.createElement(SimpleButton_1.default, { tone: "accent", "data-name": "finish", variant: "raised", disabled: canFinish !== true, onClick: () => handleClickFinish(), icon: 'check', accessLevel: 'Full' }, (_c = props.finishText) !== null && _c !== void 0 ? _c : 'Finish')))))));
192
192
  };
193
193
  exports.OnePageWizard = OnePageWizard;
@@ -46,6 +46,7 @@ const UIHelper_1 = tslib_1.__importDefault(require("../View/UIHelper"));
46
46
  const BadgeRenderer_1 = require("./BadgeRenderer");
47
47
  const CheckboxRenderer_1 = require("./CheckboxRenderer");
48
48
  const PercentBarRenderer_1 = require("./PercentBarRenderer");
49
+ const DataImportModule_1 = require("../Strategy/DataImportModule");
49
50
  const tinycolor = require('tinycolor2');
50
51
  /**
51
52
  * Adaptable AG Grid implementation is getting really big and unwieldy
@@ -85,6 +86,7 @@ class agGridHelper {
85
86
  modules.set(ModuleConstants.CellSummaryModuleId, new CellSummaryModule_1.CellSummaryModule(api));
86
87
  modules.set(ModuleConstants.CustomSortModuleId, new CustomSortModule_1.CustomSortModule(api));
87
88
  modules.set(ModuleConstants.DataChangeHistoryModuleId, new DataChangeHistoryModule_1.DataChangeHistoryModule(api));
89
+ modules.set(ModuleConstants.DataImportModuleId, new DataImportModule_1.DataImportModule(api));
88
90
  modules.set(ModuleConstants.DataSetModuleId, new DataSetModule_1.DataSetModule(api));
89
91
  modules.set(ModuleConstants.ExportModuleId, new ExportModule_1.ExportModule(api));
90
92
  modules.set(ModuleConstants.FilterModuleId, new FilterModule_1.FilterModule(api));