@adaptabletools/adaptable 16.1.0-canary.3 → 16.1.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable",
3
- "version": "16.1.0-canary.3",
3
+ "version": "16.1.1-canary.0",
4
4
  "description": "Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
5
5
  "keywords": [
6
6
  "web-components",
@@ -1,2 +1,2 @@
1
- declare const _default: 1697793023995;
1
+ declare const _default: 1698254886109;
2
2
  export default _default;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = 1697793023995;
3
+ exports.default = 1698254886109;
@@ -161,6 +161,10 @@ export interface IAdaptable {
161
161
  getFilteredData(): any[];
162
162
  updateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
163
163
  addRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
164
+ addOrUpdateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<{
165
+ added: IRowNode[];
166
+ updated: IRowNode[];
167
+ }>;
164
168
  deleteRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
165
169
  selectColumn(columnId: string, config?: {
166
170
  keepExistingSelection?: boolean;
@@ -262,7 +262,7 @@ export interface AdaptableOptions<TData = any> {
262
262
  /**
263
263
  *
264
264
  */
265
- dataImportOptions?: DataImportOptions<TData>;
265
+ dataImportOptions?: DataImportOptions;
266
266
  /**
267
267
  * Used for managing the AdapTable Plugins
268
268
  */
@@ -14,7 +14,7 @@ export interface DataImportOptions<T = Record<string, unknown>> {
14
14
  /**
15
15
  * Function to validate the imported Data
16
16
  */
17
- validate?: (context: DataImportValidateContext) => DataImportValidationError[] | null;
17
+ validate?: (context: DataImportValidateContext<T>) => DataImportValidationError[] | undefined;
18
18
  /**
19
19
  * Function to apply the Import (instead of AdapTable)
20
20
  */
@@ -23,6 +23,10 @@ export interface DataImportOptions<T = Record<string, unknown>> {
23
23
  * Function to preprocess the data before it is imported
24
24
  */
25
25
  preprocessData?: (context: PreprocessDataContext<T>) => Record<string, unknown>[];
26
+ /**
27
+ * Function to get the Primary Key value for a row of data. It defaults to the value of the `AdaptableOptions.primaryKey` column
28
+ */
29
+ getPrimaryKeyValue?: (context: GetPrimaryKeyValueContext<T>) => string | number;
26
30
  }
27
31
  export interface PreprocessDataContext<T = Record<string, unknown>> extends BaseContext {
28
32
  /**
@@ -65,3 +69,12 @@ export interface DataImportValidateContext<T = Record<string, unknown>> extends
65
69
  */
66
70
  rowData: T;
67
71
  }
72
+ /**
73
+ * Context that manages Data Validation
74
+ */
75
+ export interface GetPrimaryKeyValueContext<T = Record<string, unknown>> extends BaseContext {
76
+ /**
77
+ * Data being imported
78
+ */
79
+ rowData: T;
80
+ }
@@ -4,13 +4,6 @@ import { AdaptableColumn, AdaptableIcon, AdaptableModule, BaseContext } from '..
4
4
  * Options for managing menus in AdapTable
5
5
  */
6
6
  export interface MenuOptions<TData = any> {
7
- /**
8
- * Adds 'Ungroup' Column Menu item to a row grouped column menu
9
- *
10
- * @defaultValue true
11
- * @gridInfoItem
12
- */
13
- showUngroupColumnMenuItem?: boolean;
14
7
  /**
15
8
  * Customised Context Menu. Default context menu items are available in the provided context.
16
9
  */
@@ -35,6 +28,14 @@ export interface MenuOptions<TData = any> {
35
28
  * @gridInfoItem
36
29
  */
37
30
  showAdaptableColumnMenu?: boolean | ((menuItem: AdaptableMenuItem, menuContext: ColumnMenuContext<TData>) => boolean);
31
+ /**
32
+ * Adds 'Ungroup' Column Menu item to a row grouped column menu
33
+ *
34
+ * @deprecated Now provided by AG Grid and property is ignored
35
+ * @defaultValue true
36
+ * @gridInfoItem
37
+ */
38
+ showUngroupColumnMenuItem?: boolean;
38
39
  /**
39
40
  * Order in which AG Grid, AdapTable and User Menu sections will appear in Column Menu (list or function)
40
41
  *
@@ -73,12 +74,12 @@ export interface CustomContextMenuContext<TData = any> extends ContextMenuContex
73
74
  */
74
75
  defaultAgGridMenuItems: AgGridMenuItem<AgGridContextMenuItemType>[];
75
76
  /**
76
- * Default Adaptable Menu Items
77
+ * Default AdapTable Menu Items
77
78
  */
78
79
  defaultAdaptableMenuItems: AdaptableSystemMenuItem[];
79
80
  }
80
81
  /**
81
- * Context info provided when building Custom Context Menus
82
+ * Context info provided when building Custom Column Menus
82
83
  */
83
84
  export interface CustomColumnMenuContext<TData = any> extends ColumnMenuContext<TData> {
84
85
  /**
@@ -86,7 +87,7 @@ export interface CustomColumnMenuContext<TData = any> extends ColumnMenuContext<
86
87
  */
87
88
  defaultAgGridMenuItems: AgGridMenuItem<AgGridColumnMenuItemType>[];
88
89
  /**
89
- * Default Adaptable Menu Items
90
+ * Default AdapTable Menu Items
90
91
  */
91
92
  defaultAdaptableMenuItems: AdaptableSystemMenuItem[];
92
93
  }
@@ -47,7 +47,10 @@ export interface GridApi {
47
47
  * @param dataRows rows to add or update
48
48
  * @param config batch option and callback function to run post change
49
49
  */
50
- addOrUpdateGridData(dataRows: any[], config?: DataUpdateConfig): Promise<IRowNode[]>;
50
+ addOrUpdateGridData(dataRows: any[], config?: DataUpdateConfig): Promise<{
51
+ addedRows: IRowNode[];
52
+ updatedRows: IRowNode[];
53
+ }>;
51
54
  /**
52
55
  * Adds rows to AdapTable (and AG Grid)
53
56
  * @param dataRows rows to add; ensure all 'mandatory' fields are included and Primary Key is unique
@@ -23,7 +23,10 @@ export declare class GridApiImpl extends ApiBase implements GridApi {
23
23
  getGridData(): any[];
24
24
  getFilteredData(): any[];
25
25
  updateGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
26
- addOrUpdateGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
26
+ addOrUpdateGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<{
27
+ addedRows: IRowNode[];
28
+ updatedRows: IRowNode[];
29
+ }>;
27
30
  addGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
28
31
  undoCellEdit(cellDataChangedInfo: CellDataChangedInfo): boolean;
29
32
  deleteGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
@@ -36,30 +36,17 @@ class GridApiImpl extends ApiBase_1.ApiBase {
36
36
  return rowNodes;
37
37
  }
38
38
  async addOrUpdateGridData(dataRows, dataUpdateConfig) {
39
- let addRows = [];
40
- let updateRows = [];
41
- const primaryKey = this.getOptions().primaryKey;
42
- dataRows.forEach((dataRow) => {
43
- const node = this.getRowNodeForPrimaryKey(dataRow[primaryKey]);
44
- if (node) {
45
- updateRows.push(dataRow);
46
- }
47
- else {
48
- addRows.push(dataRow);
49
- }
50
- });
51
- let returnNodes = [];
52
- if (ArrayExtensions_1.default.IsNotNullOrEmpty(updateRows)) {
53
- const updatedNodes = await this.adaptable.updateRows(updateRows, dataUpdateConfig);
54
- this.internalApi.fireGridDataChangedEvent(dataRows, updatedNodes, 'Edit');
55
- (await returnNodes).push(...updatedNodes);
39
+ const { added, updated } = await this.adaptable.addOrUpdateRows(dataRows, dataUpdateConfig);
40
+ if (ArrayExtensions_1.default.IsNotNullOrEmpty(updated)) {
41
+ this.internalApi.fireGridDataChangedEvent(dataRows, updated, 'Edit');
56
42
  }
57
- if (ArrayExtensions_1.default.IsNotNullOrEmpty(addRows)) {
58
- const addedNodes = await this.adaptable.addRows(addRows, dataUpdateConfig);
59
- this.internalApi.fireGridDataChangedEvent(dataRows, addedNodes, 'Add');
60
- (await returnNodes).push(...addedNodes);
43
+ if (ArrayExtensions_1.default.IsNotNullOrEmpty(added)) {
44
+ this.internalApi.fireGridDataChangedEvent(dataRows, added, 'Add');
61
45
  }
62
- return returnNodes;
46
+ return {
47
+ addedRows: added,
48
+ updatedRows: updated,
49
+ };
63
50
  }
64
51
  async addGridData(dataRows, dataUpdateConfig) {
65
52
  const rowNodes = await this.adaptable.addRows(dataRows, dataUpdateConfig);
@@ -43,5 +43,5 @@ export declare class OptionsApiImpl extends ApiBase implements OptionsApi {
43
43
  getFlashingCellOptions(): FlashingCellOptions;
44
44
  getSettingsPanelOptions(): SettingsPanelOptions;
45
45
  getFdc3Options(): Fdc3Options;
46
- getDataImportOptions(): import("../../types").DataImportOptions<any>;
46
+ getDataImportOptions(): import("../../types").DataImportOptions<Record<string, unknown>>;
47
47
  }
@@ -14,13 +14,19 @@ const ValidationSection_1 = require("./sections/ValidationSection");
14
14
  const DataImportWizard = (props) => {
15
15
  var _a;
16
16
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
17
- const primaryKey = adaptable.api.optionsApi.getPrimaryKey();
18
17
  const dataImportOptions = adaptable.api.optionsApi.getDataImportOptions();
19
18
  const module = adaptable.ModuleService.getModuleById('DataImport');
20
19
  const [rowData, setRowData] = React.useState(null);
21
20
  const [file, setFile] = React.useState(null);
22
21
  const [text, setText] = React.useState('');
23
22
  const [importType, setImportType] = React.useState('file');
23
+ const primaryKey = adaptable.api.optionsApi.getPrimaryKey();
24
+ const getPrimaryKeyValue = (rowData) => {
25
+ if (typeof dataImportOptions.getPrimaryKeyValue === 'function') {
26
+ return dataImportOptions.getPrimaryKeyValue(Object.assign(Object.assign({}, (0, ObjectFactory_1.createBaseContext)(adaptable.api)), { rowData }));
27
+ }
28
+ return rowData[primaryKey];
29
+ };
24
30
  const handleRowDataChange = React.useCallback((data) => {
25
31
  if (Array.isArray(data)) {
26
32
  setRowData(data);
@@ -120,8 +126,9 @@ const DataImportWizard = (props) => {
120
126
  }
121
127
  return (_a = rowData === null || rowData === void 0 ? void 0 : rowData.reduce) === null || _a === void 0 ? void 0 : _a.call(rowData, (acc, rowData) => {
122
128
  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;
129
+ const primaryKeyValue = getPrimaryKeyValue(rowData);
130
+ if (error && primaryKeyValue && error.length) {
131
+ acc[primaryKeyValue] = error;
125
132
  }
126
133
  return acc;
127
134
  }, {});
@@ -132,7 +139,7 @@ const DataImportWizard = (props) => {
132
139
  };
133
140
  const handleFinish = () => {
134
141
  const validData = rowData.filter((row) => {
135
- const rowErrors = errors[row[primaryKey]];
142
+ const rowErrors = errors[getPrimaryKeyValue(row)];
136
143
  return !rowErrors || rowErrors.length === 0;
137
144
  });
138
145
  adaptable.api.dataImportApi.internalApi.importData(validData);
@@ -11,6 +11,7 @@ const Tag_1 = require("../../../../components/Tag");
11
11
  const AdaptableContext_1 = require("../../../AdaptableContext");
12
12
  const AdaptablePopover_1 = require("../../../AdaptablePopover");
13
13
  const UIHelper_1 = tslib_1.__importDefault(require("../../../UIHelper"));
14
+ const ObjectFactory_1 = require("../../../../Utilities/ObjectFactory");
14
15
  const tableDOMProps = {
15
16
  style: {
16
17
  height: '100%',
@@ -34,6 +35,7 @@ const getCellError = (errors, primaryKeyValue, columnId) => {
34
35
  };
35
36
  const DataPreview = (props) => {
36
37
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
38
+ const dataImportOptions = adaptable.api.optionsApi.getDataImportOptions();
37
39
  if (!props.data) {
38
40
  return (React.createElement(HelpBlock_1.default, { color: 'var(--ab-color-error)' },
39
41
  "No Data has been Imported. Go to ",
@@ -61,6 +63,12 @@ const DataPreview = (props) => {
61
63
  }
62
64
  return dataType;
63
65
  };
66
+ const getPrimaryKeyValue = (rowData) => {
67
+ if (typeof dataImportOptions.getPrimaryKeyValue === 'function') {
68
+ return dataImportOptions.getPrimaryKeyValue(Object.assign(Object.assign({}, (0, ObjectFactory_1.createBaseContext)(adaptable.api)), { rowData }));
69
+ }
70
+ return rowData[primaryKey];
71
+ };
64
72
  const infiniteColumns = adaptableColumnsInData.reduce((acc, column) => {
65
73
  const isPrimaryKey = column.columnId === primaryKey;
66
74
  let editable = !isPrimaryKey;
@@ -104,7 +112,7 @@ const DataPreview = (props) => {
104
112
  minWidth: 90,
105
113
  renderValue: (params) => {
106
114
  try {
107
- const isExistingRow = adaptable.api.gridApi.getRowNodeForPrimaryKey(params.data[primaryKey]);
115
+ const isExistingRow = adaptable.api.gridApi.getRowNodeForPrimaryKey(getPrimaryKeyValue(params.data));
108
116
  return isExistingRow ? 'Update' : 'New';
109
117
  }
110
118
  catch (error) {
@@ -19,7 +19,7 @@ const parseCSV = (content) => {
19
19
  const item = {};
20
20
  for (let j = 0; j < headers.length; j++) {
21
21
  const value = values[j];
22
- item[headers[j]] = isNaN(Number(value)) ? value : Number(value);
22
+ item[headers[j]] = value === '' || isNaN(Number(value)) ? value : Number(value);
23
23
  }
24
24
  data.push(item);
25
25
  }
@@ -382,6 +382,10 @@ export declare class Adaptable implements IAdaptable {
382
382
  getFilteredData(): any[];
383
383
  updateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
384
384
  addRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
385
+ addOrUpdateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<{
386
+ added: IRowNode[];
387
+ updated: IRowNode[];
388
+ }>;
385
389
  deleteRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
386
390
  getFirstGroupedColumn(): AdaptableColumn | undefined;
387
391
  private checkColumnsDataTypeSet;
@@ -4370,6 +4370,48 @@ class Adaptable {
4370
4370
  return Promise.resolve(transaction === null || transaction === void 0 ? void 0 : transaction.add);
4371
4371
  }
4372
4372
  }
4373
+ addOrUpdateRows(dataRows, dataUpdateConfig) {
4374
+ const addDataRows = [];
4375
+ const updateDataRows = [];
4376
+ const primaryKey = this.adaptableOptions.primaryKey;
4377
+ dataRows.forEach((dataRow) => {
4378
+ const node = this.getRowNodeForPrimaryKey(dataRow[primaryKey]);
4379
+ if (node) {
4380
+ updateDataRows.push(dataRow);
4381
+ }
4382
+ else {
4383
+ addDataRows.push(dataRow);
4384
+ }
4385
+ });
4386
+ if (this.hasAutogeneratedPrimaryKey()) {
4387
+ this.addSyntheticPrimaryKeyIfMissing(addDataRows);
4388
+ }
4389
+ dataUpdateConfig = dataUpdateConfig || {};
4390
+ if (dataUpdateConfig.runAsync) {
4391
+ return new Promise((resolve) => {
4392
+ this.gridOptions.api.applyTransactionAsync({ update: updateDataRows, add: addDataRows, addIndex: dataUpdateConfig.addIndex }, (transaction) => {
4393
+ if (typeof dataUpdateConfig.callback === 'function') {
4394
+ dataUpdateConfig.callback(transaction);
4395
+ }
4396
+ resolve({
4397
+ added: transaction === null || transaction === void 0 ? void 0 : transaction.add,
4398
+ updated: transaction === null || transaction === void 0 ? void 0 : transaction.update,
4399
+ });
4400
+ });
4401
+ });
4402
+ }
4403
+ else {
4404
+ const transaction = this.gridOptions.api.applyTransaction({
4405
+ update: updateDataRows,
4406
+ add: addDataRows,
4407
+ addIndex: dataUpdateConfig.addIndex,
4408
+ });
4409
+ return Promise.resolve({
4410
+ added: transaction === null || transaction === void 0 ? void 0 : transaction.add,
4411
+ updated: transaction === null || transaction === void 0 ? void 0 : transaction.update,
4412
+ });
4413
+ }
4414
+ }
4373
4415
  deleteRows(dataRows, dataUpdateConfig) {
4374
4416
  dataUpdateConfig = dataUpdateConfig || {};
4375
4417
  if (dataUpdateConfig.runAsync) {
@@ -3238,6 +3238,16 @@ export declare const ADAPTABLE_METAMODEL: {
3238
3238
  desc: string;
3239
3239
  }[];
3240
3240
  };
3241
+ GetPrimaryKeyValueContext: {
3242
+ name: string;
3243
+ kind: string;
3244
+ desc: string;
3245
+ props: {
3246
+ name: string;
3247
+ kind: string;
3248
+ desc: string;
3249
+ }[];
3250
+ };
3241
3251
  GlobalExpressionFunctionsContext: {
3242
3252
  name: string;
3243
3253
  kind: string;