@adaptabletools/adaptable 12.0.3 → 12.0.6
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/bundle.cjs.js +93 -93
- package/package.json +1 -1
- package/publishTimestamp.d.ts +1 -1
- package/publishTimestamp.js +1 -1
- package/src/AdaptableOptions/ExportOptions.d.ts +3 -3
- package/src/Api/Events/SearchChanged.d.ts +1 -1
- package/src/Api/FormatColumnApi.d.ts +5 -0
- package/src/Api/Implementation/FormatColumnApiImpl.d.ts +1 -0
- package/src/Api/Implementation/FormatColumnApiImpl.js +23 -1
- package/src/Api/Implementation/LayoutApiImpl.d.ts +1 -0
- package/src/Api/Implementation/LayoutApiImpl.js +6 -0
- package/src/Api/LayoutApi.d.ts +5 -0
- package/src/PredefinedConfig/ChartingState.d.ts +1 -1
- package/src/PredefinedConfig/Common/SpecialColumnSettings.d.ts +1 -1
- package/src/Redux/Store/AdaptableStore.js +6 -0
- package/src/Strategy/FormatColumnModule.js +1 -1
- package/src/Strategy/LayoutModule.js +2 -1
- package/src/Utilities/Constants/DocumentationLinkConstants.js +2 -2
- package/src/Utilities/Constants/GeneralConstants.d.ts +1 -0
- package/src/Utilities/Constants/GeneralConstants.js +3 -2
- package/src/Utilities/ExpressionFunctions/aggregatedBooleanExpressionFunctions.js +4 -4
- package/src/Utilities/ExpressionFunctions/aggregatedScalarExpressionFunctions.js +7 -7
- package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.js +26 -4
- package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +5 -5
- package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +11 -11
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +2 -2
- package/src/Utilities/Helpers/FormatHelper.js +2 -1
- package/src/Utilities/Services/QueryLanguageService.js +4 -4
- package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.d.ts +1 -2
- package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +30 -27
- package/src/View/Layout/LayoutViewPanel.d.ts +2 -2
- package/src/View/Layout/LayoutViewPanel.js +3 -4
- package/src/View/Layout/SaveLayoutButton.d.ts +2 -0
- package/src/View/Layout/SaveLayoutButton.js +30 -0
- package/src/agGrid/Adaptable.js +1 -1
- package/src/components/ExpressionEditor/BaseEditorInput.js +1 -1
- package/src/metamodel/adaptable.metamodel.d.ts +5 -5
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/src/parser/src/types.d.ts +4 -8
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptabletools/adaptable",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.6",
|
|
4
4
|
"description": "Powerful data-agnostic HTML5 datagrid add-on that sits on top of an underlying grid component and provides all the rich functionality that advanced users expect from their DataGrids and Data Tables",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web-components",
|
package/publishTimestamp.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default:
|
|
1
|
+
declare const _default: 1657449987893;
|
|
2
2
|
export default _default;
|
package/publishTimestamp.js
CHANGED
|
@@ -72,15 +72,15 @@ export interface CustomReport {
|
|
|
72
72
|
*/
|
|
73
73
|
export interface CustomDestination {
|
|
74
74
|
/**
|
|
75
|
-
* Name of Custom Destination
|
|
75
|
+
* Name of Custom Destination (mandatory)
|
|
76
76
|
*/
|
|
77
77
|
name: string;
|
|
78
78
|
/**
|
|
79
|
-
* Optional Adaptable Form
|
|
79
|
+
* Optional Adaptable Form; if provided, it must include Buttons that will execute the Export
|
|
80
80
|
*/
|
|
81
81
|
form?: AdaptableForm<ExportFormContext>;
|
|
82
82
|
/**
|
|
83
|
-
* Function invoked when
|
|
83
|
+
* Optional Function invoked when Export is applied (used if no form is supplied)
|
|
84
84
|
*/
|
|
85
85
|
onExport?: (reportContext: ReportContext) => void;
|
|
86
86
|
}
|
|
@@ -7,7 +7,7 @@ import { ColumnFilter, DataSet } from '../../types';
|
|
|
7
7
|
*/
|
|
8
8
|
export interface SearchChangedInfo extends BaseEventInfo {
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* How Search was changed: 'CurrentQuery', 'Filter', 'DataChange' or 'Sort'
|
|
11
11
|
*/
|
|
12
12
|
searchChangedTrigger: 'CurrentQuery' | 'Filter' | 'DataChange' | 'Sort';
|
|
13
13
|
/**
|
|
@@ -199,4 +199,9 @@ export interface FormatColumnApi {
|
|
|
199
199
|
* @param options formatter options
|
|
200
200
|
*/
|
|
201
201
|
getDateFormattedValue(value: any, node: RowNode, abColumn: AdaptableColumn, options: AdaptableFormat['Options']): string;
|
|
202
|
+
/**
|
|
203
|
+
* Checks if a Format Column contains a Custom Display Formatter
|
|
204
|
+
* @param formatColumn Format Column
|
|
205
|
+
*/
|
|
206
|
+
hasCustomDisplayFormatter(formatColumn: FormatColumn): boolean;
|
|
202
207
|
}
|
|
@@ -48,4 +48,5 @@ export declare class FormatColumnApiImpl extends ApiBase implements FormatColumn
|
|
|
48
48
|
getNumberFormattedValue(value: any, node: RowNode, abColumn: AdaptableColumn, options: AdaptableFormat['Options']): string;
|
|
49
49
|
getStringFormattedValue(value: any, node: RowNode, abColumn: AdaptableColumn, options: AdaptableFormat['Options']): string;
|
|
50
50
|
getDateFormattedValue(value: any, node: RowNode, abColumn: AdaptableColumn, options: AdaptableFormat['Options']): string;
|
|
51
|
+
hasCustomDisplayFormatter(formatColumn: FormatColumn): boolean;
|
|
51
52
|
}
|
|
@@ -293,6 +293,9 @@ class FormatColumnApiImpl extends ApiBase_1.ApiBase {
|
|
|
293
293
|
}, customDisplayFormatterContext);
|
|
294
294
|
}
|
|
295
295
|
getNumberFormattedValue(value, node, abColumn, options) {
|
|
296
|
+
if (!value) {
|
|
297
|
+
return undefined;
|
|
298
|
+
}
|
|
296
299
|
const preparedValue = this.applyCustomFormatters(value, node, abColumn, options);
|
|
297
300
|
return FormatHelper_1.default.NumberFormatter(preparedValue, options);
|
|
298
301
|
}
|
|
@@ -301,8 +304,27 @@ class FormatColumnApiImpl extends ApiBase_1.ApiBase {
|
|
|
301
304
|
return FormatHelper_1.default.StringFormatter(preparedValue, options);
|
|
302
305
|
}
|
|
303
306
|
getDateFormattedValue(value, node, abColumn, options) {
|
|
307
|
+
if (!value) {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
304
310
|
const preparedValue = this.applyCustomFormatters(value, node, abColumn, options);
|
|
305
|
-
|
|
311
|
+
const dateFormatterOptions = options;
|
|
312
|
+
// only use DateFormatter if we have a pattern
|
|
313
|
+
return dateFormatterOptions.Pattern
|
|
314
|
+
? FormatHelper_1.default.DateFormatter(preparedValue, options)
|
|
315
|
+
: preparedValue;
|
|
316
|
+
}
|
|
317
|
+
hasCustomDisplayFormatter(formatColumn) {
|
|
318
|
+
var _a;
|
|
319
|
+
if (!formatColumn || !formatColumn.DisplayFormat || !formatColumn.DisplayFormat.Options) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
const options = formatColumn.DisplayFormat.Options;
|
|
323
|
+
const columnCustomFormatters = (_a = options === null || options === void 0 ? void 0 : options.CustomDisplayFormats) !== null && _a !== void 0 ? _a : [];
|
|
324
|
+
if (!(columnCustomFormatters === null || columnCustomFormatters === void 0 ? void 0 : columnCustomFormatters.length)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
return true;
|
|
306
328
|
}
|
|
307
329
|
}
|
|
308
330
|
exports.FormatColumnApiImpl = FormatColumnApiImpl;
|
|
@@ -14,6 +14,7 @@ export declare class LayoutApiImpl extends ApiBase implements LayoutApi {
|
|
|
14
14
|
fireLayoutChangedEvent(trigger: string, oldSate: LayoutState, newState: LayoutState): void;
|
|
15
15
|
getCurrentLayout(): Layout;
|
|
16
16
|
getCurrentLayoutColumnSort(columnId: string): ColumnSort['SortOrder'] | null;
|
|
17
|
+
areDraftAndCurrentLayoutEqual(): boolean;
|
|
17
18
|
getCurrentLayoutName(): string;
|
|
18
19
|
getLayoutByName(layoutName: string): Layout | null;
|
|
19
20
|
getAllLayout(): Layout[];
|
|
@@ -76,6 +76,12 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
|
|
|
76
76
|
const currentLayout = this.getCurrentLayout();
|
|
77
77
|
return ((_d = (_c = (_b = (_a = currentLayout === null || currentLayout === void 0 ? void 0 : currentLayout.ColumnSorts) === null || _a === void 0 ? void 0 : _a.find) === null || _b === void 0 ? void 0 : _b.call(_a, (sort) => sort.ColumnId === columnId)) === null || _c === void 0 ? void 0 : _c.SortOrder) !== null && _d !== void 0 ? _d : null);
|
|
78
78
|
}
|
|
79
|
+
areDraftAndCurrentLayoutEqual() {
|
|
80
|
+
const state = this.getAdaptableState();
|
|
81
|
+
const currentLayout = this.getLayoutByName(state.Layout.CurrentLayout);
|
|
82
|
+
const draftLayout = state.Grid.CurrentLayout;
|
|
83
|
+
return this.areLayoutsEqual(currentLayout, draftLayout);
|
|
84
|
+
}
|
|
79
85
|
getCurrentLayoutName() {
|
|
80
86
|
return this.getAdaptableState().Layout.CurrentLayout;
|
|
81
87
|
}
|
package/src/Api/LayoutApi.d.ts
CHANGED
|
@@ -198,4 +198,9 @@ export interface LayoutApi {
|
|
|
198
198
|
* @param layoutName layout from which to remove Column
|
|
199
199
|
*/
|
|
200
200
|
removeColumnFromLayout(columnId: string, layoutName: string): void;
|
|
201
|
+
/**
|
|
202
|
+
* Checks if the draft layout and the current layout are the same.
|
|
203
|
+
* Useful when `autoSaveLayouts=true`
|
|
204
|
+
*/
|
|
205
|
+
areDraftAndCurrentLayoutEqual(): boolean;
|
|
201
206
|
}
|
|
@@ -682,12 +682,18 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
682
682
|
if (adaptable.adaptableOptions.searchOptions.filterResultsAfterQuickSearch) {
|
|
683
683
|
const actionTyped = action;
|
|
684
684
|
const searchText = actionTyped.quickSearchText;
|
|
685
|
+
// const gridOptions = adaptable.api.gridApi.getAgGridInstance();
|
|
685
686
|
if (StringExtensions_1.StringExtensions.IsNotNullOrEmpty(searchText)) {
|
|
687
|
+
// Currently using this but any searchable would allow us to limit the cols checked
|
|
686
688
|
const queryText = 'ANY_CONTAINS("' + searchText + '") ';
|
|
689
|
+
// const queryText = 'ANY_SEARCHABLE_CONTAINS("' + searchText + '") ';
|
|
687
690
|
adaptable.api.queryApi.setCurrentQuery(queryText);
|
|
691
|
+
// Better still would be to use ag grid if that is possible?
|
|
692
|
+
// gridOptions.api.setQuickFilter(searchText);
|
|
688
693
|
}
|
|
689
694
|
else {
|
|
690
695
|
adaptable.api.queryApi.clearCurrentQuery();
|
|
696
|
+
// gridOptions.api.setQuickFilter('');
|
|
691
697
|
}
|
|
692
698
|
}
|
|
693
699
|
return returnAction;
|
|
@@ -247,7 +247,7 @@ class FormatColumnModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
247
247
|
},
|
|
248
248
|
{
|
|
249
249
|
name: 'Display Format',
|
|
250
|
-
values: [FormatColumnFormatWizardSection_1.getFormatColumnFormatSummaryValue(formatColumn, this.api
|
|
250
|
+
values: [FormatColumnFormatWizardSection_1.getFormatColumnFormatSummaryValue(formatColumn, this.api)],
|
|
251
251
|
},
|
|
252
252
|
getFormatColumnSettingsViewItems_1.getFormatColumnSettingsViewItems(formatColumn),
|
|
253
253
|
getObjectTagsViewItems_1.getObjectTagsViewItems(formatColumn, this.api),
|
|
@@ -10,6 +10,7 @@ const LayoutRadioSelector_1 = require("../View/Layout/LayoutRadioSelector");
|
|
|
10
10
|
const LayoutStatusBarSubPanelPopover_1 = require("../View/Layout/LayoutStatusBarSubPanelPopover");
|
|
11
11
|
const EditCurrentLayoutButton_1 = require("../View/Layout/EditCurrentLayoutButton");
|
|
12
12
|
const LayoutCloneButton_1 = require("../View/Layout/LayoutCloneButton");
|
|
13
|
+
const SaveLayoutButton_1 = require("../View/Layout/SaveLayoutButton");
|
|
13
14
|
class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
14
15
|
constructor(api) {
|
|
15
16
|
super(ModuleConstants.LayoutModuleId, 'Layout', 'layout', 'LayoutPopup', 'Named sets of column visibility, order, groupings, aggregation, pivots etc.', api);
|
|
@@ -293,7 +294,7 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
293
294
|
content: text,
|
|
294
295
|
popover: popover,
|
|
295
296
|
popoverMinWidth: 150,
|
|
296
|
-
extraActions: [EditCurrentLayoutButton_1.EditCurrentLayoutButton],
|
|
297
|
+
extraActions: [EditCurrentLayoutButton_1.EditCurrentLayoutButton, SaveLayoutButton_1.SaveLayoutButton],
|
|
297
298
|
};
|
|
298
299
|
},
|
|
299
300
|
};
|
|
@@ -7,8 +7,8 @@ exports.ExpressionEditorDocsLink = `${exports.HOST_URL_DOCS}/guide/ui-expression
|
|
|
7
7
|
exports.BooleanQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-boolean`;
|
|
8
8
|
exports.ScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-scalar`;
|
|
9
9
|
exports.ObservableQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-observable`;
|
|
10
|
-
exports.AggregatedBooleanQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation
|
|
11
|
-
exports.AggregatedScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation
|
|
10
|
+
exports.AggregatedBooleanQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation-boolean`;
|
|
11
|
+
exports.AggregatedScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation-scalar`;
|
|
12
12
|
exports.PredicateDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-predicate`;
|
|
13
13
|
exports.PrimaryKeyDocsLink = `${exports.HOST_URL_DOCS}/guide/dev-guide-tutorial-primary-key`;
|
|
14
14
|
exports.LicenseDocsLink = `${exports.HOST_URL_DOCS}/guide/licensing`;
|
|
@@ -28,6 +28,7 @@ export declare const AG_GRID_GROUPED_COLUMN: string;
|
|
|
28
28
|
export declare const AG_GRID_PIVOT_COLUMN: string;
|
|
29
29
|
export declare const ADAPTABLE_ROW_ACTION_BUTTONS = "adaptableRowActionButtons";
|
|
30
30
|
export declare const ADAPTABLE_ROW_ACTION_BUTTONS_FRIENDLY_NAME = "(ActionRowButtons)";
|
|
31
|
+
export declare const DEFAULT_DATE_FORMAT_PATTERN = "dd-MM-yyyy";
|
|
31
32
|
export declare const SYSTEM_STATUS_DEFAULT_MAX_MESSAGES_IN_STORE: number;
|
|
32
33
|
export declare const QUICK_SEARCH_DEFAULT_BACK_COLOR: string;
|
|
33
34
|
export declare const QUICK_SEARCH_DEFAULT_FORE_COLOR: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.THEME_STYLE = exports.SELECTED_ROWS_REPORT = exports.SELECTED_CELLS_REPORT = exports.CURRENT_DATA_REPORT = exports.ALL_DATA_REPORT = void 0;
|
|
3
|
+
exports.SYSTEM_THEMES = exports.SMART_EDIT_MATH_OPERATION_STATE_PROPERTY = exports.SMART_EDIT_VALUE_STATE_PROPERTY = exports.QUICK_SEARCH_STYLE_STATE_PROPERTY = exports.QUICK_SEARCH_TEXT_STATE_PROPERTY = exports.CURRENT_THEME_STATE_PROPERTY = exports.FLASHING_CELL_DEFAULT_DURATION_STATE_PROPERTY = exports.FLASHING_CELL_DEFAULT_DOWN_COLOR_STATE_PROPERTY = exports.FLASHING_CELL_DEFAULT_UP_COLOR_STATE_PROPERTY = exports.CURRENT_REPORT_STATE_PROPERTY = exports.CURRENT_LAYOUT_STATE_PROPERTY = exports.SUMMARY_OPERATION_STATE_PROPERTY = exports.ALERT_DEFAULT_SHOW_POPUP = exports.ALERT_DEFAULT_MESSAGE_TYPE = exports.PLUS_MINUS_DEFAULT_NUDGE_VALUE = exports.DEFAULT_LIVE_REPORT_THROTTLE_TIME = exports.THEME_DEFAULT_CURRENT_THEME = exports.SYSTEM_DEFAULT_SYSTEM_STATUS_TYPE = exports.CELL_SUMMARY_DEFAULT_OPERATION = exports.QUICK_SEARCH_DEBOUNCE_TIME = exports.QUICK_SEARCH_DEFAULT_FORE_COLOR = exports.QUICK_SEARCH_DEFAULT_BACK_COLOR = exports.SYSTEM_STATUS_DEFAULT_MAX_MESSAGES_IN_STORE = exports.DEFAULT_DATE_FORMAT_PATTERN = exports.ADAPTABLE_ROW_ACTION_BUTTONS_FRIENDLY_NAME = exports.ADAPTABLE_ROW_ACTION_BUTTONS = exports.AG_GRID_PIVOT_COLUMN = exports.AG_GRID_GROUPED_COLUMN = exports.HALF_SECOND = exports.AB_SPECIAL_COLUMN = exports.EMPTY_ARRAY = exports.EMPTY_STRING = exports.FILTER_THROTTLE = exports.FILTER_NEVER = exports.FILTER_ALWAYS = exports.ALL_COLUMN_VALUES = exports.READ_ONLY_STYLE = exports.MENU_PREFIX = exports.AGGRID_TOOLPANEL_COLUMNS = exports.AGGRID_TOOLPANEL_FILTERS = exports.ADAPTABLE_TOOLPANEL_COMPONENT = exports.ADAPTABLE_TOOLPANEL_ID = exports.ADAPTABLE = exports.ADAPTABLE_ID = exports.USER_NAME = exports.DARK_THEME = exports.LIGHT_THEME = exports.DEFAULT_LAYOUT = exports.MISSING_COLUMN = exports.AUTOGENERATED_PK_COLUMN = void 0;
|
|
4
|
+
exports.THEME_STYLE = exports.SELECTED_ROWS_REPORT = exports.SELECTED_CELLS_REPORT = exports.CURRENT_DATA_REPORT = exports.ALL_DATA_REPORT = exports.VISUAL_DATA_REPORT = void 0;
|
|
5
5
|
const Enums_1 = require("../../PredefinedConfig/Common/Enums");
|
|
6
6
|
const UIHelper_1 = require("../../View/UIHelper");
|
|
7
7
|
exports.AUTOGENERATED_PK_COLUMN = '__ADAPTABLE_PK__';
|
|
@@ -31,6 +31,7 @@ exports.AG_GRID_GROUPED_COLUMN = 'ag-Grid-AutoColumn';
|
|
|
31
31
|
exports.AG_GRID_PIVOT_COLUMN = 'pivot_';
|
|
32
32
|
exports.ADAPTABLE_ROW_ACTION_BUTTONS = 'adaptableRowActionButtons';
|
|
33
33
|
exports.ADAPTABLE_ROW_ACTION_BUTTONS_FRIENDLY_NAME = '(ActionRowButtons)';
|
|
34
|
+
exports.DEFAULT_DATE_FORMAT_PATTERN = 'dd-MM-yyyy';
|
|
34
35
|
/*
|
|
35
36
|
Redux / State Defaults
|
|
36
37
|
Try to put all our Redux / State defaults here and ONLY reference from here - avoid magic numbers / strings.
|
|
@@ -28,7 +28,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
28
28
|
SUM: {
|
|
29
29
|
handler(args, context) {
|
|
30
30
|
const columnParameter = expressionFunctionUtils_1.extractColumnParameter('SUM', args);
|
|
31
|
-
expressionFunctionUtils_1.validateColumnType(columnParameter.value, ['Number'], 'SUM', context.
|
|
31
|
+
expressionFunctionUtils_1.validateColumnType(columnParameter.value, ['Number'], 'SUM', context.adaptableApi);
|
|
32
32
|
const sumAggregationFn = (dataSource$) => getSumAggregation$(dataSource$, getColumnValueSum(columnParameter.value, context));
|
|
33
33
|
const result = {
|
|
34
34
|
type: 'aggregation',
|
|
@@ -195,15 +195,15 @@ const getSumAggregation$ = (source$, initialSum) => {
|
|
|
195
195
|
};
|
|
196
196
|
const getColumnValueSum = (column, context) => {
|
|
197
197
|
let sum = 0;
|
|
198
|
-
context.
|
|
198
|
+
context.adaptableApi.internalApi.forAllRowNodesDo((rowNode) => {
|
|
199
199
|
// if there is a WHERE clause defined, check if the current rowNode satisfies the condition
|
|
200
200
|
if (context.filterFn && !context.filterFn(rowNode)) {
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
-
if (context.
|
|
203
|
+
if (context.adaptableApi.gridApi.isGroupRowNode(rowNode)) {
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
206
|
-
const cellValue = context.
|
|
206
|
+
const cellValue = context.adaptableApi.gridApi.getRawValueFromRowNode(rowNode, column);
|
|
207
207
|
if (cellValue != undefined) {
|
|
208
208
|
sum = sum + expressionFunctionUtils_1.getNumericValue(rowNode.data[column]);
|
|
209
209
|
}
|
|
@@ -8,7 +8,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
8
8
|
handler(args, context) {
|
|
9
9
|
const sumColumnParameter = expressionFunctionUtils_1.extractColumnParameter('SUM', args);
|
|
10
10
|
const sumColumnName = sumColumnParameter.value;
|
|
11
|
-
expressionFunctionUtils_1.validateColumnType(sumColumnName, ['Number'], 'SUM', context.
|
|
11
|
+
expressionFunctionUtils_1.validateColumnType(sumColumnName, ['Number'], 'SUM', context.adaptableApi);
|
|
12
12
|
const groupByParameter = expressionFunctionUtils_1.extractParameter('SUM', 'operand', ['GROUP_BY'], args, true);
|
|
13
13
|
const aggregationExpressionEvaluation = {
|
|
14
14
|
aggregationParams: {
|
|
@@ -50,7 +50,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
50
50
|
var _a;
|
|
51
51
|
const percentageColumnParameter = expressionFunctionUtils_1.extractColumnParameter('PERCENTAGE', args);
|
|
52
52
|
const percentageColumnName = percentageColumnParameter.value;
|
|
53
|
-
expressionFunctionUtils_1.validateColumnType(percentageColumnName, ['Number'], 'PERCENTAGE', context.
|
|
53
|
+
expressionFunctionUtils_1.validateColumnType(percentageColumnName, ['Number'], 'PERCENTAGE', context.adaptableApi);
|
|
54
54
|
const sumOperand = expressionFunctionUtils_1.extractParameter('PERCENTAGE', 'aggregation', ['SUM'], args, true);
|
|
55
55
|
const groupByOperand = expressionFunctionUtils_1.extractParameter('PERCENTAGE', 'operand', ['GROUP_BY'], args, true);
|
|
56
56
|
if (sumOperand && groupByOperand) {
|
|
@@ -79,7 +79,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
79
79
|
},
|
|
80
80
|
},
|
|
81
81
|
rowValueGetter: (rowNode, aggregationValue) => {
|
|
82
|
-
return ((context.
|
|
82
|
+
return ((context.adaptableApi.gridApi.getRawValueFromRowNode(rowNode, percentageColumnName) /
|
|
83
83
|
aggregationValue) *
|
|
84
84
|
100);
|
|
85
85
|
},
|
|
@@ -118,7 +118,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
118
118
|
handler(args, context) {
|
|
119
119
|
const avgColumnParameter = expressionFunctionUtils_1.extractColumnParameter('AVG', args);
|
|
120
120
|
const avgColumnName = avgColumnParameter.value;
|
|
121
|
-
expressionFunctionUtils_1.validateColumnType(avgColumnName, ['Number'], 'AVG', context.
|
|
121
|
+
expressionFunctionUtils_1.validateColumnType(avgColumnName, ['Number'], 'AVG', context.adaptableApi);
|
|
122
122
|
const groupByParameter = expressionFunctionUtils_1.extractParameter('AVG', 'operand', ['GROUP_BY'], args, true);
|
|
123
123
|
const aggregationExpressionEvaluation = {
|
|
124
124
|
aggregationParams: {
|
|
@@ -162,7 +162,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
162
162
|
handler(args, context) {
|
|
163
163
|
const minColumnParameter = expressionFunctionUtils_1.extractColumnParameter('MIN', args);
|
|
164
164
|
const minColumnName = minColumnParameter.value;
|
|
165
|
-
expressionFunctionUtils_1.validateColumnType(minColumnName, ['Number'], 'MIN', context.
|
|
165
|
+
expressionFunctionUtils_1.validateColumnType(minColumnName, ['Number'], 'MIN', context.adaptableApi);
|
|
166
166
|
const groupByParameter = expressionFunctionUtils_1.extractParameter('MIN', 'operand', ['GROUP_BY'], args, true);
|
|
167
167
|
const aggregationExpressionEvaluation = {
|
|
168
168
|
aggregationParams: {
|
|
@@ -203,7 +203,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
203
203
|
handler(args, context) {
|
|
204
204
|
const maxColumnParameter = expressionFunctionUtils_1.extractColumnParameter('MAX', args);
|
|
205
205
|
const maxColumnName = maxColumnParameter.value;
|
|
206
|
-
expressionFunctionUtils_1.validateColumnType(maxColumnName, ['Number'], 'MAX', context.
|
|
206
|
+
expressionFunctionUtils_1.validateColumnType(maxColumnName, ['Number'], 'MAX', context.adaptableApi);
|
|
207
207
|
const groupByParameter = expressionFunctionUtils_1.extractParameter('MAX', 'operand', ['GROUP_BY'], args, true);
|
|
208
208
|
const aggregationExpressionEvaluation = {
|
|
209
209
|
aggregationParams: {
|
|
@@ -284,7 +284,7 @@ exports.aggregatedScalarExpressionFunctions = {
|
|
|
284
284
|
OVER: {
|
|
285
285
|
handler(args, context) {
|
|
286
286
|
const columnParameter = expressionFunctionUtils_1.extractColumnParameter('OVER', args);
|
|
287
|
-
expressionFunctionUtils_1.validateColumnType(columnParameter.value, ['Number', 'Date'], 'OVER', context.
|
|
287
|
+
expressionFunctionUtils_1.validateColumnType(columnParameter.value, ['Number', 'Date'], 'OVER', context.adaptableApi);
|
|
288
288
|
const result = {
|
|
289
289
|
type: 'operand',
|
|
290
290
|
name: 'OVER',
|
|
@@ -225,18 +225,40 @@ exports.booleanExpressionFunctions = {
|
|
|
225
225
|
handler(args, context) {
|
|
226
226
|
var _a;
|
|
227
227
|
const searchTerm = expressionFunctionUtils_1.getStringValue(context, String(args[0]));
|
|
228
|
-
return (_a = context.
|
|
228
|
+
return (_a = context.adaptableApi) === null || _a === void 0 ? void 0 : _a.columnApi.getColumns().some((column) => {
|
|
229
229
|
var _a;
|
|
230
|
-
const value = (_a = context.
|
|
230
|
+
const value = (_a = context.adaptableApi) === null || _a === void 0 ? void 0 : _a.gridApi.getDisplayValueFromRowNode(context.node, column.columnId);
|
|
231
231
|
const columnValue = expressionFunctionUtils_1.getStringValue(context, String(value));
|
|
232
232
|
return columnValue.indexOf(searchTerm) !== -1;
|
|
233
233
|
});
|
|
234
234
|
},
|
|
235
235
|
isPredicate: true,
|
|
236
|
-
description: 'Returns true if any
|
|
236
|
+
description: 'Returns true if any Column contains input',
|
|
237
237
|
signatures: ['ANY_CONTAINS(value)'],
|
|
238
238
|
examples: ['ANY_CONTAINS("abc")'],
|
|
239
239
|
},
|
|
240
|
+
/*
|
|
241
|
+
ANY_SEARCHABLE_CONTAINS: {
|
|
242
|
+
handler(args, context) {
|
|
243
|
+
const searchTerm = getStringValue(context, String(args[0]));
|
|
244
|
+
return context.api?.columnApi
|
|
245
|
+
.getVisibleColumns()
|
|
246
|
+
.filter((c) => !c.isExcludedFromQuickSearch)
|
|
247
|
+
.some((column) => {
|
|
248
|
+
const value = context.api?.gridApi.getDisplayValueFromRowNode(
|
|
249
|
+
context.node,
|
|
250
|
+
column.columnId
|
|
251
|
+
);
|
|
252
|
+
const columnValue = getStringValue(context, String(value));
|
|
253
|
+
return columnValue.indexOf(searchTerm) !== -1;
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
isPredicate: true,
|
|
257
|
+
description: 'Returns true if any Searchable Column contains input',
|
|
258
|
+
signatures: ['ANY_SEARCHABLE_CONTAINS(value)'],
|
|
259
|
+
examples: ['ANY_SEARCHABLE_CONTAINS("abc")'],
|
|
260
|
+
},
|
|
261
|
+
*/
|
|
240
262
|
QUERY: {
|
|
241
263
|
handler(args, context) {
|
|
242
264
|
var _a, _b;
|
|
@@ -244,7 +266,7 @@ exports.booleanExpressionFunctions = {
|
|
|
244
266
|
if (StringExtensions_1.default.IsNullOrEmpty(namedQueryName)) {
|
|
245
267
|
return false;
|
|
246
268
|
}
|
|
247
|
-
const namedQuery = (_a = context.
|
|
269
|
+
const namedQuery = (_a = context.adaptableApi) === null || _a === void 0 ? void 0 : _a.queryApi.getNamedQueryByName(namedQueryName);
|
|
248
270
|
if (!namedQuery) {
|
|
249
271
|
throw new ExpressionEvaluationError_1.ExpressionEvaluationError('QUERY', `Named Query with name ${namedQueryName} not found!`);
|
|
250
272
|
}
|
|
@@ -19,12 +19,12 @@ const getStringValue = (context, stringArgument) => {
|
|
|
19
19
|
return exports.isTextSearchCaseInsensitive(context) ? stringArgument.toLowerCase() : stringArgument;
|
|
20
20
|
};
|
|
21
21
|
exports.getStringValue = getStringValue;
|
|
22
|
-
const isTextSearchCaseInsensitive = (context) => !context.
|
|
22
|
+
const isTextSearchCaseInsensitive = (context) => !context.adaptableApi.internalApi.isTextComparisonCaseSensitive();
|
|
23
23
|
exports.isTextSearchCaseInsensitive = isTextSearchCaseInsensitive;
|
|
24
24
|
// returns an observable which filters the source$ emissions and emits only if the CellDataChangedInfo relates to the given column
|
|
25
25
|
// optionally, if a filter function (where clause) is provided, it is also evaluated
|
|
26
26
|
const getDataChangeLog$ = (context, columnNameFilter) => {
|
|
27
|
-
let dataChangeLog$ = context.
|
|
27
|
+
let dataChangeLog$ = context.adaptableApi.internalApi.getDataService().dataChangeLog$;
|
|
28
28
|
// filter only the given column changes
|
|
29
29
|
dataChangeLog$ = dataChangeLog$.pipe(operators_1.filter((dataChangeLog) => dataChangeLog.column.columnId === columnNameFilter));
|
|
30
30
|
// filter based on the WHERE clause
|
|
@@ -41,14 +41,14 @@ const handleWhereFunction = (args, context) => {
|
|
|
41
41
|
// whereClauseResult
|
|
42
42
|
return evaluator_1.evaluateNode(whereClauseExpressionNode, {
|
|
43
43
|
node: rowNode,
|
|
44
|
-
|
|
44
|
+
adaptableApi: context.adaptableApi,
|
|
45
45
|
functions: context.whereClauseFunctions,
|
|
46
46
|
});
|
|
47
47
|
};
|
|
48
48
|
// observableExpressionResult
|
|
49
49
|
return evaluator_1.evaluateNode(reactiveExpressionNode, {
|
|
50
50
|
node: context.node,
|
|
51
|
-
|
|
51
|
+
adaptableApi: context.adaptableApi,
|
|
52
52
|
functions: context.functions,
|
|
53
53
|
filterFn,
|
|
54
54
|
});
|
|
@@ -76,7 +76,7 @@ const handleColumnFunction = (args, context) => {
|
|
|
76
76
|
if (StringExtensions_1.default.IsNullOrEmpty(args[0])) {
|
|
77
77
|
throw new ExpressionEvaluationError_1.ExpressionEvaluationError('COL', `no column name is provided`);
|
|
78
78
|
}
|
|
79
|
-
validateColumnId(args[0], context.
|
|
79
|
+
validateColumnId(args[0], context.adaptableApi);
|
|
80
80
|
const result = {
|
|
81
81
|
type: 'config',
|
|
82
82
|
name: 'COL',
|
|
@@ -32,12 +32,12 @@ exports.observableExpressionFunctions = {
|
|
|
32
32
|
return getDataChangeCount$(dataChangeLog$, timeframeChange$, operandParameter.value);
|
|
33
33
|
}
|
|
34
34
|
case 'MIN': {
|
|
35
|
-
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MIN', context.
|
|
35
|
+
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MIN', context.adaptableApi);
|
|
36
36
|
const timeframeChange$ = getTrailingRowValueChange$(dataChangeLog$, timeframeParameter.value);
|
|
37
37
|
return getDataChangeMin$(dataChangeLog$, timeframeChange$);
|
|
38
38
|
}
|
|
39
39
|
case 'MAX': {
|
|
40
|
-
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MAX', context.
|
|
40
|
+
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MAX', context.adaptableApi);
|
|
41
41
|
const timeframeChange$ = getTrailingRowValueChange$(dataChangeLog$, timeframeParameter.value);
|
|
42
42
|
return getDataChangeMax$(dataChangeLog$, timeframeChange$);
|
|
43
43
|
}
|
|
@@ -71,12 +71,12 @@ exports.observableExpressionFunctions = {
|
|
|
71
71
|
return getDataChangeCount$(dataChangeLog$, timeframeChange$, operandParameter.value);
|
|
72
72
|
}
|
|
73
73
|
case 'MIN': {
|
|
74
|
-
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MIN', context.
|
|
74
|
+
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MIN', context.adaptableApi);
|
|
75
75
|
const timeframeChange$ = getTrailingGridValueChange$(dataChangeLog$, timeframeParameter.value);
|
|
76
76
|
return getDataChangeMin$(dataChangeLog$, timeframeChange$);
|
|
77
77
|
}
|
|
78
78
|
case 'MAX': {
|
|
79
|
-
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MAX', context.
|
|
79
|
+
expressionFunctionUtils_1.validateColumnType(operandParameter.column, ['Number'], 'MAX', context.adaptableApi);
|
|
80
80
|
const timeframeChange$ = getTrailingGridValueChange$(dataChangeLog$, timeframeParameter.value);
|
|
81
81
|
return getDataChangeMax$(dataChangeLog$, timeframeChange$);
|
|
82
82
|
}
|
|
@@ -229,11 +229,11 @@ const getDataChangedInfoStub = (context) => {
|
|
|
229
229
|
var _a;
|
|
230
230
|
let rowNodeStub;
|
|
231
231
|
if (!context.filterFn) {
|
|
232
|
-
rowNodeStub = context.
|
|
232
|
+
rowNodeStub = context.adaptableApi.gridApi.getFirstRowNode();
|
|
233
233
|
}
|
|
234
234
|
else {
|
|
235
235
|
// if there is a WHERE clause defined, find the first rowNode which satisfies the condition
|
|
236
|
-
context.
|
|
236
|
+
context.adaptableApi.internalApi.forAllRowNodesDo((rowNode) => {
|
|
237
237
|
if (!rowNodeStub) {
|
|
238
238
|
if (context.filterFn(rowNode)) {
|
|
239
239
|
rowNodeStub = rowNode;
|
|
@@ -243,10 +243,10 @@ const getDataChangedInfoStub = (context) => {
|
|
|
243
243
|
}
|
|
244
244
|
const rowNode = rowNodeStub;
|
|
245
245
|
if (rowNode) {
|
|
246
|
-
const primaryKeyValue = context.
|
|
247
|
-
const columnId = (_a = context.
|
|
248
|
-
const oldValue = context.
|
|
249
|
-
const column = context.
|
|
246
|
+
const primaryKeyValue = context.adaptableApi.gridApi.getPrimaryKeyValueForRowNode(rowNode);
|
|
247
|
+
const columnId = (_a = context.adaptableApi.columnApi.getQueryableColumns()[0]) === null || _a === void 0 ? void 0 : _a.columnId;
|
|
248
|
+
const oldValue = context.adaptableApi.gridApi.getCellRawValue(primaryKeyValue, columnId);
|
|
249
|
+
const column = context.adaptableApi.columnApi.getColumnFromId(columnId);
|
|
250
250
|
const newValue = oldValue;
|
|
251
251
|
return {
|
|
252
252
|
changedAt: Date.now(),
|
|
@@ -417,7 +417,7 @@ const getSlidingTimeframe$ = (source$, timeframeDuration, onTimeframeEnter, onTi
|
|
|
417
417
|
}));
|
|
418
418
|
};
|
|
419
419
|
const getMaxTimeframeSize = (expressionValue, context) => {
|
|
420
|
-
let maxTimeframeSize = context.
|
|
420
|
+
let maxTimeframeSize = context.adaptableApi.internalApi.getAdaptableOptions().adaptableQLOptions.expressionOptions
|
|
421
421
|
.maxTimeframeSize;
|
|
422
422
|
if (maxTimeframeSize > SYSTEM_MAX_TIMEFRAME_SIZE) {
|
|
423
423
|
maxTimeframeSize = SYSTEM_MAX_TIMEFRAME_SIZE;
|
|
@@ -95,14 +95,14 @@ exports.scalarExpressionFunctions = {
|
|
|
95
95
|
handler(args, context) {
|
|
96
96
|
var _a, _b;
|
|
97
97
|
const columnId = args[0];
|
|
98
|
-
const column = (_a = context.
|
|
98
|
+
const column = (_a = context.adaptableApi) === null || _a === void 0 ? void 0 : _a.columnApi.getColumnFromId(columnId);
|
|
99
99
|
if (!column) {
|
|
100
100
|
throw new ExpressionEvaluationError_1.ExpressionEvaluationError('COL', `Column name "${columnId}" is not found`);
|
|
101
101
|
}
|
|
102
102
|
if (!column.queryable) {
|
|
103
103
|
throw new ExpressionEvaluationError_1.ExpressionEvaluationError('COL', `Column name "${columnId}" is not queryable`);
|
|
104
104
|
}
|
|
105
|
-
return (_b = context.
|
|
105
|
+
return (_b = context.adaptableApi) === null || _b === void 0 ? void 0 : _b.gridApi.getRawValueFromRowNode(context.node, columnId);
|
|
106
106
|
},
|
|
107
107
|
description: 'Returns the value of a column',
|
|
108
108
|
signatures: ['[colName]', 'COL(name: string)'],
|
|
@@ -6,6 +6,7 @@ const tslib_1 = require("tslib");
|
|
|
6
6
|
// import dateFnsFormat from 'date-fns/format';
|
|
7
7
|
const format_1 = tslib_1.__importDefault(require("date-fns/format"));
|
|
8
8
|
const sentence_case_1 = require("sentence-case");
|
|
9
|
+
const GeneralConstants_1 = require("../Constants/GeneralConstants");
|
|
9
10
|
function Format(input, format) {
|
|
10
11
|
if (format.Formatter === 'NumberFormatter') {
|
|
11
12
|
return NumberFormatter(input, format.Options);
|
|
@@ -79,7 +80,7 @@ function DateFormatter(input, options) {
|
|
|
79
80
|
if (typeof input === 'string') {
|
|
80
81
|
input = new Date(input);
|
|
81
82
|
}
|
|
82
|
-
return format_1.default(input, options.Pattern ||
|
|
83
|
+
return format_1.default(input, (options === null || options === void 0 ? void 0 : options.Pattern) || GeneralConstants_1.DEFAULT_DATE_FORMAT_PATTERN);
|
|
83
84
|
}
|
|
84
85
|
catch (error) {
|
|
85
86
|
return input;
|
|
@@ -19,7 +19,7 @@ class QueryLanguageService {
|
|
|
19
19
|
const booleanAndScalarFunctions = this.getBooleanAndScalarFunctions(moduleExpressionFunctions);
|
|
20
20
|
return parser.evaluate(expression, {
|
|
21
21
|
node: rowNode,
|
|
22
|
-
|
|
22
|
+
adaptableApi: this.adaptableApi,
|
|
23
23
|
functions: booleanAndScalarFunctions,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
@@ -31,7 +31,7 @@ class QueryLanguageService {
|
|
|
31
31
|
const aggregatedScalarFunctions = this.getModuleExpressionFunctions(module).aggregatedScalarFunctions;
|
|
32
32
|
return parser.evaluate(expression, {
|
|
33
33
|
node: null,
|
|
34
|
-
|
|
34
|
+
adaptableApi: this.adaptableApi,
|
|
35
35
|
functions: aggregatedScalarFunctions,
|
|
36
36
|
});
|
|
37
37
|
}
|
|
@@ -40,7 +40,7 @@ class QueryLanguageService {
|
|
|
40
40
|
const booleanAndScalarFunctions = this.getBooleanAndScalarFunctions(moduleExpressionFunctions);
|
|
41
41
|
const reactiveExpression$ = parser.evaluate(reactiveExpression, {
|
|
42
42
|
node: reactiveExpression,
|
|
43
|
-
|
|
43
|
+
adaptableApi: this.adaptableApi,
|
|
44
44
|
functions: moduleExpressionFunctions.observableFunctions,
|
|
45
45
|
whereClauseFunctions: booleanAndScalarFunctions,
|
|
46
46
|
});
|
|
@@ -51,7 +51,7 @@ class QueryLanguageService {
|
|
|
51
51
|
const booleanAndScalarFunctions = this.getBooleanAndScalarFunctions(moduleExpressionFunctions);
|
|
52
52
|
const aggregationExpression$ = parser.evaluate(aggregationExpression, {
|
|
53
53
|
node: aggregationExpression,
|
|
54
|
-
|
|
54
|
+
adaptableApi: this.adaptableApi,
|
|
55
55
|
functions: moduleExpressionFunctions.aggregatedBooleanFunctions,
|
|
56
56
|
whereClauseFunctions: booleanAndScalarFunctions,
|
|
57
57
|
});
|
|
@@ -3,7 +3,6 @@ import { FormatColumn } from '../../../PredefinedConfig/FormatColumnState';
|
|
|
3
3
|
import { AdaptableFormat } from '../../../PredefinedConfig/Common/AdaptableFormat';
|
|
4
4
|
import { AdaptableScope } from '../../../PredefinedConfig/Common/AdaptableScope';
|
|
5
5
|
import { AdaptableApi } from '../../../Api/AdaptableApi';
|
|
6
|
-
import { FormatColumnApi } from '../../../types';
|
|
7
6
|
export declare type FormatColumnFormatWizardSectionProps = {
|
|
8
7
|
onChange: (data: FormatColumn) => void;
|
|
9
8
|
};
|
|
@@ -11,7 +10,7 @@ export interface FormatColumnFormatWizardState {
|
|
|
11
10
|
DisplayFormat: AdaptableFormat;
|
|
12
11
|
NumericFormat?: 'Percent' | 'Thousand' | 'Million' | 'Dollar' | 'Sterling' | undefined;
|
|
13
12
|
}
|
|
14
|
-
export declare const getFormatColumnFormatSummaryValue: (data: FormatColumn,
|
|
13
|
+
export declare const getFormatColumnFormatSummaryValue: (data: FormatColumn, api: AdaptableApi) => string;
|
|
15
14
|
export declare const renderFormatColumnFormatSummary: (data: FormatColumn, api: AdaptableApi) => JSX.Element;
|
|
16
15
|
export declare const getFormatDisplayTypeForScope: (scope: AdaptableScope, api: AdaptableApi) => 'Number' | 'Date' | 'String' | undefined;
|
|
17
16
|
export declare const FormatColumnFormatWizardSection: (props: FormatColumnFormatWizardSectionProps) => JSX.Element;
|