@adaptabletools/adaptable 20.0.0-canary.6 → 20.0.0-canary.7

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": "20.0.0-canary.6",
3
+ "version": "20.0.0-canary.7",
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",
@@ -162,9 +162,9 @@ export interface ExternalReport {
162
162
  */
163
163
  name: string;
164
164
  /**
165
- * Function invoked to return the data (in the form of a `ReportData` object)
165
+ * Function invoked to return the data (in the form of a `ExportResultData` object)
166
166
  */
167
- onRunReport: () => ReportData;
167
+ onExport: (context: BaseExportContext) => Promise<ExportResultData>;
168
168
  }
169
169
  /**
170
170
  * Defines a custom Export destination
@@ -1,5 +1,5 @@
1
1
  import { AdaptableForm } from '../PredefinedConfig/Common/AdaptableForm';
2
- import { ExportState, Report, ReportData, ReportFormatType, ReportNameType, SystemReportFormat, SystemReportName } from '../PredefinedConfig/ExportState';
2
+ import { ExportState, Report, ReportFormatType, ReportNameType, SystemReportFormat, SystemReportName } from '../PredefinedConfig/ExportState';
3
3
  import { CustomDestination, ExportDestinationType, ExportFormContext, ExportResultData, ExternalReport, SystemExportDestination } from '../AdaptableOptions/ExportOptions';
4
4
  import { AdaptableColumn } from '../types';
5
5
  /**
@@ -139,11 +139,6 @@ export interface ExportApi {
139
139
  * @param report Report to Check
140
140
  */
141
141
  isExternalReport(report: Report): boolean;
142
- /**
143
- * Runs the report function of the ExternalReport with the given reportName
144
- * @param reportName external report name
145
- */
146
- runExternalReport(reportName: string): ReportData | undefined;
147
142
  /**
148
143
  * Returns whether the given column is exportable
149
144
  */
@@ -1,5 +1,5 @@
1
1
  import { ExportApi } from '../ExportApi';
2
- import { ExportState, Report, ReportData, ReportFormatType, ReportNameType, SystemReportFormat, SystemReportName } from '../../PredefinedConfig/ExportState';
2
+ import { ExportState, Report, ReportFormatType, ReportNameType, SystemReportFormat, SystemReportName } from '../../PredefinedConfig/ExportState';
3
3
  import { ApiBase } from './ApiBase';
4
4
  import { AdaptableForm } from '../../PredefinedConfig/Common/AdaptableForm';
5
5
  import { CustomDestination, ExportDestinationType, ExportFormContext, ExportResultData, ExternalReport, SystemExportDestination } from '../../AdaptableOptions/ExportOptions';
@@ -36,7 +36,6 @@ export declare class ExportApiImpl extends ApiBase implements ExportApi {
36
36
  getCustomReports(): Report[];
37
37
  getExternalReports(): ExternalReport[];
38
38
  isExternalReport(report: Report): boolean;
39
- runExternalReport(externalReportName: string): ReportData | undefined;
40
39
  isColumnExportable(adaptableColumn: AdaptableColumn): boolean;
41
40
  getSupportedExportDestinations(reportFormat: ReportFormatType): ExportDestinationType[];
42
41
  exportReport(reportName: ReportNameType, format: ReportFormatType, destination?: ExportDestinationType): void;
@@ -132,14 +132,6 @@ export class ExportApiImpl extends ApiBase {
132
132
  isExternalReport(report) {
133
133
  return this.getExternalReports()?.find((cr) => cr.name == report.Name) != null;
134
134
  }
135
- runExternalReport(externalReportName) {
136
- const externalReport = this.getExternalReports()?.find((cr) => cr.name == externalReportName);
137
- if (!externalReport) {
138
- this.logWarn(`External Report '${externalReportName}' not found!`);
139
- return undefined;
140
- }
141
- return externalReport.onRunReport();
142
- }
143
135
  isColumnExportable(adaptableColumn) {
144
136
  const isExportableFn = this.getExportOptions().isColumnExportable;
145
137
  if (typeof isExportableFn === 'function') {
@@ -168,6 +160,20 @@ export class ExportApiImpl extends ApiBase {
168
160
  exportReport(reportName, format, destination = 'Download') {
169
161
  let report = this.getReportByName(reportName);
170
162
  if (this.checkItemExists(report, reportName, 'Report')) {
163
+ if (this.isExternalReport(report)) {
164
+ // Handle external report
165
+ this.internalApi
166
+ .getExternalReportData(reportName, format, destination)
167
+ .then((reportData) => {
168
+ if (reportData) {
169
+ this.internalApi.sendReportToDestination(reportData, report, format, destination);
170
+ }
171
+ })
172
+ .catch((error) => {
173
+ this.logWarn(`Failed to get external report data for '${reportName}': ${error}`);
174
+ });
175
+ return;
176
+ }
171
177
  this._adaptable.agGridExportAdapter
172
178
  .exportData({
173
179
  report,
@@ -78,13 +78,14 @@ export class ActionColumnInternalApi extends ApiBase {
78
78
  return { actionButtons, actionColumn };
79
79
  }
80
80
  updateAllActionColumnButtons(actionButtons) {
81
- return actionButtons.map((actionButton) => ({
82
- ...actionButton,
83
- Uuid: createUuid(),
84
- command: actionButton.command == undefined
85
- ? undefined
86
- : this.updateActionButtonCommand(actionButton),
87
- }));
81
+ return actionButtons.map((actionButton) => {
82
+ actionButton = { ...actionButton };
83
+ actionButton.Uuid = createUuid();
84
+ if (actionButton.command) {
85
+ this.updateActionButtonCommand(actionButton);
86
+ }
87
+ return actionButton;
88
+ });
88
89
  }
89
90
  updateActionButtonCommand(button) {
90
91
  switch (button.command) {
@@ -93,7 +94,7 @@ export class ActionColumnInternalApi extends ApiBase {
93
94
  this.getRowFormApi().displayCreateRowForm();
94
95
  };
95
96
  button.tooltip = button.tooltip ? button.tooltip : 'Create Row';
96
- button.icon = {
97
+ button.icon = button.icon ?? {
97
98
  name: 'add',
98
99
  };
99
100
  break;
@@ -102,7 +103,7 @@ export class ActionColumnInternalApi extends ApiBase {
102
103
  this.getRowFormApi().displayCloneRowForm(context.primaryKeyValue);
103
104
  };
104
105
  button.tooltip = button.tooltip ? button.tooltip : 'Clone Row';
105
- button.icon = {
106
+ button.icon = button.icon ?? {
106
107
  name: 'clone',
107
108
  };
108
109
  break;
@@ -117,22 +118,18 @@ export class ActionColumnInternalApi extends ApiBase {
117
118
  this.getRowFormOptions().onRowFormSubmit?.(eventInfo);
118
119
  };
119
120
  button.tooltip = button.tooltip ? button.tooltip : 'Delete Row';
120
- button.icon = button.icon
121
- ? button.icon
122
- : {
123
- name: 'delete',
124
- };
121
+ button.icon = button.icon ?? {
122
+ name: 'delete',
123
+ };
125
124
  break;
126
125
  case 'edit':
127
126
  button.onClick = (button, context) => {
128
127
  this.getRowFormApi().displayEditRowForm(context.primaryKeyValue);
129
128
  };
130
129
  button.tooltip = button.tooltip ? button.tooltip : 'Edit Row';
131
- button.icon = button.icon
132
- ? button.icon
133
- : {
134
- name: 'edit',
135
- };
130
+ button.icon = button.icon ?? {
131
+ name: 'edit',
132
+ };
136
133
  break;
137
134
  }
138
135
  }
@@ -21,12 +21,7 @@ export declare class ExportInternalApi extends ApiBase {
21
21
  getReportColumnScopeShortDescription(report: Report): string[];
22
22
  getReportColumnScopeLongDescription(report: Report): string;
23
23
  getReportExpressionDescription(report: Report, cols: AdaptableColumn[]): string;
24
- getReportDataColumns(report: Report, includePrimaryKey?: boolean): AdaptableColumn[];
25
- getReportDataRows(report: Report, columns: AdaptableColumn[], includePrimaryKey?: boolean): Record<string, any>[];
26
- getReportData(report: Report, includePrimaryKey?: boolean): ReportData;
27
- getReportDataAsArray(report: Report, includePrimaryKey?: boolean): any[][];
28
24
  convertReportDataToArray(reportData: ReportData): any[][];
29
- getRowObjectForColumnIds(rowNode: IRowNode, columnIds: string[], reportName: string): Record<string, any>;
30
25
  publishLiveLiveDataChangedEvent(reportDestination: 'ipushpull' | 'OpenFin', liveDataTrigger: 'Connected' | 'Disconnected' | 'SnapshotSent' | 'LiveDataStarted' | 'LiveDataStopped' | 'LiveDataUpdated', liveReport?: any): void;
31
26
  getCellExportValueFromRowNode(rowNode: IRowNode, columnId: string, isVisualReport?: boolean): any;
32
27
  getCellExportValueFromRawValue(rowNode: IRowNode, cellRawValue: any, columnId: string, isVisualReport?: boolean): any;
@@ -36,4 +31,5 @@ export declare class ExportInternalApi extends ApiBase {
36
31
  sendReportToDestination(reportResult: ExportResultData, report: Report, format: ReportFormatType, destination: ExportDestinationType): void;
37
32
  private sendReportToCustomDestination;
38
33
  buildBaseExportContext(reportName: ReportNameType, reportFormat: ReportFormatType, exportDestination?: ExportDestinationType): BaseExportContext;
34
+ getExternalReportData(externalReportName: ReportNameType, reportFormat: ReportFormatType, exportDestination: ExportDestinationType): Promise<ExportResultData | undefined>;
39
35
  }
@@ -1,15 +1,11 @@
1
- import groupBy from 'lodash/groupBy';
2
1
  import { ApiBase } from '../Implementation/ApiBase';
3
2
  import { createUuid } from '../../PredefinedConfig/Uuid';
4
3
  import { ALL_DATA_REPORT, CURRENT_LAYOUT_REPORT, SELECTED_DATA_REPORT, SYSTEM_EXPORT_DESTINATIONS, SYSTEM_REPORT_NAMES, } from '../../Utilities/Constants/GeneralConstants';
5
- import { ExportModuleId } from '../../Utilities/Constants/ModuleConstants';
6
- import ArrayExtensions from '../../Utilities/Extensions/ArrayExtensions';
7
4
  import StringExtensions from '../../Utilities/Extensions/StringExtensions';
8
5
  import FormatHelper, { DateFormatter } from '../../Utilities/Helpers/FormatHelper';
9
6
  import Helper from '../../Utilities/Helpers/Helper';
10
7
  import * as PopupRedux from '../../Redux/ActionsReducers/PopupRedux';
11
8
  import { SystemExportBegin, SystemExportEnd } from '../../Redux/ActionsReducers/InternalRedux';
12
- import { errorOnce } from '../../agGrid/AdaptableLogger';
13
9
  export class ExportInternalApi extends ApiBase {
14
10
  /**
15
11
  * Value Items for Report Name Selection
@@ -211,7 +207,6 @@ export class ExportInternalApi extends ApiBase {
211
207
  return `[${report.Name}]`;
212
208
  }
213
209
  else {
214
- // FIXME AFL: maybe fihnd a better description?
215
210
  switch (report.ReportRowScope) {
216
211
  case 'AllRows':
217
212
  return '[All Rows]';
@@ -224,138 +219,12 @@ export class ExportInternalApi extends ApiBase {
224
219
  }
225
220
  }
226
221
  }
227
- getReportDataColumns(report, includePrimaryKey = false) {
228
- let reportColumns = [];
229
- let gridColumns = this.getAdaptableApi().columnApi.getExportableColumns();
230
- if (this.getAdaptableApi().exportApi.isExternalReport(report)) {
231
- return reportColumns;
232
- }
233
- // first get the cols depending on the Column Scope
234
- switch (report.ReportColumnScope) {
235
- case 'AllColumns':
236
- reportColumns = gridColumns;
237
- break;
238
- case 'VisibleColumns':
239
- reportColumns = gridColumns.filter((c) => c.visible);
240
- break;
241
- case 'SelectedColumns':
242
- // we extract the selected columns from the grid columns to preserve the grid column order
243
- const selectedColumnIds = this.getAdaptableApi()
244
- .gridApi.getSelectedCellInfo()
245
- .columns.map((column) => column.columnId);
246
- reportColumns = gridColumns.filter((gridColumn) => selectedColumnIds.includes(gridColumn.columnId));
247
- break;
248
- case 'ScopeColumns':
249
- if ('ColumnIds' in report.Scope) {
250
- reportColumns = report.Scope.ColumnIds.map((columnId) => this.getAdaptableApi().columnApi.getColumnWithColumnId(columnId)).filter((c) => c);
251
- }
252
- else {
253
- reportColumns = this.getAdaptableApi().columnScopeApi.getColumnsInScope(report.Scope);
254
- }
255
- break;
256
- }
257
- if (includePrimaryKey) {
258
- const pkColumn = reportColumns.find((column) => column.columnId === this.getAdaptableApi().optionsApi.getPrimaryKey());
259
- // TODO simplify after we fix the IsPrimaryKey bug
260
- // const pkColumn = reportColumns.find(column => column.IsPrimaryKey);
261
- if (!pkColumn && !!this.getAdaptableApi().columnApi.getPrimaryKeyColumn()) {
262
- reportColumns.push(this.getAdaptableApi().columnApi.getPrimaryKeyColumn());
263
- }
264
- }
265
- return reportColumns;
266
- }
267
- getReportDataRows(report, columns, includePrimaryKey) {
268
- if (ArrayExtensions.IsNullOrEmpty(columns)) {
269
- return [];
270
- }
271
- const columnIds = columns.map((column) => column.columnId);
272
- const resultRowData = [];
273
- switch (report.ReportRowScope) {
274
- case 'AllRows':
275
- this.getAdaptableInternalApi().forAllRowNodesDo((rowNode) => {
276
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
277
- });
278
- break;
279
- case 'VisibleRows':
280
- this.getAdaptableInternalApi().forAllVisibleRowNodesDo((rowNode) => {
281
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
282
- });
283
- break;
284
- case 'ExpressionRows':
285
- this.getAdaptableInternalApi().forAllRowNodesDo((rowNode) => {
286
- try {
287
- if (this.getAdaptableApi()
288
- .internalApi.getQueryLanguageService()
289
- .evaluateBooleanExpression(report.Query?.BooleanExpression, ExportModuleId, rowNode)) {
290
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
291
- }
292
- }
293
- catch (error) {
294
- errorOnce(error.message);
295
- }
296
- });
297
- break;
298
- case 'SelectedRows':
299
- // CellSelection
300
- const selectedCellInfo = this.getAdaptableApi().gridApi.getSelectedCellInfo();
301
- const { gridCells: GridCells } = selectedCellInfo;
302
- let selectedCellsByPrimaryKey = groupBy(GridCells, 'primaryKeyValue');
303
- // we iterate over all visibleRowNodes to preserve the current order
304
- this.getAdaptableInternalApi().forAllVisibleRowNodesDo((rowNode) => {
305
- const rowPrimaryKeyValue = this.getAdaptableApi().gridApi.getPrimaryKeyValueForRowNode(rowNode);
306
- const selectedRowCells = selectedCellsByPrimaryKey[rowPrimaryKeyValue];
307
- if (selectedRowCells) {
308
- const selectedRowColumnIds = selectedRowCells.map((rowCell) => rowCell.column.columnId);
309
- const selectedColumnIds = columnIds.filter((columnId) => selectedRowColumnIds.includes(columnId));
310
- const row = this.getRowObjectForColumnIds(rowNode, selectedColumnIds, report.Name);
311
- if (includePrimaryKey) {
312
- row[this.getAdaptableApi().optionsApi.getPrimaryKey()] = rowPrimaryKeyValue;
313
- }
314
- resultRowData.push(row);
315
- }
316
- });
317
- // Row Selection
318
- const selectedRowInfo = this.getAdaptableApi().gridApi.getSelectedRowInfo();
319
- const selectedGridRowPrimaryKeys = selectedRowInfo?.gridRows
320
- ?.filter((gr) => gr.rowInfo.isGroup == false)
321
- .map((gridRow) => gridRow.primaryKeyValue) ?? [];
322
- if (selectedGridRowPrimaryKeys.length) {
323
- this.getAdaptableInternalApi().forAllRowNodesDo((rowNode) => {
324
- const rowPrimaryKeyValue = this.getAdaptableApi().gridApi.getPrimaryKeyValueForRowNode(rowNode);
325
- if (selectedGridRowPrimaryKeys.includes(rowPrimaryKeyValue)) {
326
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
327
- }
328
- });
329
- }
330
- break;
331
- }
332
- return resultRowData;
333
- }
334
- getReportData(report, includePrimaryKey = false) {
335
- if (this.getAdaptableApi().exportApi.isExternalReport(report)) {
336
- return this.getAdaptableApi().exportApi.runExternalReport(report.Name);
337
- }
338
- const columns = this.getReportDataColumns(report, includePrimaryKey);
339
- const rows = this.getReportDataRows(report, columns, includePrimaryKey);
340
- return { columns, rows };
341
- }
342
- getReportDataAsArray(report, includePrimaryKey = false) {
343
- const reportData = this.getReportData(report, includePrimaryKey);
344
- return this.convertReportDataToArray(reportData);
345
- }
346
222
  convertReportDataToArray(reportData) {
347
223
  return [
348
224
  reportData.columns.map((column) => column.friendlyName),
349
225
  ...reportData.rows.map((row) => reportData.columns.map((column) => row[column.columnId])),
350
226
  ];
351
227
  }
352
- getRowObjectForColumnIds(rowNode, columnIds, reportName) {
353
- return columnIds.reduce((result, columnId) => {
354
- // FIXME AFL if this method remains, 'false' should be replaced with dynamic value
355
- result[columnId] = this.getCellExportValueFromRowNode(rowNode, columnId, false);
356
- return result;
357
- }, {});
358
- }
359
228
  publishLiveLiveDataChangedEvent(reportDestination, liveDataTrigger, liveReport) {
360
229
  const liveDataChangedInfo = {
361
230
  ...this.getAdaptableInternalApi().buildBaseContext(),
@@ -490,4 +359,14 @@ export class ExportInternalApi extends ApiBase {
490
359
  exportDestination,
491
360
  };
492
361
  }
362
+ getExternalReportData(externalReportName, reportFormat, exportDestination) {
363
+ const externalReport = this.getExportApi()
364
+ .getExternalReports()
365
+ ?.find((cr) => cr.name == externalReportName);
366
+ if (!externalReport) {
367
+ this.logWarn(`External Report '${externalReportName}' not found!`);
368
+ return undefined;
369
+ }
370
+ return externalReport.onExport(this.buildBaseExportContext(externalReportName, reportFormat, exportDestination));
371
+ }
493
372
  }
@@ -86,19 +86,6 @@ export interface ReportData {
86
86
  */
87
87
  pivotColumnIds?: string[];
88
88
  }
89
- /**
90
- * Row Data in the Report
91
- */
92
- export interface ReportRow {
93
- /**
94
- * Data for the row
95
- */
96
- data: Record<string, any>;
97
- /**
98
- * Optional children rows for grouped data
99
- */
100
- children?: ReportRow[];
101
- }
102
89
  /**
103
90
  * System report names provided by AdapTable
104
91
  */
@@ -23,6 +23,7 @@ export declare class AgGridExportAdapter {
23
23
  private get agGridApi();
24
24
  private get adaptableApi();
25
25
  private get exportOptions();
26
+ private get logger();
26
27
  static getExcelClassNameForCell(colId: string, primaryKeyValue: any, userDefinedCellClass?: string | string[]): string;
27
28
  destroy(): void;
28
29
  exportData(config: ExportConfig): Promise<null | ExportResultData>;
@@ -29,6 +29,9 @@ export class AgGridExportAdapter {
29
29
  get exportOptions() {
30
30
  return this._adaptableInstance.api.optionsApi.getExportOptions();
31
31
  }
32
+ get logger() {
33
+ return this._adaptableInstance.logger;
34
+ }
32
35
  static getExcelClassNameForCell(colId, primaryKeyValue, userDefinedCellClass) {
33
36
  let excelClassName = `--excel-cell-${colId}-${primaryKeyValue}`;
34
37
  if (excelClassName.indexOf(' ') > 0) {
@@ -98,8 +101,7 @@ export class AgGridExportAdapter {
98
101
  };
99
102
  }
100
103
  catch (error) {
101
- // FIXME AFL improve logging
102
- console.error(error);
104
+ this.logger.consoleError(`Error exporting ${report.Name} in ${format} format to ${config.destination}`, error);
103
105
  }
104
106
  finally {
105
107
  /**
package/src/env.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export default {
2
2
  NEXT_PUBLIC_INFINITE_TABLE_LICENSE_KEY: "StartDate=2021-06-29|EndDate=2030-01-01|Owner=Adaptable|Type=distribution|TS=1624971462479|C=137829811,1004007071,2756196225,1839832928,3994409405,636616862" || '',
3
- PUBLISH_TIMESTAMP: 1741253338614 || Date.now(),
4
- VERSION: "20.0.0-canary.6" || '--current-version--',
3
+ PUBLISH_TIMESTAMP: 1741274222010 || Date.now(),
4
+ VERSION: "20.0.0-canary.7" || '--current-version--',
5
5
  };