@adaptabletools/adaptable 12.1.7 → 12.1.8-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/base.css +11 -49
- package/bundle.cjs.js +105 -105
- package/index.css +13 -60
- package/package.json +1 -1
- package/publishTimestamp.d.ts +1 -1
- package/publishTimestamp.js +1 -1
- package/src/AdaptableInterfaces/IAdaptable.d.ts +1 -0
- package/src/AdaptableOptions/FilterOptions.d.ts +12 -0
- package/src/AdaptableOptions/FinancePluginOptions.d.ts +22 -1
- package/src/AdaptableOptions/StateOptions.d.ts +25 -12
- package/src/Api/ColumnApi.d.ts +5 -0
- package/src/Api/ExportApi.d.ts +5 -0
- package/src/Api/FilterApi.d.ts +23 -0
- package/src/Api/GridApi.d.ts +1 -0
- package/src/Api/Implementation/ColumnApiImpl.d.ts +1 -0
- package/src/Api/Implementation/ColumnApiImpl.js +5 -0
- package/src/Api/Implementation/ExportApiImpl.d.ts +3 -1
- package/src/Api/Implementation/ExportApiImpl.js +19 -3
- package/src/Api/Implementation/FilterApiImpl.d.ts +5 -0
- package/src/Api/Implementation/FilterApiImpl.js +25 -2
- package/src/Api/Implementation/GridApiImpl.d.ts +1 -0
- package/src/Api/Implementation/InternalApiImpl.d.ts +0 -1
- package/src/Api/Implementation/InternalApiImpl.js +0 -3
- package/src/Api/Implementation/PredicateApiImpl.js +4 -0
- package/src/Api/Implementation/QueryLanguageApiImpl.js +9 -1
- package/src/Api/InternalApi.d.ts +0 -1
- package/src/PredefinedConfig/CalculatedColumnState.d.ts +2 -2
- package/src/PredefinedConfig/Common/AdaptablePredicate.js +16 -4
- package/src/PredefinedConfig/Common/AdaptableQuery.js +1 -1
- package/src/PredefinedConfig/Common/AggregationColumns.d.ts +6 -0
- package/src/PredefinedConfig/Common/AggregationColumns.js +4 -0
- package/src/PredefinedConfig/Common/ColumnFilter.d.ts +2 -2
- package/src/PredefinedConfig/Common/Enums.d.ts +0 -15
- package/src/PredefinedConfig/Common/Enums.js +1 -18
- package/src/PredefinedConfig/ExportState.d.ts +12 -4
- package/src/PredefinedConfig/LayoutState.d.ts +2 -1
- package/src/PredefinedConfig/PopupState.d.ts +1 -2
- package/src/Redux/ActionsReducers/AlertRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/AlertRedux.js +1 -1
- package/src/Redux/ActionsReducers/ConditionalStyleRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/ConditionalStyleRedux.js +1 -1
- package/src/Redux/ActionsReducers/CustomSortRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/CustomSortRedux.js +1 -1
- package/src/Redux/ActionsReducers/FlashingCellRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/FlashingCellRedux.js +1 -1
- package/src/Redux/ActionsReducers/FormatColumnRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/FormatColumnRedux.js +1 -1
- package/src/Redux/ActionsReducers/LayoutRedux.d.ts +28 -0
- package/src/Redux/ActionsReducers/LayoutRedux.js +80 -2
- package/src/Redux/ActionsReducers/PlusMinusRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/PlusMinusRedux.js +1 -1
- package/src/Redux/ActionsReducers/PopupRedux.d.ts +0 -2
- package/src/Redux/ActionsReducers/PopupRedux.js +1 -28
- package/src/Redux/ActionsReducers/ScheduleRedux.d.ts +5 -5
- package/src/Redux/ActionsReducers/ScheduleRedux.js +5 -5
- package/src/Redux/ActionsReducers/ShortcutRedux.d.ts +1 -1
- package/src/Redux/ActionsReducers/ShortcutRedux.js +1 -1
- package/src/Redux/Store/AdaptableStore.js +15 -6
- package/src/Strategy/AlertModule.d.ts +1 -0
- package/src/Strategy/AlertModule.js +20 -0
- package/src/Strategy/CalculatedColumnModule.js +2 -2
- package/src/Strategy/ExportModule.d.ts +0 -1
- package/src/Strategy/ExportModule.js +0 -16
- package/src/Strategy/FilterModule.js +6 -0
- package/src/Strategy/Interface/IModule.d.ts +4 -0
- package/src/Strategy/LayoutModule.js +20 -20
- package/src/Strategy/Utilities/FormatColumn/getFormatColumnStyleViewItems.js +16 -1
- package/src/Strategy/Utilities/Layout/getLayoutFilterViewItems.js +15 -11
- package/src/Utilities/Constants/DocumentationLinkConstants.d.ts +1 -0
- package/src/Utilities/Constants/DocumentationLinkConstants.js +2 -1
- package/src/Utilities/Defaults/DefaultAdaptableOptions.js +2 -0
- package/src/Utilities/ExpressionFunctions/aggregatedBooleanExpressionFunctions.d.ts +12 -2
- package/src/Utilities/ExpressionFunctions/aggregatedBooleanExpressionFunctions.js +30 -66
- package/src/Utilities/ExpressionFunctions/aggregatedScalarExpressionFunctions.d.ts +22 -6
- package/src/Utilities/ExpressionFunctions/aggregatedScalarExpressionFunctions.js +423 -220
- package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.d.ts +7 -1
- package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +23 -7
- package/src/Utilities/ExpressionFunctions/scalarAggregationHelper.d.ts +0 -1
- package/src/Utilities/ExpressionFunctions/scalarAggregationHelper.js +6 -54
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +17 -5
- package/src/Utilities/Interface/MessagePopups.d.ts +0 -4
- package/src/Utilities/ObjectFactory.d.ts +4 -2
- package/src/Utilities/ObjectFactory.js +16 -3
- package/src/Utilities/Services/AggregatedScalarLiveValue.d.ts +25 -0
- package/src/Utilities/Services/AggregatedScalarLiveValue.js +103 -0
- package/src/Utilities/Services/AlertService.d.ts +0 -1
- package/src/Utilities/Services/AlertService.js +5 -17
- package/src/Utilities/Services/CalculatedColumnExpressionService.d.ts +4 -4
- package/src/Utilities/Services/CalculatedColumnExpressionService.js +29 -154
- package/src/Utilities/Services/Interface/ICalculatedColumnExpressionService.d.ts +2 -2
- package/src/Utilities/Services/Interface/IQueryLanguageService.d.ts +6 -3
- package/src/Utilities/Services/QueryLanguageService.d.ts +6 -3
- package/src/Utilities/Services/QueryLanguageService.js +23 -6
- package/src/Utilities/Services/ReportService.js +47 -46
- package/src/View/AdaptableView.js +1 -2
- package/src/View/CalculatedColumn/Utilities/getCalculatedColumnSettingsTags.d.ts +2 -0
- package/src/View/CalculatedColumn/Utilities/{getCalculatedColumnSettingTags.js → getCalculatedColumnSettingsTags.js} +3 -3
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.d.ts +10 -0
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.js +80 -0
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +20 -11
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.d.ts +1 -2
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +9 -52
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnWizard.js +17 -6
- package/src/View/Components/AdaptableObjectList/AdaptableObjectCompactList.js +42 -6
- package/src/View/Components/AdaptableObjectList/AdaptableObjectList.js +1 -1
- package/src/View/Components/EntityRulesEditor/index.js +26 -5
- package/src/View/Components/FilterForm/FilterForm.js +8 -4
- package/src/View/Components/FilterForm/ListBoxFilterForm.js +1 -0
- package/src/View/Components/FilterForm/QuickFilterForm.js +10 -6
- package/src/View/Components/PermittedValuesSelector/PermitedValuesSelector.d.ts +9 -0
- package/src/View/Components/PermittedValuesSelector/PermitedValuesSelector.js +28 -0
- package/src/View/Components/PermittedValuesSelector/index.d.ts +1 -0
- package/src/View/Components/PermittedValuesSelector/index.js +5 -0
- package/src/View/Components/Popups/AdaptablePopup/Navigation.js +2 -2
- package/src/View/Components/Popups/AdaptableToaster.js +2 -7
- package/src/View/Components/Popups/WindowPopups/windowFactory.d.ts +0 -1
- package/src/View/Components/Popups/WindowPopups/windowFactory.js +1 -4
- package/src/View/Export/ExportViewPanel.d.ts +1 -2
- package/src/View/Export/ExportViewPanel.js +2 -6
- package/src/View/Export/Wizard/ReportColumnTypeWizard.d.ts +1 -2
- package/src/View/Export/Wizard/ReportColumnTypeWizard.js +11 -12
- package/src/View/Export/Wizard/ReportRowTypeWizard.d.ts +1 -2
- package/src/View/Export/Wizard/ReportRowTypeWizard.js +12 -13
- package/src/View/Export/Wizard/ReportSettingsWizard.js +1 -2
- package/src/View/Filter/FilterViewPanel.js +20 -4
- package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +1 -1
- package/src/View/Layout/Wizard/{LayoutEditor → Components}/ColumnLabels.d.ts +0 -0
- package/src/View/Layout/Wizard/{LayoutEditor → Components}/ColumnLabels.js +0 -0
- package/src/View/Layout/Wizard/LayoutWizard.js +1 -0
- package/src/View/Layout/Wizard/sections/AggregationsSection.d.ts +1 -0
- package/src/View/Layout/Wizard/sections/AggregationsSection.js +69 -8
- package/src/View/Layout/Wizard/sections/ColumnsSection.js +1 -1
- package/src/View/Query/QueryViewPanel.js +1 -1
- package/src/agGrid/Adaptable.d.ts +10 -3
- package/src/agGrid/Adaptable.js +211 -142
- package/src/agGrid/agGridHelper.d.ts +1 -0
- package/src/agGrid/agGridHelper.js +5 -3
- package/src/agGrid/agGridMenuHelper.d.ts +1 -0
- package/src/agGrid/agGridMenuHelper.js +4 -2
- package/src/agGrid/weightedAverage.d.ts +6 -0
- package/src/agGrid/weightedAverage.js +66 -0
- package/src/components/ExpressionEditor/BaseEditorInput.d.ts +1 -0
- package/src/components/ExpressionEditor/BaseEditorInput.js +2 -3
- package/src/components/ExpressionEditor/EditorInput.d.ts +1 -1
- package/src/components/ExpressionEditor/EditorInput.js +24 -4
- package/src/components/ExpressionEditor/{EditorInputReactive.d.ts → EditorInputWithWhereClause.d.ts} +3 -3
- package/src/components/ExpressionEditor/{EditorInputReactive.js → EditorInputWithWhereClause.js} +6 -5
- package/src/components/ExpressionEditor/editorButtonsAggregatedBoolean.d.ts +2 -0
- package/src/components/ExpressionEditor/{editorButtonsReactive.js → editorButtonsAggregatedBoolean.js} +22 -37
- package/src/components/ExpressionEditor/editorButtonsAggregatedScalar.js +5 -10
- package/src/components/ExpressionEditor/editorButtonsCumulativeAggregatedScalar.d.ts +2 -0
- package/src/components/ExpressionEditor/editorButtonsCumulativeAggregatedScalar.js +50 -0
- package/src/components/ExpressionEditor/editorButtonsObservable.d.ts +2 -0
- package/src/components/ExpressionEditor/editorButtonsObservable.js +40 -0
- package/src/components/ExpressionEditor/index.d.ts +1 -1
- package/src/components/ExpressionEditor/index.js +26 -5
- package/src/metamodel/adaptable.metamodel.d.ts +55 -1
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/src/types.d.ts +3 -3
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/src/View/CalculatedColumn/Utilities/getCalculatedColumnSettingTags.d.ts +0 -2
- package/src/View/Layout/LayoutEditorStandalonePopup.d.ts +0 -3
- package/src/View/Layout/LayoutEditorStandalonePopup.js +0 -78
- package/src/View/Layout/Wizard/LayoutEditor/ColumnList.d.ts +0 -27
- package/src/View/Layout/Wizard/LayoutEditor/ColumnList.js +0 -86
- package/src/View/Layout/Wizard/LayoutEditor/ColumnSortList.d.ts +0 -16
- package/src/View/Layout/Wizard/LayoutEditor/ColumnSortList.js +0 -89
- package/src/View/Layout/Wizard/LayoutEditor/PivotList.d.ts +0 -15
- package/src/View/Layout/Wizard/LayoutEditor/PivotList.js +0 -70
- package/src/View/Layout/Wizard/LayoutEditor/RowGroupsList.d.ts +0 -15
- package/src/View/Layout/Wizard/LayoutEditor/RowGroupsList.js +0 -70
- package/src/View/Layout/Wizard/LayoutEditor/droppableIds.d.ts +0 -7
- package/src/View/Layout/Wizard/LayoutEditor/droppableIds.js +0 -11
- package/src/View/Layout/Wizard/LayoutEditor/getItemStyle.d.ts +0 -6
- package/src/View/Layout/Wizard/LayoutEditor/getItemStyle.js +0 -26
- package/src/View/Layout/Wizard/LayoutEditor/index.d.ts +0 -9
- package/src/View/Layout/Wizard/LayoutEditor/index.js +0 -367
- package/src/View/Layout/Wizard/LayoutEditor/reducer.d.ts +0 -28
- package/src/View/Layout/Wizard/LayoutEditor/reducer.js +0 -46
- package/src/View/Layout/Wizard/LayoutEditor/utils.d.ts +0 -10
- package/src/View/Layout/Wizard/LayoutEditor/utils.js +0 -14
- package/src/View/Layout/Wizard/LayoutEditorWizard.d.ts +0 -30
- package/src/View/Layout/Wizard/LayoutEditorWizard.js +0 -132
- package/src/components/ExpressionEditor/editorButtonsReactive.d.ts +0 -2
|
@@ -575,7 +575,7 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
575
575
|
aggregatedCalculatedColumns.forEach((calculatedColumn) => {
|
|
576
576
|
adaptable.api.internalApi
|
|
577
577
|
.getCalculatedColumnExpressionService()
|
|
578
|
-
.
|
|
578
|
+
.createAggregatedScalarLiveValue(calculatedColumn);
|
|
579
579
|
});
|
|
580
580
|
// refresh calculated columns
|
|
581
581
|
const aggCalculatedColumnIds = aggregatedCalculatedColumns.map((calculatedColumn) => calculatedColumn.ColumnId);
|
|
@@ -596,7 +596,7 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
596
596
|
returnAction.type === CalculatedColumnRedux.CALCULATED_COLUMN_EDIT) {
|
|
597
597
|
adaptable.api.internalApi
|
|
598
598
|
.getCalculatedColumnExpressionService()
|
|
599
|
-
.
|
|
599
|
+
.createAggregatedScalarLiveValue(returnAction.calculatedColumn);
|
|
600
600
|
}
|
|
601
601
|
adaptable.updateColDefsForSpecialColumns();
|
|
602
602
|
return returnAction;
|
|
@@ -621,7 +621,7 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
621
621
|
const returnAction = next(actionTyped);
|
|
622
622
|
adaptable.api.internalApi
|
|
623
623
|
.getCalculatedColumnExpressionService()
|
|
624
|
-
.
|
|
624
|
+
.destroyAggregatedScalarLiveValue(returnAction.calculatedColumn);
|
|
625
625
|
adaptable.updateColDefsForSpecialColumns();
|
|
626
626
|
return returnAction;
|
|
627
627
|
}
|
|
@@ -721,7 +721,11 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
721
721
|
case LayoutRedux.LAYOUT_COLUMN_FILTER_EDIT:
|
|
722
722
|
case LayoutRedux.LAYOUT_COLUMN_FILTER_SET:
|
|
723
723
|
case LayoutRedux.LAYOUT_COLUMN_FILTER_CLEAR:
|
|
724
|
-
case LayoutRedux.LAYOUT_COLUMN_FILTER_CLEAR_ALL:
|
|
724
|
+
case LayoutRedux.LAYOUT_COLUMN_FILTER_CLEAR_ALL:
|
|
725
|
+
case LayoutRedux.LAYOUT_COLUMN_FILTER_SUSPEND:
|
|
726
|
+
case LayoutRedux.LAYOUT_COLUMN_FILTER_SUSPEND_ALL:
|
|
727
|
+
case LayoutRedux.LAYOUT_COLUMN_FILTER_UNSUSPEND:
|
|
728
|
+
case LayoutRedux.LAYOUT_COLUMN_FILTER_UNSUSPEND_ALL: {
|
|
725
729
|
let returnAction;
|
|
726
730
|
// needs to be called before 'next' so previous and next column filters are known
|
|
727
731
|
const shouldTriggerGridFiltering = adaptable.api.filterApi.shouldNewColumnFilterTriggerGridFiltering(action);
|
|
@@ -868,6 +872,8 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
868
872
|
case LayoutRedux.LAYOUT_SET_COLUMN_CAPTION:
|
|
869
873
|
case LayoutRedux.LAYOUT_SELECT: {
|
|
870
874
|
const oldLayoutState = middlewareAPI.getState().Layout;
|
|
875
|
+
// this must be called before 'next(action)'
|
|
876
|
+
const previousLayout = adaptable.api.layoutApi.getCurrentLayout();
|
|
871
877
|
let returnAction = next(action);
|
|
872
878
|
const newLayoutState = middlewareAPI.getState().Layout;
|
|
873
879
|
adaptable.api.layoutApi.fireLayoutChangedEvent(action.type, oldLayoutState, newLayoutState);
|
|
@@ -906,9 +912,12 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
|
|
|
906
912
|
}
|
|
907
913
|
// when changing current layout via the api, the layout should update
|
|
908
914
|
if (returnAction.type == LayoutRedux.LAYOUT_SAVE) {
|
|
909
|
-
const currentLayout = adaptable.api.layoutApi.getCurrentLayout();
|
|
910
915
|
const savingLayout = returnAction.layout;
|
|
911
|
-
if (
|
|
916
|
+
if (previousLayout.Name === savingLayout.Name &&
|
|
917
|
+
previousLayout !== savingLayout &&
|
|
918
|
+
// objects may have changed, but have the same contents
|
|
919
|
+
// this prevents pivot layout from infinite set-layout
|
|
920
|
+
!adaptable.api.layoutApi.areLayoutsEqual(previousLayout, savingLayout)) {
|
|
912
921
|
adaptable.setLayout(savingLayout);
|
|
913
922
|
}
|
|
914
923
|
}
|
|
@@ -22,6 +22,7 @@ export declare class AlertModule extends AdaptableModuleBase implements IModule
|
|
|
22
22
|
private getAlertDefinitionsForCellDataChange;
|
|
23
23
|
private getAlertDefinitionsForGridDataChange;
|
|
24
24
|
private getBaseAlertDefinitionsForDataChange;
|
|
25
|
+
private isAggregationAlertTriggered;
|
|
25
26
|
private isAlertPredicateTriggered;
|
|
26
27
|
private isAlertDefinitionForRowChangeEvent;
|
|
27
28
|
getTeamSharingAction(): TeamSharingImportInfo<AlertDefinition>;
|
|
@@ -18,6 +18,7 @@ const AlertEmptyView_1 = require("../View/Alert/AlertEmptyView");
|
|
|
18
18
|
const AlertStatusSubPanel_1 = require("../View/Alert/AlertStatusSubPanel");
|
|
19
19
|
const getObjectTagsViewItems_1 = require("./Utilities/getObjectTagsViewItems");
|
|
20
20
|
const ActiveAlertsPanelItemLabel_1 = require("../View/Alert/ActiveAlertsPanelItemLabel");
|
|
21
|
+
const ModuleConstants_1 = require("../Utilities/Constants/ModuleConstants");
|
|
21
22
|
class AlertModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
22
23
|
constructor(api) {
|
|
23
24
|
super(ModuleConstants.AlertModuleId, ModuleConstants.AlertModuleFriendlyName, 'alert', 'AlertPopup', 'Get notified when things happen in Adaptable that you need to know about', api);
|
|
@@ -215,6 +216,14 @@ class AlertModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
215
216
|
triggeredAlerts.push(alertDefinition);
|
|
216
217
|
}
|
|
217
218
|
}
|
|
219
|
+
else if (alertDefinition.Rule.AggregatedBooleanExpression) {
|
|
220
|
+
const isValidExpression = this.api.queryLanguageApi.isValidAggregatedBooleanExpression(alertDefinition.Rule.AggregatedBooleanExpression, this.moduleInfo.ModuleName, `Invalid Alert boolean expression '${alertDefinition.Rule.AggregatedBooleanExpression}'`);
|
|
221
|
+
const isSatisfiedExpression = isValidExpression &&
|
|
222
|
+
this.isAggregationAlertTriggered(alertDefinition, dataChangedEvent);
|
|
223
|
+
if (isSatisfiedExpression) {
|
|
224
|
+
triggeredAlerts.push(alertDefinition);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
218
227
|
else {
|
|
219
228
|
if (!this.isAlertDefinitionForRowChangeEvent(alertDefinition) &&
|
|
220
229
|
this.isAlertPredicateTriggered(alertDefinition, dataChangedEvent, defaultNoPredicateReturn)) {
|
|
@@ -225,6 +234,17 @@ class AlertModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
225
234
|
}
|
|
226
235
|
return triggeredAlerts;
|
|
227
236
|
}
|
|
237
|
+
isAggregationAlertTriggered(alertDefinition, dataChangedEvent) {
|
|
238
|
+
const changedColumn = dataChangedEvent.column.columnId;
|
|
239
|
+
const aggregationColumns = this.api.queryLanguageApi.getColumnsFromExpression(alertDefinition.Rule.AggregatedBooleanExpression);
|
|
240
|
+
if (!aggregationColumns.includes(changedColumn)) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
const aggregatedBooleanValue = this.api.internalApi
|
|
244
|
+
.getQueryLanguageService()
|
|
245
|
+
.computeAggregatedBooleanValue(alertDefinition.Rule.AggregatedBooleanExpression, ModuleConstants_1.AlertModuleId);
|
|
246
|
+
return aggregatedBooleanValue;
|
|
247
|
+
}
|
|
228
248
|
isAlertPredicateTriggered(alert, dataChangedEvent, defaultNoPredicateReturn = false) {
|
|
229
249
|
return this.api.predicateApi.handlePredicate(alert.Rule.Predicate, {
|
|
230
250
|
value: dataChangedEvent.newValue,
|
|
@@ -8,9 +8,9 @@ const CalculatedColumnRedux = tslib_1.__importStar(require("../Redux/ActionsRedu
|
|
|
8
8
|
const LoggingHelper_1 = require("../Utilities/Helpers/LoggingHelper");
|
|
9
9
|
const getExpressionViewItems_1 = require("./Utilities/getExpressionViewItems");
|
|
10
10
|
const CalculatedColumnWizard_1 = require("../View/CalculatedColumn/Wizard/CalculatedColumnWizard");
|
|
11
|
-
const getCalculatedColumnSettingTags_1 = require("../View/CalculatedColumn/Utilities/getCalculatedColumnSettingTags");
|
|
12
11
|
const ArrayExtensions_1 = tslib_1.__importDefault(require("../Utilities/Extensions/ArrayExtensions"));
|
|
13
12
|
const getObjectTagsViewItems_1 = require("./Utilities/getObjectTagsViewItems");
|
|
13
|
+
const getCalculatedColumnSettingsTags_1 = require("../View/CalculatedColumn/Utilities/getCalculatedColumnSettingsTags");
|
|
14
14
|
class CalculatedColumnModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
15
15
|
constructor(api) {
|
|
16
16
|
super(ModuleConstants.CalculatedColumnModuleId, ModuleConstants.CalculatedColumnFriendlyName, 'calculated-column', 'CalculatedColumnPopup', 'Create bespoke columns whose cell value is derived dynamically from an Expression', api);
|
|
@@ -69,7 +69,7 @@ class CalculatedColumnModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
toView(calculateColumn) {
|
|
72
|
-
const settingsTags =
|
|
72
|
+
const settingsTags = getCalculatedColumnSettingsTags_1.getCalculatedColumnSettingsTags(calculateColumn.CalculatedColumnSettings);
|
|
73
73
|
let items = [
|
|
74
74
|
{
|
|
75
75
|
name: 'Settings',
|
|
@@ -12,7 +12,6 @@ export declare class ExportModule extends AdaptableModuleBase implements IExport
|
|
|
12
12
|
getModuleAdaptableObjects(): AdaptableObject[];
|
|
13
13
|
getExplicitlyReferencedColumnIds(report: Report): string[];
|
|
14
14
|
getReferencedNamedQueryNames(report: Report): string[];
|
|
15
|
-
updateOldConfig(): void;
|
|
16
15
|
addContextMenuItems(menuContext: ContextMenuContext): AdaptableMenuItem[] | undefined;
|
|
17
16
|
export(report: Report, exportDestination: ExportDestination | string): void;
|
|
18
17
|
private isCustomDestination;
|
|
@@ -9,7 +9,6 @@ const Helper_1 = require("../Utilities/Helpers/Helper");
|
|
|
9
9
|
const ExportRedux = tslib_1.__importStar(require("../Redux/ActionsReducers/ExportRedux"));
|
|
10
10
|
const GeneralConstants_1 = require("../Utilities/Constants/GeneralConstants");
|
|
11
11
|
const ArrayExtensions_1 = tslib_1.__importDefault(require("../Utilities/Extensions/ArrayExtensions"));
|
|
12
|
-
const LoggingHelper_1 = require("../Utilities/Helpers/LoggingHelper");
|
|
13
12
|
const StringExtensions_1 = tslib_1.__importDefault(require("../Utilities/Extensions/StringExtensions"));
|
|
14
13
|
const PopupRedux = tslib_1.__importStar(require("../Redux/ActionsReducers/PopupRedux"));
|
|
15
14
|
const ObjectFactory_1 = require("../Utilities/ObjectFactory");
|
|
@@ -41,21 +40,6 @@ class ExportModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
41
40
|
}
|
|
42
41
|
return this.api.queryApi.getReferencedNamedQueryNames(report.Query.BooleanExpression);
|
|
43
42
|
}
|
|
44
|
-
updateOldConfig() {
|
|
45
|
-
let reportsToEdit = [];
|
|
46
|
-
this.api.exportApi.getAllReports().forEach((report) => {
|
|
47
|
-
if (!report.Query && report.Expression) {
|
|
48
|
-
report.Query = {
|
|
49
|
-
BooleanExpression: report.Expression,
|
|
50
|
-
};
|
|
51
|
-
LoggingHelper_1.LogAdaptableWarning(`Updating incorrect Predefined Config for Report: ${report.Name}`);
|
|
52
|
-
report.Expression = undefined;
|
|
53
|
-
LoggingHelper_1.LogAdaptableInfo('Updating Report: ' + report.Name + ' to use existing Expression');
|
|
54
|
-
reportsToEdit.push(report);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
this.api.exportApi.editReports(reportsToEdit);
|
|
58
|
-
}
|
|
59
43
|
addContextMenuItems(menuContext) {
|
|
60
44
|
const canExport = !menuContext.isRowGroupColumn &&
|
|
61
45
|
this.isModuleAvailable() &&
|
|
@@ -111,6 +111,12 @@ class FilterModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
111
111
|
getViewProperties() {
|
|
112
112
|
const api = this.api;
|
|
113
113
|
return {
|
|
114
|
+
getSuspendAction: (columnFilter) => LayoutRedux.LayoutColumnFilterSuspend(columnFilter),
|
|
115
|
+
getUnSuspendAction: (columnFilter) => LayoutRedux.LayoutColumnFilterUnSuspend(columnFilter),
|
|
116
|
+
getCompactSuspendAction: (columnFilter) => LayoutRedux.LayoutColumnFilterSuspend(columnFilter),
|
|
117
|
+
getCompactUnSuspendAction: (columnFilter) => LayoutRedux.LayoutColumnFilterUnSuspend(columnFilter),
|
|
118
|
+
getSuspendAllAction: () => LayoutRedux.LayoutColumnFilterSuspendAll(),
|
|
119
|
+
getUnSuspendAllAction: () => LayoutRedux.LayoutColumnFilterUnSuspendAll(),
|
|
114
120
|
getDeleteAction: LayoutRedux.LayoutColumnFilterClear,
|
|
115
121
|
getCompactDeleteAction: LayoutRedux.LayoutColumnFilterClear,
|
|
116
122
|
getDeleteAllAction: LayoutRedux.LayoutColumnFilterClearAll,
|
|
@@ -93,6 +93,10 @@ export interface AdaptableModuleView {
|
|
|
93
93
|
getCompactDeleteAction?: (abObject: AdaptableObject) => Redux.Action;
|
|
94
94
|
getSuspendAction?: (abObject: AdaptableObject) => Redux.Action;
|
|
95
95
|
getUnSuspendAction?: (abObject: AdaptableObject) => Redux.Action;
|
|
96
|
+
getCompactSuspendAction?: (abObject: AdaptableObject) => Redux.Action;
|
|
97
|
+
getCompactUnSuspendAction?: (abObject: AdaptableObject) => Redux.Action;
|
|
98
|
+
getSuspendAllAction?: () => Redux.Action;
|
|
99
|
+
getUnSuspendAllAction?: () => Redux.Action;
|
|
96
100
|
getDeleteAllAction?: () => Redux.Action;
|
|
97
101
|
emptyView?: React.FunctionComponent<{
|
|
98
102
|
module: IModule;
|
|
@@ -14,6 +14,7 @@ const SaveLayoutButton_1 = require("../View/Layout/SaveLayoutButton");
|
|
|
14
14
|
const LayoutWizard_1 = require("../View/Layout/Wizard/LayoutWizard");
|
|
15
15
|
const getLayoutFilterViewItems_1 = require("./Utilities/Layout/getLayoutFilterViewItems");
|
|
16
16
|
const getLayoutSortViewItems_1 = require("./Utilities/Layout/getLayoutSortViewItems");
|
|
17
|
+
const AggregationColumns_1 = require("../PredefinedConfig/Common/AggregationColumns");
|
|
17
18
|
class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
18
19
|
constructor(api) {
|
|
19
20
|
super(ModuleConstants.LayoutModuleId, ModuleConstants.LayoutFriendlyName, 'layout', 'LayoutPopup', 'Named sets of column visibility, order, groupings, aggregation, pivots etc.', api);
|
|
@@ -26,26 +27,6 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
26
27
|
}
|
|
27
28
|
});
|
|
28
29
|
}
|
|
29
|
-
/*
|
|
30
|
-
// commenting this out as it doesnt make sense we dont know which filters should be applied to which layout
|
|
31
|
-
// for this we will jsut say they need to reapply them
|
|
32
|
-
updateOldConfig() {
|
|
33
|
-
// @ts-ignore ignore reading deprecated state
|
|
34
|
-
const oldColumnFilters = this.api.filterApi.getFilterState().ColumnFilters;
|
|
35
|
-
if (ArrayExtensions.IsNotNullOrEmpty(oldColumnFilters)) {
|
|
36
|
-
ConsoleLogWarning(
|
|
37
|
-
`DEPRECATED: The 'Filter.ColumnFilters' property is deprecated; use 'Layout.ColumnFilters' instead'!`
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
this.api.internalApi.clearColumnFilterState();
|
|
41
|
-
const currentLayout = this.api.layoutApi.getCurrentLayout();
|
|
42
|
-
|
|
43
|
-
if (ArrayExtensions.IsNullOrEmpty(currentLayout.ColumnFilters)) {
|
|
44
|
-
this.api.layoutApi.setColumnFilter(oldColumnFilters);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
*/
|
|
49
30
|
getModuleAdaptableObjects() {
|
|
50
31
|
return this.api.layoutApi.getAllLayout();
|
|
51
32
|
}
|
|
@@ -264,6 +245,25 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
|
|
|
264
245
|
name: 'Pivot Columns',
|
|
265
246
|
values: layout.PivotColumns.map((colId) => columnIdToFriendlyName(colId)),
|
|
266
247
|
},
|
|
248
|
+
(layout === null || layout === void 0 ? void 0 : layout.AggregationColumns) &&
|
|
249
|
+
Object.keys(layout === null || layout === void 0 ? void 0 : layout.AggregationColumns).length && {
|
|
250
|
+
name: 'Aggregation Columns',
|
|
251
|
+
values: Object.entries(layout === null || layout === void 0 ? void 0 : layout.AggregationColumns)
|
|
252
|
+
.map(([colId, aggFn]) => {
|
|
253
|
+
if (colId === 'Source' || colId === 'Uuid') {
|
|
254
|
+
return '';
|
|
255
|
+
}
|
|
256
|
+
let aggFnName = '';
|
|
257
|
+
if (typeof aggFn === 'string') {
|
|
258
|
+
aggFnName = aggFn;
|
|
259
|
+
}
|
|
260
|
+
else if (typeof aggFn === 'object' && aggFn.type === 'weightedAverage') {
|
|
261
|
+
aggFnName = AggregationColumns_1.WEIGHTED_AVERAGE_AGG_FN_NAME;
|
|
262
|
+
}
|
|
263
|
+
return `${aggFnName}(${columnIdToFriendlyName(colId)})`;
|
|
264
|
+
})
|
|
265
|
+
.filter(Boolean),
|
|
266
|
+
},
|
|
267
267
|
].filter(Boolean),
|
|
268
268
|
abObject: layout,
|
|
269
269
|
};
|
|
@@ -6,6 +6,21 @@ const React = tslib_1.__importStar(require("react"));
|
|
|
6
6
|
const rebass_1 = require("rebass");
|
|
7
7
|
const FormatColumnStyleWizardSection_1 = require("../../../View/FormatColumn/Wizard/FormatColumnStyleWizardSection");
|
|
8
8
|
const getFormatColumnStyleViewItems = (formatColumn, api) => {
|
|
9
|
-
|
|
9
|
+
var _a, _b;
|
|
10
|
+
let styleType = '';
|
|
11
|
+
if ((_a = formatColumn === null || formatColumn === void 0 ? void 0 : formatColumn.ColumnStyle) === null || _a === void 0 ? void 0 : _a.GradientStyle) {
|
|
12
|
+
styleType = 'Gradient';
|
|
13
|
+
}
|
|
14
|
+
else if ((_b = formatColumn === null || formatColumn === void 0 ? void 0 : formatColumn.ColumnStyle) === null || _b === void 0 ? void 0 : _b.PercentBarStyle) {
|
|
15
|
+
styleType = 'Percent Bar';
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
styleType = 'Standard';
|
|
19
|
+
}
|
|
20
|
+
return (React.createElement(rebass_1.Box, { mt: 2 },
|
|
21
|
+
React.createElement(rebass_1.Box, { mb: 1 },
|
|
22
|
+
"Type: ",
|
|
23
|
+
styleType),
|
|
24
|
+
FormatColumnStyleWizardSection_1.renderFormatColumnStyleSummary(formatColumn, api)));
|
|
10
25
|
};
|
|
11
26
|
exports.getFormatColumnStyleViewItems = getFormatColumnStyleViewItems;
|
|
@@ -8,17 +8,21 @@ const getLayoutFilterViewItems = (layout, api) => {
|
|
|
8
8
|
};
|
|
9
9
|
return {
|
|
10
10
|
name: 'Filter',
|
|
11
|
-
values: ((_a = layout.ColumnFilters) !== null && _a !== void 0 ? _a : []).map((customFilter) =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
values: ((_a = layout.ColumnFilters) !== null && _a !== void 0 ? _a : []).map((customFilter) => {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
return `[${columnIdToFriendlyName(customFilter.ColumnId)}: ${customFilter.Predicate.PredicateId} ${((_b = (_a = customFilter.Predicate) === null || _a === void 0 ? void 0 : _a.Inputs) !== null && _b !== void 0 ? _b : [])
|
|
14
|
+
.map((input) => {
|
|
15
|
+
if (typeof input === 'string') {
|
|
16
|
+
return input;
|
|
17
|
+
}
|
|
18
|
+
if (typeof (input === null || input === void 0 ? void 0 : input.toString) === 'function') {
|
|
19
|
+
return input.toString();
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
})
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
.join(', ')}]`;
|
|
25
|
+
}),
|
|
22
26
|
};
|
|
23
27
|
};
|
|
24
28
|
exports.getLayoutFilterViewItems = getLayoutFilterViewItems;
|
|
@@ -5,6 +5,7 @@ export declare const ScalarQueryDocsLink: string;
|
|
|
5
5
|
export declare const ObservableQueryDocsLink: string;
|
|
6
6
|
export declare const AggregatedBooleanQueryDocsLink: string;
|
|
7
7
|
export declare const AggregatedScalarQueryDocsLink: string;
|
|
8
|
+
export declare const CumulativeAggregatedScalarQueryDocsLink: string;
|
|
8
9
|
export declare const PredicateDocsLink: string;
|
|
9
10
|
export declare const PrimaryKeyDocsLink: string;
|
|
10
11
|
export declare const LicenseDocsLink: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AdaptableOptionsDocsLink = exports.LicenseDocsLink = exports.PrimaryKeyDocsLink = exports.PredicateDocsLink = exports.AggregatedScalarQueryDocsLink = exports.AggregatedBooleanQueryDocsLink = exports.ObservableQueryDocsLink = exports.ScalarQueryDocsLink = exports.BooleanQueryDocsLink = exports.ExpressionEditorDocsLink = exports.HOST_URL_DOCS = void 0;
|
|
3
|
+
exports.AdaptableOptionsDocsLink = exports.LicenseDocsLink = exports.PrimaryKeyDocsLink = exports.PredicateDocsLink = exports.CumulativeAggregatedScalarQueryDocsLink = exports.AggregatedScalarQueryDocsLink = exports.AggregatedBooleanQueryDocsLink = exports.ObservableQueryDocsLink = exports.ScalarQueryDocsLink = exports.BooleanQueryDocsLink = exports.ExpressionEditorDocsLink = exports.HOST_URL_DOCS = void 0;
|
|
4
4
|
exports.HOST_URL_DOCS = 'https://docs.adaptabletools.com';
|
|
5
5
|
//export const HOST_URL_DOCS = 'http://localhost:3000';
|
|
6
6
|
exports.ExpressionEditorDocsLink = `${exports.HOST_URL_DOCS}/guide/ui-expression-editor`;
|
|
@@ -9,6 +9,7 @@ exports.ScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expre
|
|
|
9
9
|
exports.ObservableQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-observable`;
|
|
10
10
|
exports.AggregatedBooleanQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation-boolean`;
|
|
11
11
|
exports.AggregatedScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation-scalar`;
|
|
12
|
+
exports.CumulativeAggregatedScalarQueryDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-expression-aggregation-scalar#cumulative-aggregation`;
|
|
12
13
|
exports.PredicateDocsLink = `${exports.HOST_URL_DOCS}/guide/adaptable-ql-predicate`;
|
|
13
14
|
exports.PrimaryKeyDocsLink = `${exports.HOST_URL_DOCS}/guide/dev-guide-tutorial-primary-key`;
|
|
14
15
|
exports.LicenseDocsLink = `${exports.HOST_URL_DOCS}/guide/licensing`;
|
|
@@ -206,6 +206,8 @@ exports.DefaultAdaptableOptions = {
|
|
|
206
206
|
systemFilters: AdaptablePredicate_1.SystemFilterPredicateIds,
|
|
207
207
|
showQuickFilter: true,
|
|
208
208
|
showDistinctFilteredValuesOnly: false,
|
|
209
|
+
showClearFilterButton: false,
|
|
210
|
+
showSuspendFilterButton: false,
|
|
209
211
|
},
|
|
210
212
|
searchOptions: {
|
|
211
213
|
excludeColumnFromQuickSearch: undefined,
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { ExpressionFunction } from '../../parser/src/types';
|
|
2
|
+
import { BaseParameter } from './expressionFunctionUtils';
|
|
3
|
+
import { AggregatedScalarExpressionEvaluation } from './aggregatedScalarExpressionFunctions';
|
|
2
4
|
/**
|
|
3
5
|
* List of all the Aggregation Functions available in AdaptableQL
|
|
4
6
|
*/
|
|
5
|
-
export declare type AggregationFunctionName = 'WHERE' | 'COL' | AggregationFunction | ComparisonFunction;
|
|
6
|
-
declare type AggregationFunction = 'SUM';
|
|
7
|
+
export declare type AggregationFunctionName = 'WHERE' | 'COL' | 'GROUP_BY' | AggregationFunction | ComparisonFunction;
|
|
8
|
+
declare type AggregationFunction = 'SUM' | 'MIN' | 'MAX' | 'AVG';
|
|
7
9
|
declare type ComparisonFunction = 'EQ' | 'NEQ' | 'LT' | 'GT' | 'LTE' | 'GTE';
|
|
10
|
+
export interface BooleanAggregationParameter extends BaseParameter<'aggregationBoolean', AggregationFunction> {
|
|
11
|
+
scalarAggregation: ScalarAggregationOperand;
|
|
12
|
+
conditionValue: number;
|
|
13
|
+
conditionFn: (aggregatedValue: number, conditionValue: number) => boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ScalarAggregationOperand extends BaseParameter<'aggregationScalar', AggregationFunction> {
|
|
16
|
+
value: AggregatedScalarExpressionEvaluation;
|
|
17
|
+
}
|
|
8
18
|
export declare const aggregatedBooleanExpressionFunctions: Record<AggregationFunctionName, ExpressionFunction>;
|
|
9
19
|
export {};
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.aggregatedBooleanExpressionFunctions = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const rxjs_1 = require("rxjs");
|
|
6
5
|
const parseInt_1 = tslib_1.__importDefault(require("lodash/parseInt"));
|
|
7
6
|
const ExpressionEvaluationError_1 = require("../../parser/src/ExpressionEvaluationError");
|
|
8
|
-
const operators_1 = require("rxjs/operators");
|
|
9
7
|
const expressionFunctionUtils_1 = require("./expressionFunctionUtils");
|
|
8
|
+
const aggregatedScalarExpressionFunctions_1 = require("./aggregatedScalarExpressionFunctions");
|
|
9
|
+
const SUPPORTED_AGGREGATION_FNS = ['SUM', 'MIN', 'MAX', 'AVG'];
|
|
10
10
|
const aggregationScalarOperandMap = {
|
|
11
11
|
SUM: ['string', 'number'],
|
|
12
|
+
MIN: ['string', 'number'],
|
|
13
|
+
MAX: ['string', 'number'],
|
|
14
|
+
AVG: ['string', 'number'],
|
|
12
15
|
};
|
|
13
16
|
// 0. optional non-capturing block of empty spaces
|
|
14
17
|
// 1. block containing a numeric value (any digits) (required)
|
|
@@ -25,23 +28,11 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
25
28
|
examples: ['<main_query> WHERE <boolean_query>', '<main_query> WHERE QUERY("abc")'],
|
|
26
29
|
hasEagerEvaluation: true,
|
|
27
30
|
},
|
|
28
|
-
SUM:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const result = {
|
|
34
|
-
type: 'aggregation',
|
|
35
|
-
name: 'SUM',
|
|
36
|
-
column: columnParameter.value,
|
|
37
|
-
aggregationFn: sumAggregationFn,
|
|
38
|
-
};
|
|
39
|
-
return result;
|
|
40
|
-
},
|
|
41
|
-
description: 'Aggregates a column over multiple rows by summing up the column values',
|
|
42
|
-
signatures: ['SUM( [colName] )', 'SUM( COL(name: string) )'],
|
|
43
|
-
examples: ['SUM( [colA] )', "SUM( COL('col1') )"],
|
|
44
|
-
},
|
|
31
|
+
SUM: aggregatedScalarExpressionFunctions_1.aggregatedScalarExpressionFunctions['SUM'],
|
|
32
|
+
MIN: aggregatedScalarExpressionFunctions_1.aggregatedScalarExpressionFunctions['MIN'],
|
|
33
|
+
MAX: aggregatedScalarExpressionFunctions_1.aggregatedScalarExpressionFunctions['MAX'],
|
|
34
|
+
AVG: aggregatedScalarExpressionFunctions_1.aggregatedScalarExpressionFunctions['AVG'],
|
|
35
|
+
GROUP_BY: aggregatedScalarExpressionFunctions_1.aggregatedScalarExpressionFunctions['GROUP_BY'],
|
|
45
36
|
COL: {
|
|
46
37
|
handler(args, context) {
|
|
47
38
|
return expressionFunctionUtils_1.handleColumnFunction(args, context);
|
|
@@ -52,7 +43,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
52
43
|
},
|
|
53
44
|
EQ: {
|
|
54
45
|
handler(args, context) {
|
|
55
|
-
return
|
|
46
|
+
return buildBooleanAggregationParameter(args, context, '=', (aggregatedValue, conditionValue) => aggregatedValue === conditionValue);
|
|
56
47
|
},
|
|
57
48
|
isHiddenFromMenu: true,
|
|
58
49
|
description: 'Evaluates if the aggregation result equals a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -66,7 +57,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
66
57
|
},
|
|
67
58
|
NEQ: {
|
|
68
59
|
handler(args, context) {
|
|
69
|
-
return
|
|
60
|
+
return buildBooleanAggregationParameter(args, context, '!=', (aggregatedValue, conditionValue) => aggregatedValue !== conditionValue);
|
|
70
61
|
},
|
|
71
62
|
isHiddenFromMenu: true,
|
|
72
63
|
description: 'Evaluates if the aggregation result is NOT equal with a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -80,7 +71,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
80
71
|
},
|
|
81
72
|
LT: {
|
|
82
73
|
handler(args, context) {
|
|
83
|
-
return
|
|
74
|
+
return buildBooleanAggregationParameter(args, context, '<', (aggregatedValue, conditionValue) => aggregatedValue < conditionValue);
|
|
84
75
|
},
|
|
85
76
|
isHiddenFromMenu: true,
|
|
86
77
|
description: 'Evaluates if the aggregation result is less than a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -94,7 +85,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
94
85
|
},
|
|
95
86
|
LTE: {
|
|
96
87
|
handler(args, context) {
|
|
97
|
-
return
|
|
88
|
+
return buildBooleanAggregationParameter(args, context, '<=', (aggregatedValue, conditionValue) => aggregatedValue <= conditionValue);
|
|
98
89
|
},
|
|
99
90
|
isHiddenFromMenu: true,
|
|
100
91
|
description: 'Evaluates if the aggregation result is less than or equals a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -108,7 +99,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
108
99
|
},
|
|
109
100
|
GT: {
|
|
110
101
|
handler(args, context) {
|
|
111
|
-
return
|
|
102
|
+
return buildBooleanAggregationParameter(args, context, '>', (aggregatedValue, conditionValue) => aggregatedValue > conditionValue);
|
|
112
103
|
},
|
|
113
104
|
isHiddenFromMenu: true,
|
|
114
105
|
description: 'Evaluates if the aggregation result is greater than a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -122,7 +113,7 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
122
113
|
},
|
|
123
114
|
GTE: {
|
|
124
115
|
handler(args, context) {
|
|
125
|
-
return
|
|
116
|
+
return buildBooleanAggregationParameter(args, context, '>=', (aggregatedValue, conditionValue) => aggregatedValue >= conditionValue);
|
|
126
117
|
},
|
|
127
118
|
isHiddenFromMenu: true,
|
|
128
119
|
description: 'Evaluates if the aggregation result is greater than or equals a numerical value defined either as a number or a string abbreviation for thousands(K), millions(M) or billions(B)',
|
|
@@ -135,24 +126,25 @@ exports.aggregatedBooleanExpressionFunctions = {
|
|
|
135
126
|
examples: [`SUM([col1]) >= '5M'`, 'GTE( SUM([col1]), 250000)'],
|
|
136
127
|
},
|
|
137
128
|
};
|
|
138
|
-
const
|
|
129
|
+
const buildBooleanAggregationParameter = (args, context, comparisonOperator, conditionFn) => {
|
|
139
130
|
// LHS
|
|
140
|
-
const aggregationOperand =
|
|
131
|
+
const aggregationOperand = extractScalarAggregationOperand(comparisonOperator, args[0]);
|
|
141
132
|
// RHS
|
|
142
133
|
const scalarOperand = extractScalarOperand(comparisonOperator, args[1], aggregationScalarOperandMap[aggregationOperand.name]);
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
return {
|
|
135
|
+
type: 'aggregationBoolean',
|
|
136
|
+
name: aggregationOperand.name,
|
|
137
|
+
scalarAggregation: aggregationOperand,
|
|
138
|
+
conditionValue: scalarOperand,
|
|
139
|
+
conditionFn,
|
|
140
|
+
};
|
|
149
141
|
};
|
|
150
|
-
const
|
|
142
|
+
const extractScalarAggregationOperand = (consumingFunctionName, argument) => {
|
|
151
143
|
const result = argument;
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
!
|
|
155
|
-
throw new ExpressionEvaluationError_1.ExpressionEvaluationError(consumingFunctionName, `comparison operator expects as a left-hand operand an aggregation function of type '${
|
|
144
|
+
if (result == undefined ||
|
|
145
|
+
result.type !== 'aggregationScalar' ||
|
|
146
|
+
!SUPPORTED_AGGREGATION_FNS.includes(result.name)) {
|
|
147
|
+
throw new ExpressionEvaluationError_1.ExpressionEvaluationError(consumingFunctionName, `comparison operator expects as a left-hand operand an aggregation function of type '${SUPPORTED_AGGREGATION_FNS.join(' | ')}'`);
|
|
156
148
|
}
|
|
157
149
|
return result;
|
|
158
150
|
};
|
|
@@ -182,31 +174,3 @@ const extractScalarOperand = (consumingFunctionName, value, allowedTypes) => {
|
|
|
182
174
|
// numeric value
|
|
183
175
|
return parseInt_1.default(numericString) * numberUnitRatios[largeNumberUnit.toLowerCase()];
|
|
184
176
|
};
|
|
185
|
-
const getSumAggregation$ = (source$, initialSum) => {
|
|
186
|
-
return rxjs_1.defer(() => {
|
|
187
|
-
let sumValue = initialSum;
|
|
188
|
-
const updateSum = (dataChangeLog) => {
|
|
189
|
-
const oldValue = expressionFunctionUtils_1.getNumericValue(dataChangeLog.oldValue);
|
|
190
|
-
const newValue = expressionFunctionUtils_1.getNumericValue(dataChangeLog.newValue);
|
|
191
|
-
sumValue = sumValue - oldValue + newValue;
|
|
192
|
-
};
|
|
193
|
-
return source$.pipe(operators_1.tap((dataChangeLog) => updateSum(dataChangeLog)), operators_1.map(() => sumValue));
|
|
194
|
-
});
|
|
195
|
-
};
|
|
196
|
-
const getColumnValueSum = (column, context) => {
|
|
197
|
-
let sum = 0;
|
|
198
|
-
context.adaptableApi.internalApi.forAllRowNodesDo((rowNode) => {
|
|
199
|
-
// if there is a WHERE clause defined, check if the current rowNode satisfies the condition
|
|
200
|
-
if (context.filterFn && !context.filterFn(rowNode)) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (context.adaptableApi.gridApi.isGroupRowNode(rowNode)) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
const cellValue = context.adaptableApi.gridApi.getRawValueFromRowNode(rowNode, column);
|
|
207
|
-
if (cellValue != undefined) {
|
|
208
|
-
sum = sum + expressionFunctionUtils_1.getNumericValue(rowNode.data[column]);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
return sum;
|
|
212
|
-
};
|
|
@@ -5,25 +5,41 @@ import { AggregateParams } from './scalarAggregationHelper';
|
|
|
5
5
|
/**
|
|
6
6
|
* List of all the AggregatedScalar Functions available in AdaptableQL
|
|
7
7
|
*/
|
|
8
|
-
export declare type AggregatedScalarFunctionName =
|
|
9
|
-
declare type
|
|
10
|
-
declare type OperandFunction = 'COL' | 'OVER' | 'GROUP_BY';
|
|
11
|
-
export interface
|
|
8
|
+
export declare type AggregatedScalarFunctionName = ScalarAggregationFunction | OperandFunction;
|
|
9
|
+
export declare type ScalarAggregationFunction = 'SUM' | 'PERCENTAGE' | 'QUANT' | 'AVG' | 'MIN' | 'MAX' | 'CUMUL';
|
|
10
|
+
declare type OperandFunction = 'COL' | 'OVER' | 'GROUP_BY' | 'WEIGHT';
|
|
11
|
+
export interface ScalarAggregationParameter extends BaseParameter<'aggregationScalar', ScalarAggregationFunction> {
|
|
12
12
|
value: AggregatedScalarExpressionEvaluation;
|
|
13
13
|
}
|
|
14
14
|
export interface OverParameter extends BaseParameter<'operand', 'OVER'> {
|
|
15
15
|
value: string;
|
|
16
16
|
}
|
|
17
17
|
export interface GroupByParameter extends BaseParameter<'operand', 'GROUP_BY'> {
|
|
18
|
+
value: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface WeightParameter extends BaseParameter<'operand', 'WEIGHT'> {
|
|
18
21
|
value: string;
|
|
19
22
|
}
|
|
20
23
|
export interface AggregatedScalarExpressionEvaluation {
|
|
21
24
|
aggregationParams: AggregateParams<any, string | number>;
|
|
22
25
|
rowValueGetter?: (rowNode: RowNode, aggregatedValue: any) => string | number | Date | boolean;
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated remove this
|
|
28
|
+
*/
|
|
23
29
|
columnDependencies: string[];
|
|
24
|
-
|
|
30
|
+
context?: {
|
|
31
|
+
weightParam?: WeightParameter;
|
|
32
|
+
};
|
|
25
33
|
sortByColumn?: string;
|
|
26
|
-
|
|
34
|
+
rowFilterFn?: (rowNode: RowNode) => boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface CumulatedAggregationValue {
|
|
37
|
+
currentValue: number;
|
|
38
|
+
cumulatedValues: Record<number | string, number>;
|
|
39
|
+
numberOfCumulatedValues?: number;
|
|
40
|
+
totalAggregationValue?: number;
|
|
27
41
|
}
|
|
42
|
+
export declare const cumulativeAggregatedExpressionFunctions: AggregatedScalarFunctionName[];
|
|
43
|
+
export declare const aggregatedExpressionFunctions: AggregatedScalarFunctionName[];
|
|
28
44
|
export declare const aggregatedScalarExpressionFunctions: Record<AggregatedScalarFunctionName, ExpressionFunction>;
|
|
29
45
|
export {};
|