@adaptabletools/adaptable 12.1.8-canary.0 → 12.2.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base.css +116 -22
- package/bundle.cjs.js +108 -108
- package/index.css +132 -23
- package/package.json +1 -1
- package/publishTimestamp.d.ts +1 -1
- package/publishTimestamp.js +1 -1
- package/src/AdaptableOptions/AdaptableQLOptions.d.ts +44 -10
- package/src/AdaptableOptions/FinancePluginOptions.d.ts +5 -11
- package/src/AdaptableOptions/GeneralOptions.d.ts +19 -1
- package/src/AdaptableOptions/StateOptions.d.ts +1 -1
- package/src/Api/Implementation/AlertApiImpl.js +1 -2
- package/src/Api/Implementation/CellSummaryApiImpl.d.ts +5 -0
- package/src/Api/Implementation/CellSummaryApiImpl.js +23 -1
- package/src/Api/Implementation/InternalApiImpl.d.ts +3 -1
- package/src/Api/Implementation/InternalApiImpl.js +34 -0
- package/src/Api/Implementation/LayoutApiImpl.js +2 -2
- package/src/Api/Implementation/QueryLanguageApiImpl.d.ts +1 -0
- package/src/Api/Implementation/QueryLanguageApiImpl.js +5 -0
- package/src/Api/InternalApi.d.ts +6 -1
- package/src/Api/QueryLanguageApi.d.ts +5 -0
- package/src/Strategy/BulkUpdateModule.d.ts +1 -1
- package/src/Strategy/CalculatedColumnModule.js +1 -1
- package/src/Strategy/QueryModule.js +1 -1
- package/src/Strategy/Utilities/Export/getExportRowsViewItems.js +0 -13
- package/src/Strategy/Utilities/getExpressionViewItems.d.ts +3 -4
- package/src/Strategy/Utilities/getExpressionViewItems.js +3 -3
- package/src/Strategy/Utilities/getRuleViewItems.js +1 -1
- package/src/Utilities/Defaults/DefaultAdaptableOptions.js +2 -0
- package/src/Utilities/ExpressionFunctions/aggregatedScalarExpressionFunctions.js +1 -1
- package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +2 -0
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.d.ts +1 -1
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +14 -0
- package/src/Utilities/Services/Interface/IQueryLanguageService.d.ts +2 -0
- package/src/Utilities/Services/QueryLanguageService.d.ts +2 -1
- package/src/Utilities/Services/QueryLanguageService.js +45 -19
- package/src/Utilities/Services/ReportService.js +1 -2
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/AdaptableOptionsForm.d.ts +1 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/AdaptableOptionsForm.js +10 -10
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/Components/FormBox.d.ts +3 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/Components/FormBox.js +9 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/ConfigurationWizard.js +13 -15
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/EntitlementsForm.d.ts +1 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/EntitlementsForm.js +2 -2
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/FinanceForm.d.ts +7 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/FinanceForm.js +280 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/index.d.ts +1 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/index.js +5 -0
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/GridOptionsForm.d.ts +1 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/GridOptionsForm.js +4 -4
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/UIOptions/UIOptionsStatusbarForm.js +2 -8
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/UIOptions/UiOptionsForm.d.ts +1 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/UIOptions/UiOptionsForm.js +3 -3
- package/src/View/AdaptableWizardView/Wizard.js +2 -2
- package/src/View/CalculatedColumn/CalculatedColumnSummary.d.ts +0 -1
- package/src/View/CalculatedColumn/CalculatedColumnSummary.js +1 -8
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +6 -5
- package/src/View/CellSummary/CellSummaryViewPanel.js +1 -1
- package/src/View/Components/AdaptableObjectCollection/index.d.ts +3 -4
- package/src/View/Components/AdaptableObjectCollection/index.js +7 -8
- package/src/View/Components/AdaptableObjectRow/index.js +1 -4
- package/src/View/Components/EntityRulesEditor/index.js +3 -3
- package/src/View/Components/FilterForm/QuickFilterForm.js +9 -1
- package/src/View/Components/Popups/AdaptablePopup/PopupPanel.d.ts +1 -0
- package/src/View/Components/Popups/AdaptablePopup/PopupPanel.js +2 -1
- package/src/View/Components/ValueSelector/index.js +8 -19
- package/src/View/CustomSort/CustomSortSummary.js +1 -1
- package/src/View/Dashboard/DashboardPopup.js +11 -10
- package/src/View/Export/ExportViewPanel.js +2 -2
- package/src/View/Export/Wizard/ReportRowsWizardSection.js +4 -3
- package/src/View/Filter/FilterViewPanel.js +3 -2
- package/src/View/GridInfo/AdaptableObjectsSummary.js +5 -3
- package/src/View/GridInfo/AdaptableOptionsComponent.js +1 -1
- package/src/View/GridInfo/GridInfoPopup.js +6 -7
- package/src/View/Query/Wizard/NamedQueryExpressionWizardSection.js +3 -4
- package/src/View/StateManagement/StateManagementPopup.js +18 -19
- package/src/agGrid/Adaptable.d.ts +2 -0
- package/src/agGrid/Adaptable.js +78 -30
- package/src/agGrid/weightedAverage.d.ts +2 -0
- package/src/agGrid/weightedAverage.js +52 -1
- package/src/bundle-dependencies/bundles/react-toastify/index.js +1 -1
- package/src/components/DragAndDropContext/ModuleManager.js +3 -4
- package/src/components/DragAndDropContext/TabList.js +9 -30
- package/src/components/DragAndDropContext/UnusedPanel.js +1 -7
- package/src/components/DropdownButton/index.js +2 -2
- package/src/components/EmptyContent/index.js +2 -2
- package/src/components/ExpressionEditor/BaseEditorInput.js +1 -0
- package/src/components/ExpressionEditor/index.js +24 -14
- package/src/metamodel/adaptable.metamodel.d.ts +34 -10
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/src/parser/src/types.d.ts +14 -10
- package/src/types.d.ts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/index.css
CHANGED
|
@@ -2544,6 +2544,23 @@ template {
|
|
|
2544
2544
|
--ab-cmp-datepicker__font-family: var(--ab__font-family);
|
|
2545
2545
|
--ab-cmp-datepicker__cell-size: 30px; }
|
|
2546
2546
|
|
|
2547
|
+
:root {
|
|
2548
|
+
--ab-cmp-toggle-button__background: #ccc;
|
|
2549
|
+
--ab-cmp-toggle-button--active__background: var(--ab-color-success);
|
|
2550
|
+
--ab-cmp-toggle-button__font-size: var(--ab-font-size-1);
|
|
2551
|
+
--ab-cmp-toggle-button__color: var(--ab-color-text-on-primary);
|
|
2552
|
+
--ab-cmp-toggle-button--checked__color: var(--ab-color-accentlight); }
|
|
2553
|
+
|
|
2554
|
+
:root {
|
|
2555
|
+
--ab-cmp-module-module-selector__tab-item__border: 1px solid var(--ab-color-primarydark);
|
|
2556
|
+
--ab-cmp-module-module-selector__tab-item__border-radius: var(--ab__border-radius);
|
|
2557
|
+
--ab-cmp-module-module-selector__tab-item__width: 160px;
|
|
2558
|
+
--ab-cmp-module-module-selector__tab-item__header-input__color: var(--ab-color-text-on-primary);
|
|
2559
|
+
--ab-cmp-module-module-selector__toolbar-item__border: 1px solid var(--ab-color-primary);
|
|
2560
|
+
--ab-cmp-module-selector__unused-panel__border: 1px solid var(--ab-color-primarydark);
|
|
2561
|
+
--ab-cmp-module-selector__unused-panel__border-radius: var(--ab__border-radius);
|
|
2562
|
+
--ab-cmp-module-selector__unused-panel__background: var(--ab-color-defaultbackground); }
|
|
2563
|
+
|
|
2547
2564
|
:root {
|
|
2548
2565
|
--ab-cmp-loader__background: var(--ab-color-primarydark);
|
|
2549
2566
|
--ab-cmp-loader__border: var(--ab-color-text-on-primary);
|
|
@@ -2564,6 +2581,10 @@ template {
|
|
|
2564
2581
|
--ab-cmp-icon__height: 17px;
|
|
2565
2582
|
--ab-cmp-icon__width: 17px; }
|
|
2566
2583
|
|
|
2584
|
+
:root {
|
|
2585
|
+
--ab-cmp-listgroupitem__padding: var(--ab-space-2);
|
|
2586
|
+
--ab-cmp-listgroupitem__margin: 0; }
|
|
2587
|
+
|
|
2567
2588
|
:root {
|
|
2568
2589
|
--ab-cmp-wizard__padding: var(--ab-space-5);
|
|
2569
2590
|
--ab-cmp-wizard__margin: var(--ab-space-1);
|
|
@@ -2934,12 +2955,19 @@ template {
|
|
|
2934
2955
|
|
|
2935
2956
|
.ab-DropdownButton {
|
|
2936
2957
|
position: relative;
|
|
2958
|
+
overflow: visible;
|
|
2959
|
+
outline: none;
|
|
2937
2960
|
--ab-overlay-horizontal-align: left; }
|
|
2938
2961
|
|
|
2939
2962
|
.ab-DropdownButton__list {
|
|
2940
2963
|
text-align: start;
|
|
2941
2964
|
padding: var(--ab-space-1) 0;
|
|
2942
|
-
box-shadow: var(--ab-cmp-dropdownbutton-list__box-shadow);
|
|
2965
|
+
box-shadow: var(--ab-cmp-dropdownbutton-list__box-shadow);
|
|
2966
|
+
overflow: auto;
|
|
2967
|
+
border: var(--ab-cmp-dropdownbutton-list__border);
|
|
2968
|
+
borderradius: var(--ab-cmp-dropdownbutton-list__border-radius);
|
|
2969
|
+
zindex: var(--ab-cmp-dropdownbutton-list__z-index);
|
|
2970
|
+
background: var(--ab-cmp-dropdownbutton-list__background); }
|
|
2943
2971
|
|
|
2944
2972
|
.ab-DropdownButton__content {
|
|
2945
2973
|
font-family: var(--ab__font-family);
|
|
@@ -2971,11 +2999,23 @@ template {
|
|
|
2971
2999
|
border-bottom: var(--ab-cmp-dropdownbutton-list-separator__border); }
|
|
2972
3000
|
|
|
2973
3001
|
.ab-EmptyContent {
|
|
2974
|
-
|
|
3002
|
+
position: absolute;
|
|
3003
|
+
top: 0;
|
|
3004
|
+
bottom: 0;
|
|
3005
|
+
left: 0;
|
|
3006
|
+
right: 0;
|
|
3007
|
+
font-size: var(--ab-font-size-3);
|
|
3008
|
+
text-align: center;
|
|
3009
|
+
padding: var(--ab-space-4); }
|
|
2975
3010
|
|
|
2976
3011
|
.ab-EmptyContent p {
|
|
2977
3012
|
color: var(--ab-color-text-on-primary); }
|
|
2978
3013
|
|
|
3014
|
+
.ab-EmptyContent__wrapper {
|
|
3015
|
+
position: relative;
|
|
3016
|
+
width: 100%;
|
|
3017
|
+
height: 100%; }
|
|
3018
|
+
|
|
2979
3019
|
.ab-ErrorBox {
|
|
2980
3020
|
padding: var(--ab-cmp-error-box__padding);
|
|
2981
3021
|
border-radius: var(--ab-cmp-error-box__border-radius);
|
|
@@ -3692,13 +3732,6 @@ input[type='number'].ab-Input:hover::-webkit-inner-spin-button:active {
|
|
|
3692
3732
|
.ab-Datepicker-Overlay .rdp.rdp-with_weeknumber .rdp-row td:nth-child(8) {
|
|
3693
3733
|
display: table-cell; }
|
|
3694
3734
|
|
|
3695
|
-
:root {
|
|
3696
|
-
--ab-cmp-toggle-button__background: #ccc;
|
|
3697
|
-
--ab-cmp-toggle-button--active__background: var(--ab-color-success);
|
|
3698
|
-
--ab-cmp-toggle-button__font-size: var(--ab-font-size-1);
|
|
3699
|
-
--ab-cmp-toggle-button__color: var(--ab-color-text-on-primary);
|
|
3700
|
-
--ab-cmp-toggle-button--checked__color: var(--ab-color-accentlight); }
|
|
3701
|
-
|
|
3702
3735
|
.ab-ToggleButton {
|
|
3703
3736
|
position: relative;
|
|
3704
3737
|
display: inline-block;
|
|
@@ -3825,6 +3858,49 @@ input[type='number'].ab-Input:hover::-webkit-inner-spin-button:active {
|
|
|
3825
3858
|
font-size: var(--ab-cmp-Tag__font-size);
|
|
3826
3859
|
max-width: 100%; }
|
|
3827
3860
|
|
|
3861
|
+
.ab-ModuleSelector__TabItem {
|
|
3862
|
+
display: flex;
|
|
3863
|
+
flex-direction: column;
|
|
3864
|
+
box-sizing: border-box;
|
|
3865
|
+
margin-right: var(--ab-space-2);
|
|
3866
|
+
width: var(--ab-cmp-module-module-selector__tab-item__width);
|
|
3867
|
+
border: var(--ab-cmp-module-module-selector__tab-item__border);
|
|
3868
|
+
border-radius: var(--ab-cmp-module-module-selector__tab-item__border-radius); }
|
|
3869
|
+
|
|
3870
|
+
.ab-ModuleSelector__TabItem__header {
|
|
3871
|
+
display: flex;
|
|
3872
|
+
align-items: center;
|
|
3873
|
+
padding: var(--ab-space-1);
|
|
3874
|
+
border-bottom: var(--ab-cmp-module-module-selector__tab-item__border); }
|
|
3875
|
+
|
|
3876
|
+
.ab-ModuleSelector__TabItem__header-input {
|
|
3877
|
+
flex: 1;
|
|
3878
|
+
width: 100%;
|
|
3879
|
+
margin-left: var(--ab-space-1);
|
|
3880
|
+
margin-right: var(--ab-space-1);
|
|
3881
|
+
align-self: stretch;
|
|
3882
|
+
background: transparent;
|
|
3883
|
+
border: none;
|
|
3884
|
+
color: var(--ab-cmp-module-module-selector__tab-item__header-input__color); }
|
|
3885
|
+
|
|
3886
|
+
.ab-ModuleSelector__ToolbarList {
|
|
3887
|
+
flex: 1;
|
|
3888
|
+
padding: 4px;
|
|
3889
|
+
padding-bottom: 0;
|
|
3890
|
+
min-height: 200px; }
|
|
3891
|
+
|
|
3892
|
+
.ab-ModuleSelector__ToolbarItem {
|
|
3893
|
+
border: var(--ab-cmp-module-module-selector__toolbar-item__border);
|
|
3894
|
+
padding-left: var(--ab-space-1);
|
|
3895
|
+
margin-bottom: var(--ab-space-1); }
|
|
3896
|
+
|
|
3897
|
+
.ab-ModuleSelector__UnusedPanel {
|
|
3898
|
+
margin-bottom: var(--ab-space-2);
|
|
3899
|
+
padding-bottom: var(--ab-space-1);
|
|
3900
|
+
border: var(--ab-cmp-module-selector__unused-panel__border);
|
|
3901
|
+
border-radius: var(--ab-cmp-module-selector__unused-panel__border-radius);
|
|
3902
|
+
background-color: var(--ab-cmp-module-selector__unused-panel__background); }
|
|
3903
|
+
|
|
3828
3904
|
.ab-AdaptableOptions {
|
|
3829
3905
|
background: var(--ab-cmp-adaptable-options__background-color); }
|
|
3830
3906
|
|
|
@@ -3846,6 +3922,9 @@ input[type='number'].ab-Input:hover::-webkit-inner-spin-button:active {
|
|
|
3846
3922
|
color: var(--ab-cmp-listgroupitem--odd__color); }
|
|
3847
3923
|
|
|
3848
3924
|
.ab-AdaptableObjectRow {
|
|
3925
|
+
align-items: center;
|
|
3926
|
+
padding: var(--ab-cmp-listgroupitem__padding);
|
|
3927
|
+
margin: var(--ab-cmp-listgroupitem__margin);
|
|
3849
3928
|
background: var(--ab-cmp-listgroupitem__background);
|
|
3850
3929
|
color: var(--ab-cmp-listgroupitem__color);
|
|
3851
3930
|
border-radius: var(--ab-cmp-listgroupitem__border-radius); }
|
|
@@ -3912,19 +3991,24 @@ html.ab--theme-dark .ab-ListBoxFilterForm--aggrid-style {
|
|
|
3912
3991
|
bottom: -10px;
|
|
3913
3992
|
transform: translate3d(-5px, 0px, 0px); }
|
|
3914
3993
|
|
|
3915
|
-
.ab-
|
|
3994
|
+
.ab-NocodeWizard {
|
|
3916
3995
|
padding: var(--ab-cmp-wizard__padding);
|
|
3917
3996
|
margin: var(--ab-cmp-wizard__margin);
|
|
3918
3997
|
background: var(--ab-cmp-wizard__background);
|
|
3919
3998
|
color: var(--ab-cmp-wizard__color);
|
|
3920
3999
|
height: 100%; }
|
|
3921
4000
|
|
|
3922
|
-
.ab-
|
|
3923
|
-
.ab-
|
|
3924
|
-
.ab-
|
|
3925
|
-
.ab-
|
|
4001
|
+
.ab-NocodeWizard,
|
|
4002
|
+
.ab-NocodeWizard *,
|
|
4003
|
+
.ab-NocodeWizard *:before,
|
|
4004
|
+
.ab-NocodeWizard *:after {
|
|
3926
4005
|
box-sizing: border-box; }
|
|
3927
4006
|
|
|
4007
|
+
.ab-NocodeWizardFormBox {
|
|
4008
|
+
border: 1px solid var(--ab-color-primarydark);
|
|
4009
|
+
border-radius: var(--ab__border-radius);
|
|
4010
|
+
background-color: var(--ab-color-defaultbackground); }
|
|
4011
|
+
|
|
3928
4012
|
.ab-AvailableDropZone .placeholder,
|
|
3929
4013
|
.ab-SelectedDropZone .placeholder {
|
|
3930
4014
|
width: 100%; }
|
|
@@ -4065,20 +4149,23 @@ html.ab--theme-dark .ab-ListBoxFilterForm--aggrid-style {
|
|
|
4065
4149
|
padding: var(--ab-cmp-adaptable-popup--settings__padding);
|
|
4066
4150
|
min-width: 0; }
|
|
4067
4151
|
|
|
4152
|
+
.ab-Adaptable-Popup__Panel {
|
|
4153
|
+
width: 100%; }
|
|
4154
|
+
|
|
4068
4155
|
.ab-Adaptable-Popup__Panel__Header {
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4156
|
+
display: flex;
|
|
4157
|
+
padding: 0 var(--ab-cmp-adaptable-popup-panel__padding);
|
|
4158
|
+
margin-bottom: var(--ab-cmp-adaptable-popup-panel__margin-bottom);
|
|
4159
|
+
margin-top: var(--ab-cmp-adaptable-popup-panel__margin-top); }
|
|
4073
4160
|
|
|
4074
4161
|
.ab-Adaptable-Popup__Panel__Header__Title {
|
|
4075
|
-
|
|
4162
|
+
font-size: var(--ab-cmp-adaptable-popup-panel-title__font-size); }
|
|
4076
4163
|
|
|
4077
4164
|
.ab-Adaptable-Popup__Panel__Body {
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4165
|
+
padding: var(--ab-cmp-adaptable-popup-panel-body__padding);
|
|
4166
|
+
flex: 1 1 0;
|
|
4167
|
+
min-height: 0;
|
|
4168
|
+
overflow: auto; }
|
|
4082
4169
|
|
|
4083
4170
|
.ab-Adaptable-Popup--window .ab-Adaptable-Popup__TopBar {
|
|
4084
4171
|
cursor: move; }
|
|
@@ -4211,6 +4298,28 @@ button.ab-StatusBar__SubPanel:hover {
|
|
|
4211
4298
|
--ab-cmp-adaptable-permitted-values-selector__background-color: var(--ab-color-defaultbackground);
|
|
4212
4299
|
--ab-cmp-adaptable-permitted-values-selector__padding: var(--ab-space-1); }
|
|
4213
4300
|
|
|
4301
|
+
.ab-ValueSelector {
|
|
4302
|
+
overflow: hidden; }
|
|
4303
|
+
|
|
4304
|
+
.ab-ValueSelector__option {
|
|
4305
|
+
border-radius: 'var(--ab__border-radius)'; }
|
|
4306
|
+
|
|
4307
|
+
.ab-ValueSelector__show-selected-only-checkbox {
|
|
4308
|
+
position: sticky;
|
|
4309
|
+
top: 0;
|
|
4310
|
+
z-index: 10000; }
|
|
4311
|
+
|
|
4312
|
+
.ab-ValueSelector__show-selected-only-checkbox__text {
|
|
4313
|
+
position: absolute;
|
|
4314
|
+
top: 2px;
|
|
4315
|
+
right: 4px;
|
|
4316
|
+
overflow: hidden;
|
|
4317
|
+
border-radius: var(--ab__border-radius);
|
|
4318
|
+
margin-right: var(--ab-space-1);
|
|
4319
|
+
margin-top: var(--ab-space-1);
|
|
4320
|
+
padding: 0 var(--ab-space-2);
|
|
4321
|
+
font-size: var(--ab-font-size-2); }
|
|
4322
|
+
|
|
4214
4323
|
.ab-alert--error {
|
|
4215
4324
|
background: var(--ab-color-error); }
|
|
4216
4325
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptabletools/adaptable",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.2.0-canary.1",
|
|
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: 1661757179502;
|
|
2
2
|
export default _default;
|
package/publishTimestamp.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ExpressionFunctionMap } from '../parser/src/types';
|
|
2
2
|
import { AdaptablePredicateDef } from '../PredefinedConfig/Common/AdaptablePredicate';
|
|
3
|
-
import { AdaptableModule, AdaptableQLModules } from '../PredefinedConfig/Common/Types';
|
|
3
|
+
import { AdaptableModule, AdaptableQLModule, AdaptableQLModules } from '../PredefinedConfig/Common/Types';
|
|
4
|
+
import { BaseContext } from '../PredefinedConfig/Common/BaseContext';
|
|
5
|
+
import { AdaptableColumn } from '../PredefinedConfig/Common/AdaptableColumn';
|
|
4
6
|
/**
|
|
5
|
-
* Options for managing AdaptableQL - the Adaptable Query
|
|
7
|
+
* Options for managing AdaptableQL - the Adaptable Query Language which evaluates Predicates and Expressions
|
|
6
8
|
*/
|
|
7
9
|
export interface AdaptableQLOptions {
|
|
8
10
|
/**
|
|
@@ -17,10 +19,15 @@ export interface AdaptableQLOptions {
|
|
|
17
19
|
*
|
|
18
20
|
* @defaultValue undefined
|
|
19
21
|
* @gridInfoItem
|
|
22
|
+
* @deprecated use `evaluateAdaptableQLExternally()` instead
|
|
20
23
|
*/
|
|
21
24
|
externallyEvaluatedModules?: AdaptableQLModules;
|
|
22
25
|
/**
|
|
23
|
-
*
|
|
26
|
+
* Whether a specific expression (or all expressions in a given module) must be evaluated on the server
|
|
27
|
+
*/
|
|
28
|
+
evaluateAdaptableQLExternally?: (context: EvaluateExpressionExternallyContext) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Options for managing Expressions in AdaptableQL
|
|
24
31
|
*
|
|
25
32
|
*/
|
|
26
33
|
expressionOptions?: ExpressionOptions;
|
|
@@ -28,41 +35,47 @@ export interface AdaptableQLOptions {
|
|
|
28
35
|
* Definitions for Custom provided Predicates
|
|
29
36
|
*/
|
|
30
37
|
customPredicateDefs?: AdaptablePredicateDef[];
|
|
38
|
+
/**
|
|
39
|
+
* Whether to display the column friendly names in all expression overviews (instead of their technical IDs)
|
|
40
|
+
*
|
|
41
|
+
* @defaultValue true
|
|
42
|
+
*/
|
|
43
|
+
displayColumnFriendlyNamesForExpressions?: boolean;
|
|
31
44
|
}
|
|
32
45
|
/**
|
|
33
|
-
* Options for managing Expressions using
|
|
46
|
+
* Options for managing Expressions using AdaptableQL
|
|
34
47
|
*/
|
|
35
48
|
export interface ExpressionOptions {
|
|
36
49
|
/**
|
|
37
|
-
* Boolean Expression Functions available in
|
|
50
|
+
* Boolean Expression Functions available in AdaptableQL
|
|
38
51
|
*
|
|
39
52
|
* @defaultValue null (sets all)
|
|
40
53
|
* @gridInfoItem
|
|
41
54
|
*/
|
|
42
55
|
defaultBooleanFunctions?: ExpressionFunctionMap;
|
|
43
56
|
/**
|
|
44
|
-
* Scalar Expression Functions available in
|
|
57
|
+
* Scalar Expression Functions available in AdaptableQL
|
|
45
58
|
*
|
|
46
59
|
* @defaultValue null (sets all)
|
|
47
60
|
* @gridInfoItem
|
|
48
61
|
*/
|
|
49
62
|
defaultScalarFunctions?: ExpressionFunctionMap;
|
|
50
63
|
/**
|
|
51
|
-
* Observable Expression Functions available in
|
|
64
|
+
* Observable Expression Functions available in AdaptableQL
|
|
52
65
|
*
|
|
53
66
|
* @defaultValue null (sets all)
|
|
54
67
|
* @gridInfoItem
|
|
55
68
|
*/
|
|
56
69
|
defaultObservableFunctions?: ExpressionFunctionMap;
|
|
57
70
|
/**
|
|
58
|
-
* Aggregated Boolean Expression Functions available in
|
|
71
|
+
* Aggregated Boolean Expression Functions available in AdaptableQL
|
|
59
72
|
*
|
|
60
73
|
* @defaultValue null (sets all)
|
|
61
74
|
* @gridInfoItem
|
|
62
75
|
*/
|
|
63
76
|
defaultAggregatedBooleanFunctions?: ExpressionFunctionMap;
|
|
64
77
|
/**
|
|
65
|
-
* Aggregated Scalar Expression Functions available in
|
|
78
|
+
* Aggregated Scalar Expression Functions available in AdaptableQL
|
|
66
79
|
*
|
|
67
80
|
* @defaultValue null (sets all)
|
|
68
81
|
* @gridInfoItem
|
|
@@ -78,7 +91,7 @@ export interface ExpressionOptions {
|
|
|
78
91
|
[module in AdaptableModule]?: ModuleExpressionFunctions;
|
|
79
92
|
};
|
|
80
93
|
/**
|
|
81
|
-
* Columns that can be included in
|
|
94
|
+
* Columns that can be included in AdaptableQL Expressions; leave unset to include **ALL**, provide empty array to set **NONE**
|
|
82
95
|
*
|
|
83
96
|
* @defaultValue undefined
|
|
84
97
|
* @gridInfoItem
|
|
@@ -98,6 +111,10 @@ export interface ExpressionOptions {
|
|
|
98
111
|
* @gridInfoItem
|
|
99
112
|
*/
|
|
100
113
|
maxTimeframeSize?: number;
|
|
114
|
+
/**
|
|
115
|
+
* Custom query variables allow values to be attached to variables so that a single value can easily be expressed multiple times within a query, or quickly changed to affect the results of a query. Variables are evaluated synchronously with each expression evaluation.
|
|
116
|
+
*/
|
|
117
|
+
customQueryVariable?: Record<string, string | number | boolean | Date | ((context: CustomQueryVariableContext) => string | number | boolean | Date)>;
|
|
101
118
|
}
|
|
102
119
|
/**
|
|
103
120
|
* Module specific Expression Functions
|
|
@@ -109,3 +126,20 @@ export interface ModuleExpressionFunctions {
|
|
|
109
126
|
aggregatedBooleanFunctions?: ExpressionFunctionMap;
|
|
110
127
|
aggregatedScalarFunctions?: ExpressionFunctionMap;
|
|
111
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Context passed when evaluating `ExpressionOptions.customQueryVariable`
|
|
131
|
+
*/
|
|
132
|
+
export interface CustomQueryVariableContext extends BaseContext {
|
|
133
|
+
/**
|
|
134
|
+
* Optional variable arguments
|
|
135
|
+
*/
|
|
136
|
+
args?: any[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Context passed when evaluating `AdaptableQLOptions.evaluateExpressionExternally()`
|
|
140
|
+
*/
|
|
141
|
+
export interface EvaluateExpressionExternallyContext extends BaseContext {
|
|
142
|
+
module: AdaptableQLModule;
|
|
143
|
+
expression?: string;
|
|
144
|
+
referencedColumns?: AdaptableColumn[];
|
|
145
|
+
}
|
|
@@ -37,14 +37,14 @@ export interface FinancePluginOptions {
|
|
|
37
37
|
*/
|
|
38
38
|
customFDC3Intents?: CustomFDC3Intent[];
|
|
39
39
|
};
|
|
40
|
-
/**
|
|
41
|
-
* Columns to use a Weighted Average aggregation
|
|
42
|
-
*/
|
|
43
|
-
weightedAverageColumns?: WeightedAverageColumn[];
|
|
44
40
|
/**
|
|
45
41
|
* Intents to which to subscribe.
|
|
46
42
|
*/
|
|
47
43
|
availableFDC3Intents?: (FDC3Intent | CustomFDC3Intent)[];
|
|
44
|
+
/**
|
|
45
|
+
* @deprecated - use Weighted Average Layout Aggregation
|
|
46
|
+
*/
|
|
47
|
+
weightedAverageColumns?: WeightedAverageColumn[];
|
|
48
48
|
/**
|
|
49
49
|
* Called when an intent from `availableIntents` is raised.
|
|
50
50
|
*/
|
|
@@ -55,16 +55,10 @@ export interface FinancePluginOptions {
|
|
|
55
55
|
onFDC3Context?: (context: FDC3Context, adaptableApi: AdaptableApi) => void;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* @deprecated - use Weighted Average Layout Aggregation
|
|
59
59
|
*/
|
|
60
60
|
export interface WeightedAverageColumn {
|
|
61
|
-
/**
|
|
62
|
-
* Column which will contain the aggregation
|
|
63
|
-
*/
|
|
64
61
|
columnId: string;
|
|
65
|
-
/**
|
|
66
|
-
* Column used to perform the aggreation calculation
|
|
67
|
-
*/
|
|
68
62
|
weightedColumnId: string;
|
|
69
63
|
}
|
|
70
64
|
/**
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { AdaptableForm, AdaptableObject, AdaptableScope } from '../../types';
|
|
1
|
+
import { AdaptableColumn, AdaptableForm, AdaptableObject, AdaptableScope, BaseContext } from '../../types';
|
|
2
2
|
import { AdaptableComparerFunction } from '../PredefinedConfig/Common/AdaptableComparerFunction';
|
|
3
3
|
import { AlternativeModuleName } from '../PredefinedConfig/Common/AlternativeModuleName';
|
|
4
4
|
import { FormContext } from '../PredefinedConfig/Common/FormContext';
|
|
5
5
|
import { CellSummaryOperation } from '../PredefinedConfig/Common/CellSummary';
|
|
6
|
+
import { KeyCreatorParams } from '@ag-grid-community/all-modules';
|
|
6
7
|
/**
|
|
7
8
|
* General options for configuring AdapTable including managing Primary Keys
|
|
8
9
|
*/
|
|
@@ -60,6 +61,10 @@ export interface GeneralOptions {
|
|
|
60
61
|
* Collection of Data Sets to provide Data to AdapTable
|
|
61
62
|
*/
|
|
62
63
|
dataSets?: DataSet[];
|
|
64
|
+
/**
|
|
65
|
+
* Value to use for 'Unbalanced Groups' (string columns)
|
|
66
|
+
*/
|
|
67
|
+
unbalancedGroupsKey?: string | ((context: UnbalancedGroupsKeyContext) => string);
|
|
63
68
|
}
|
|
64
69
|
/**
|
|
65
70
|
* Comparer object for Column Values - used for custom sorting
|
|
@@ -100,3 +105,16 @@ export interface DataSetFormContext extends FormContext {
|
|
|
100
105
|
*/
|
|
101
106
|
dataSet: DataSet;
|
|
102
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Context used when setting a value for Unbalanced Row Groups
|
|
110
|
+
*/
|
|
111
|
+
export interface UnbalancedGroupsKeyContext extends BaseContext {
|
|
112
|
+
/**
|
|
113
|
+
* Adaptable Column being grouped
|
|
114
|
+
*/
|
|
115
|
+
adaptableColumn: AdaptableColumn;
|
|
116
|
+
/**
|
|
117
|
+
* AG Grid's Key Creator Params
|
|
118
|
+
*/
|
|
119
|
+
params: KeyCreatorParams;
|
|
120
|
+
}
|
|
@@ -313,10 +313,9 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
313
313
|
return scopeDescription + ' - ' + ruleDescription;
|
|
314
314
|
}
|
|
315
315
|
getAlertRuleDescription(alert) {
|
|
316
|
-
var _a, _b;
|
|
317
316
|
let ruleDescription = alert.Rule.Predicate
|
|
318
317
|
? this.adaptable.api.predicateApi.predicateToString(alert.Rule.Predicate)
|
|
319
|
-
:
|
|
318
|
+
: this.adaptable.api.internalApi.getAdaptableQueryExpressionText(alert.Rule);
|
|
320
319
|
return ruleDescription;
|
|
321
320
|
}
|
|
322
321
|
}
|
|
@@ -9,4 +9,9 @@ export declare class CellSummaryApiImpl extends ApiBase implements CellSummaryAp
|
|
|
9
9
|
setCurrentCellSummaryOperation(operation: SummaryOperation | string): void;
|
|
10
10
|
getCellSummaryOperationValue(operation: SummaryOperation | string): any;
|
|
11
11
|
getCurrentCellSummaryOperationValue(): any;
|
|
12
|
+
/**
|
|
13
|
+
* Weighted average is availabe only if the current layout has at leat a Weighted Average aggregation defined.
|
|
14
|
+
*/
|
|
15
|
+
private isWeightedAvetageCellSummaryAvailable;
|
|
16
|
+
private getWeightedAverageCellSummaryOperation;
|
|
12
17
|
}
|
|
@@ -6,12 +6,21 @@ const ApiBase_1 = require("./ApiBase");
|
|
|
6
6
|
const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
|
|
7
7
|
const SystemRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/SystemRedux"));
|
|
8
8
|
const Enums_1 = require("../../PredefinedConfig/Common/Enums");
|
|
9
|
+
const weightedAverage_1 = require("../../agGrid/weightedAverage");
|
|
9
10
|
class CellSummaryApiImpl extends ApiBase_1.ApiBase {
|
|
10
11
|
getCurrentCellSummaryOperation() {
|
|
11
12
|
return this.getAdaptableState().System.CellSummaryOperation;
|
|
12
13
|
}
|
|
13
14
|
getCellSummaryOperationDefinitions() {
|
|
14
|
-
|
|
15
|
+
var _a;
|
|
16
|
+
let cellSummaryOperations = (_a = this.getGeneralOptions().cellSummaryOperations) !== null && _a !== void 0 ? _a : [];
|
|
17
|
+
if (this.isWeightedAvetageCellSummaryAvailable()) {
|
|
18
|
+
cellSummaryOperations = [
|
|
19
|
+
...cellSummaryOperations,
|
|
20
|
+
this.getWeightedAverageCellSummaryOperation(),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
return cellSummaryOperations;
|
|
15
24
|
}
|
|
16
25
|
showCellSummaryPopup() {
|
|
17
26
|
this.showModulePopup(ModuleConstants.CellSummaryModuleId);
|
|
@@ -52,5 +61,18 @@ class CellSummaryApiImpl extends ApiBase_1.ApiBase {
|
|
|
52
61
|
: cellSummaryOperation.operationName;
|
|
53
62
|
return this.getCellSummaryOperationValue(summaryOperation);
|
|
54
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Weighted average is availabe only if the current layout has at leat a Weighted Average aggregation defined.
|
|
66
|
+
*/
|
|
67
|
+
isWeightedAvetageCellSummaryAvailable() {
|
|
68
|
+
const currentLayout = this.getAdaptableApi().layoutApi.getCurrentLayout();
|
|
69
|
+
return Object.values(currentLayout.AggregationColumns).some((aggCol) => typeof aggCol === 'object' && aggCol.type === 'weightedAverage');
|
|
70
|
+
}
|
|
71
|
+
getWeightedAverageCellSummaryOperation() {
|
|
72
|
+
return {
|
|
73
|
+
operationName: 'Weighted Avg',
|
|
74
|
+
operationFunction: weightedAverage_1.cellSummaryWeightedAverage,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
55
77
|
}
|
|
56
78
|
exports.CellSummaryApiImpl = CellSummaryApiImpl;
|
|
@@ -11,7 +11,7 @@ import { SelectedRowInfo } from '../../PredefinedConfig/Selection/SelectedRowInf
|
|
|
11
11
|
import { AdaptableModule, AdaptableQLModule } from '../../PredefinedConfig/Common/Types';
|
|
12
12
|
import { GridCell } from '../../PredefinedConfig/Selection/GridCell';
|
|
13
13
|
import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
|
|
14
|
-
import { AdaptableCellChangedAlert, AdaptableOptions, AdaptableRowChangedAlert, AdaptableState, AlertFormContext, BaseContext, Layout, LayoutAssociatedObject, SystemStatusMessageInfo, SharedEntity, AdaptableIcon } from '../../types';
|
|
14
|
+
import { AdaptableCellChangedAlert, AdaptableOptions, AdaptableRowChangedAlert, AdaptableState, AlertFormContext, BaseContext, Layout, LayoutAssociatedObject, SystemStatusMessageInfo, SharedEntity, AdaptableIcon, AdaptableQuery } from '../../types';
|
|
15
15
|
import { IValidationService } from '../../Utilities/Services/Interface/IValidationService';
|
|
16
16
|
import { IModuleService } from '../../Utilities/Services/Interface/IModuleService';
|
|
17
17
|
import { IReportService } from '../../Utilities/Services/Interface/IReportService';
|
|
@@ -102,6 +102,7 @@ export declare class InternalApiImpl extends ApiBase implements InternalApi {
|
|
|
102
102
|
getModules(): IModuleCollection;
|
|
103
103
|
getModuleFriendlyName(adaptableModule: AdaptableModule): string;
|
|
104
104
|
runModuleInAdaptableQL(adaptableQLModule: AdaptableQLModule): boolean;
|
|
105
|
+
evaluateExpressionInAdaptableQL(module: AdaptableQLModule, expression?: string): boolean;
|
|
105
106
|
forAllRowNodesDo(func: (rowNode: RowNode) => void): void;
|
|
106
107
|
forAllVisibleRowNodesDo(func: (rowNode: RowNode) => void): void;
|
|
107
108
|
buildStandaloneColumnHeader(column: AdaptableColumn): AdaptableMenuItem[];
|
|
@@ -140,4 +141,5 @@ export declare class InternalApiImpl extends ApiBase implements InternalApi {
|
|
|
140
141
|
getLabelForTag(adaptableObjectTag: AdaptableObjectTag): string;
|
|
141
142
|
getValueForTag(adaptableObjectTag: AdaptableObjectTag): string | number;
|
|
142
143
|
getEditLookUpValuesForColumn(editLookUpItem: EditLookUpPermittedValues, column: AdaptableColumn, gridCell?: GridCell): any[] | undefined;
|
|
144
|
+
getAdaptableQueryExpressionText(query: Partial<AdaptableQuery>): string;
|
|
143
145
|
}
|
|
@@ -299,6 +299,30 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
|
|
|
299
299
|
const adaptableQLModules = this.getAdaptableQLOptions().externallyEvaluatedModules;
|
|
300
300
|
return !adaptableQLModules.includes(adaptableQLModule);
|
|
301
301
|
}
|
|
302
|
+
evaluateExpressionInAdaptableQL(module, expression) {
|
|
303
|
+
var _a;
|
|
304
|
+
// temporary, until `externallyEvaluatedModules` is removed completely
|
|
305
|
+
const externallyEvaluatedModules = this.getAdaptableQLOptions().externallyEvaluatedModules;
|
|
306
|
+
if (externallyEvaluatedModules === null || externallyEvaluatedModules === void 0 ? void 0 : externallyEvaluatedModules.length) {
|
|
307
|
+
// fallback to deprecated property
|
|
308
|
+
return this.runModuleInAdaptableQL(module);
|
|
309
|
+
}
|
|
310
|
+
const evaluateExpressionExternallyFn = (_a = this.getAdaptableQLOptions()) === null || _a === void 0 ? void 0 : _a.evaluateAdaptableQLExternally;
|
|
311
|
+
if (typeof evaluateExpressionExternallyFn !== 'function') {
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
const context = {
|
|
315
|
+
adaptableApi: this.getAdaptableApi(),
|
|
316
|
+
module,
|
|
317
|
+
};
|
|
318
|
+
if (expression) {
|
|
319
|
+
context.expression = expression;
|
|
320
|
+
context.referencedColumns = this.getAdaptableApi()
|
|
321
|
+
.queryLanguageApi.getColumnsFromExpression(expression)
|
|
322
|
+
.map((columnId) => this.getAdaptableApi().columnApi.getColumnFromId(columnId));
|
|
323
|
+
}
|
|
324
|
+
return evaluateExpressionExternallyFn(context);
|
|
325
|
+
}
|
|
302
326
|
forAllRowNodesDo(func) {
|
|
303
327
|
this.adaptable.forAllRowNodesDo(func);
|
|
304
328
|
}
|
|
@@ -616,5 +640,15 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
|
|
|
616
640
|
// this will use the columnApi method that first looks for permitted values and then distinct values
|
|
617
641
|
return this.adaptable.api.columnApi.getDistinctDisplayValuesForColumn(column.columnId);
|
|
618
642
|
}
|
|
643
|
+
getAdaptableQueryExpressionText(query) {
|
|
644
|
+
var _a;
|
|
645
|
+
if (!query) {
|
|
646
|
+
return '';
|
|
647
|
+
}
|
|
648
|
+
const displayColumnFriendlyNames = (_a = this.adaptable.adaptableOptions.adaptableQLOptions) === null || _a === void 0 ? void 0 : _a.displayColumnFriendlyNamesForExpressions;
|
|
649
|
+
return displayColumnFriendlyNames
|
|
650
|
+
? this.adaptable.api.queryLanguageApi.getAdaptableQueryExpressionWithColumnFriendlyNames(query)
|
|
651
|
+
: this.adaptable.api.queryLanguageApi.getAdaptableQueryExpression(query);
|
|
652
|
+
}
|
|
619
653
|
}
|
|
620
654
|
exports.InternalApiImpl = InternalApiImpl;
|
|
@@ -106,7 +106,7 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
|
|
|
106
106
|
currentLayout = this.getAdaptableState().Grid.CurrentLayout || currentLayout;
|
|
107
107
|
}
|
|
108
108
|
if (currentLayout) {
|
|
109
|
-
this.
|
|
109
|
+
this.createOrUpdateLayout(currentLayout);
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
doesLayoutExist(layout) {
|
|
@@ -244,7 +244,7 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
|
|
|
244
244
|
return acc;
|
|
245
245
|
}, {}),
|
|
246
246
|
}, gridState.Columns);
|
|
247
|
-
this.
|
|
247
|
+
this.createOrUpdateLayout(defaultLayout);
|
|
248
248
|
return defaultLayout;
|
|
249
249
|
}
|
|
250
250
|
}
|
|
@@ -13,4 +13,5 @@ export declare class QueryLanguageApiImpl extends ApiBase implements QueryLangua
|
|
|
13
13
|
getQueryableColumnIds(): string[] | undefined;
|
|
14
14
|
getModuleExpressionFunctionMap(): ExpressionFunctionMap;
|
|
15
15
|
getAdaptableQueryExpression(query: Partial<AdaptableQuery>): string | undefined;
|
|
16
|
+
getAdaptableQueryExpressionWithColumnFriendlyNames(query: Partial<AdaptableQuery>): string | undefined;
|
|
16
17
|
}
|
|
@@ -90,5 +90,10 @@ class QueryLanguageApiImpl extends ApiBase_1.ApiBase {
|
|
|
90
90
|
var _a, _b, _c, _d;
|
|
91
91
|
return ((_d = (_c = (_b = (_a = query.BooleanExpression) !== null && _a !== void 0 ? _a : query.ScalarExpression) !== null && _b !== void 0 ? _b : query.ObservableExpression) !== null && _c !== void 0 ? _c : query.AggregatedBooleanExpression) !== null && _d !== void 0 ? _d : query.AggregatedScalarExpression);
|
|
92
92
|
}
|
|
93
|
+
getAdaptableQueryExpressionWithColumnFriendlyNames(query) {
|
|
94
|
+
return this.adaptable.api.internalApi
|
|
95
|
+
.getQueryLanguageService()
|
|
96
|
+
.getExpressionWithColumnFriendlyNames(this.getAdaptableQueryExpression(query));
|
|
97
|
+
}
|
|
93
98
|
}
|
|
94
99
|
exports.QueryLanguageApiImpl = QueryLanguageApiImpl;
|