@adaptabletools/adaptable 11.0.0-canary.4 → 11.0.0-canary.5
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 +130 -67
- package/bundle.cjs.js +86 -86
- package/index.css +130 -67
- package/package.json +2 -2
- package/publishTimestamp.d.ts +1 -1
- package/publishTimestamp.js +1 -1
- package/src/AdaptableInterfaces/AdaptableNoCodeWizard.d.ts +7 -5
- package/src/AdaptableOptions/AdaptableFrameworkComponent.d.ts +1 -3
- package/src/AdaptableOptions/AdaptableOptions.d.ts +10 -1
- package/src/AdaptableOptions/AlertOptions.d.ts +82 -0
- package/src/AdaptableOptions/AlertOptions.js +2 -0
- package/src/AdaptableOptions/ContainerOptions.d.ts +1 -1
- package/src/AdaptableOptions/FilterOptions.d.ts +1 -1
- package/src/AdaptableOptions/NotificationsOptions.d.ts +1 -78
- package/src/AdaptableOptions/QueryLanguageOptions.d.ts +0 -4
- package/src/AdaptableOptions/StateOptions.d.ts +2 -1
- package/src/AdaptableOptions/TeamSharingOptions.d.ts +2 -2
- package/src/AdaptableOptions/ToolPanelOptions.d.ts +0 -2
- package/src/AdaptableOptions/UserInterfaceOptions.d.ts +2 -2
- package/src/Api/AdaptableApi.d.ts +1 -0
- package/src/Api/AlertApi.d.ts +2 -3
- package/src/Api/EventApi.d.ts +8 -3
- package/src/Api/Events/GridDataChanged.d.ts +4 -2
- package/src/Api/Events/SystemStatusMessageDisplayed.d.ts +1 -1
- package/src/Api/FreeTextColumnApi.d.ts +0 -12
- package/src/Api/IPushPullApi.d.ts +1 -1
- package/src/Api/Implementation/AlertApiImpl.d.ts +1 -2
- package/src/Api/Implementation/AlertApiImpl.js +15 -9
- package/src/Api/Implementation/ApiBase.d.ts +2 -0
- package/src/Api/Implementation/ApiBase.js +3 -0
- package/src/Api/Implementation/FreeTextColumnApiImpl.d.ts +0 -5
- package/src/Api/Implementation/FreeTextColumnApiImpl.js +0 -9
- package/src/Api/Implementation/InternalApiImpl.js +1 -1
- package/src/Api/Implementation/LayoutApiImpl.d.ts +2 -0
- package/src/Api/Implementation/LayoutApiImpl.js +11 -0
- package/src/Api/Implementation/QueryApiImpl.js +4 -1
- package/src/Api/Implementation/QueryLanguageApiImpl.js +4 -5
- package/src/Api/LayoutApi.d.ts +7 -0
- package/src/Api/OpenFinApi.d.ts +5 -0
- package/src/Api/PluginsApi.d.ts +29 -0
- package/src/Api/UserInterfaceApi.d.ts +5 -2
- package/src/PredefinedConfig/AlertState.d.ts +2 -4
- package/src/PredefinedConfig/CalculatedColumnState.d.ts +0 -1
- package/src/PredefinedConfig/Common/FDC3Context.d.ts +4 -12
- package/src/PredefinedConfig/CustomSortState.d.ts +0 -1
- package/src/PredefinedConfig/FlashingCellState.d.ts +3 -1
- package/src/PredefinedConfig/FreeTextColumnState.d.ts +1 -1
- package/src/PredefinedConfig/LayoutState.d.ts +0 -2
- package/src/PredefinedConfig/PredefinedConfig.d.ts +5 -2
- package/src/Redux/ActionsReducers/ApplicationRedux.js +9 -3
- package/src/Redux/ActionsReducers/FlashingCellRedux.js +4 -8
- package/src/Redux/ActionsReducers/GridRedux.js +3 -1
- package/src/Redux/ActionsReducers/PopupRedux.js +13 -3
- package/src/Redux/ActionsReducers/QuickSearchRedux.js +3 -1
- package/src/Redux/ActionsReducers/SystemRedux.js +3 -1
- package/src/Redux/ActionsReducers/ThemeRedux.js +3 -1
- package/src/Redux/Store/AdaptableStore.js +5 -4
- package/src/Strategy/AlertModule.js +4 -3
- package/src/Strategy/ConditionalStyleModule.js +4 -0
- package/src/Strategy/FlashingCellModule.js +2 -2
- package/src/Strategy/FreeTextColumnModule.d.ts +2 -2
- package/src/Strategy/FreeTextColumnModule.js +10 -0
- package/src/Strategy/LayoutModule.js +1 -6
- package/src/Strategy/ToolPanelModule.js +5 -3
- package/src/Strategy/Utilities/getFormatColumnSettingsViewItems.js +1 -1
- package/src/Strategy/Utilities/getRuleViewItems.d.ts +0 -1
- package/src/Strategy/Utilities/getRuleViewItems.js +0 -1
- package/src/Utilities/Defaults/DefaultAdaptableOptions.js +6 -4
- package/src/Utilities/ExpressionFunctions/dateUtils.d.ts +1 -0
- package/src/Utilities/ExpressionFunctions/dateUtils.js +13 -0
- package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +13 -4
- package/src/Utilities/Helpers/AdaptableHelper.js +1 -0
- package/src/Utilities/Helpers/CalendarHelper.js +220 -55
- package/src/Utilities/Interface/MessagePopups.d.ts +6 -2
- package/src/Utilities/ObjectFactory.js +1 -0
- package/src/Utilities/Services/DataService.js +6 -1
- package/src/Utilities/Services/QueryLanguageService.js +16 -11
- package/src/Utilities/Services/ReportService.js +6 -2
- package/src/Utilities/Services/TeamSharingService.js +5 -3
- package/src/View/AdaptablePopover/index.js +6 -1
- package/src/View/AdaptableView.js +1 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/ColumnsList.js +5 -1
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/ConfigurationForm.js +5 -2
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/index.js +4 -1
- package/src/View/AdaptableWizardView/helper.js +3 -1
- package/src/View/Alert/Wizard/AlertButtonsEditor.d.ts +1 -1
- package/src/View/Alert/Wizard/AlertButtonsEditor.js +5 -1
- package/src/View/CellSummary/CellSummaryViewPanel.js +1 -2
- package/src/View/Components/AdaptableObjectList/AdaptableObjectList.js +5 -2
- package/src/View/Components/FilterForm/FilterForm.js +0 -2
- package/src/View/Components/FilterForm/QuickFilterForm.js +4 -1
- package/src/View/Components/FilterForm/getDefaultColumnFilterPredicate.d.ts +1 -1
- package/src/View/Components/Panels/PanelWithImage.d.ts +1 -1
- package/src/View/Components/Popups/AdaptablePopup/AdaptablePopup.js +3 -1
- package/src/View/Components/Popups/AdaptablePopup/AdaptablePopupDialog.d.ts +1 -0
- package/src/View/Components/Popups/AdaptablePopup/AdaptablePopupDialog.js +25 -1
- package/src/View/Components/Popups/AdaptablePopup/TopBar.js +5 -4
- package/src/View/Components/Popups/AdaptablePopupConfirmation.js +3 -1
- package/src/View/Components/Popups/AdaptablePopupPrompt.d.ts +5 -12
- package/src/View/Components/Popups/AdaptablePopupPrompt.js +38 -37
- package/src/View/Components/Popups/AdaptablePopupTeamSharing.js +4 -1
- package/src/View/Components/ScopeComponent.js +4 -1
- package/src/View/Components/ToolPanel/CustomToolPanelContent.js +5 -1
- package/src/View/Components/ToolPanel/ToolPanelPopup.js +3 -1
- package/src/View/Components/ToolPanel/ToolPanelWrapper.js +1 -1
- package/src/View/ConditionalStyle/Wizard/ConditionalStyleSettingsWizardSettings.d.ts +8 -0
- package/src/View/ConditionalStyle/Wizard/ConditionalStyleSettingsWizardSettings.js +27 -0
- package/src/View/ConditionalStyle/Wizard/ConditionalStyleWizard.js +7 -0
- package/src/View/CustomSort/Wizard/CustomSortValuesWizardSection.js +3 -1
- package/src/View/Dashboard/CustomToolbarWrapper.js +5 -1
- package/src/View/Dashboard/Dashboard.js +1 -1
- package/src/View/Dashboard/DashboardPopup.js +3 -1
- package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +2 -1
- package/src/View/Export/Wizard/ReportColumnTypeWizard.js +3 -1
- package/src/View/Export/Wizard/ReportRowTypeWizard.js +3 -1
- package/src/View/Filter/FilterViewPanel.d.ts +1 -4
- package/src/View/Filter/FilterViewPanel.js +1 -3
- package/src/View/FreeTextColumn/FreeTextColumnSummary.js +1 -2
- package/src/View/GridInfo/AdaptableOptionsComponent.js +4 -1
- package/src/View/Layout/Wizard/LayoutEditor/index.js +5 -1
- package/src/View/Layout/Wizard/LayoutEditorWizard.js +7 -1
- package/src/View/Query/ExpandedQueryPopup.js +9 -2
- package/src/View/Query/QueryViewPanel.js +3 -1
- package/src/View/QuickSearch/QuickSearchPopup.js +3 -3
- package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsSummary.js +12 -2
- package/src/View/UIHelper.js +4 -1
- package/src/View/Wizard/AdaptableWizard.js +12 -3
- package/src/View/Wizard/OnePageAdaptableWizard.js +5 -1
- package/src/agGrid/Adaptable.d.ts +2 -3
- package/src/agGrid/Adaptable.js +96 -54
- package/src/agGrid/editors/AdaptableDateEditor/index.js +1 -1
- package/src/agGrid/editors/AdaptableNumberEditor/index.js +1 -1
- package/src/components/ApplicationIcon.d.ts +1 -0
- package/src/components/ApplicationIcon.js +2 -2
- package/src/components/Dashboard/Dashboard.js +4 -1
- package/src/components/Dropdown/index.js +8 -1
- package/src/components/ExpressionEditor/EditorInputReactive.js +3 -1
- package/src/components/ExpressionEditor/ExpressionFunctionDocumentation.js +4 -1
- package/src/components/ExpressionEditor/index.js +9 -2
- package/src/components/SizedContainer/index.js +7 -1
- package/src/components/WindowModal/WindowModal.js +4 -1
- package/src/metamodel/adaptable.metamodel.d.ts +55 -24
- package/src/metamodel/adaptable.metamodel.js +179 -98
- package/src/types.d.ts +2 -1
- package/themes/dark.css +4 -4
- package/version.d.ts +1 -1
- package/version.js +1 -1
|
@@ -38,7 +38,7 @@ export interface FilterOptions {
|
|
|
38
38
|
*/
|
|
39
39
|
useAdaptableFilterForm?: boolean | string[];
|
|
40
40
|
/**
|
|
41
|
-
* Styles Adaptable Filter Form to match AG Grid's
|
|
41
|
+
* Styles Adaptable Filter Form to match AG Grid's styling (if using Balham theme)
|
|
42
42
|
*
|
|
43
43
|
* @defaultValue true
|
|
44
44
|
* @gridInfoItem
|
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
import { AlertButton, AlertDefinition } from '../PredefinedConfig/AlertState';
|
|
2
|
-
import { AdaptableAlert } from '../PredefinedConfig/Common/AdaptableAlert';
|
|
3
|
-
import { ButtonContext } from '../PredefinedConfig/Common/AdaptableButton';
|
|
4
|
-
import { AdaptableForm, AdaptableFormData } from '../PredefinedConfig/Common/AdaptableForm';
|
|
5
|
-
import { DataChangedInfo } from '../types';
|
|
6
1
|
/**
|
|
7
|
-
* Options related to
|
|
2
|
+
* Options related to System Status Messages and Notifications in Adaptable.
|
|
8
3
|
*/
|
|
9
4
|
export interface NotificationsOptions {
|
|
10
|
-
/**
|
|
11
|
-
* How many alerts held in State at any one time; when limit is breached, oldest alert will be removed
|
|
12
|
-
*
|
|
13
|
-
* @defaultValue 20
|
|
14
|
-
* @gridInfoItem
|
|
15
|
-
*/
|
|
16
|
-
maxAlertsInStore?: number;
|
|
17
5
|
/**
|
|
18
6
|
* How many Notifications can be displayed at one time
|
|
19
7
|
*
|
|
@@ -35,13 +23,6 @@ export interface NotificationsOptions {
|
|
|
35
23
|
* @gridInfoItem
|
|
36
24
|
*/
|
|
37
25
|
duration?: number | 'always';
|
|
38
|
-
/**
|
|
39
|
-
* How long (in ms) a cell will be highlighted
|
|
40
|
-
*
|
|
41
|
-
* @defaultValue 3000
|
|
42
|
-
* @gridInfoItem
|
|
43
|
-
*/
|
|
44
|
-
cellHighlightDuration?: number;
|
|
45
26
|
/**
|
|
46
27
|
* Shows a Progress Bar in the Notification
|
|
47
28
|
*
|
|
@@ -77,21 +58,6 @@ export interface NotificationsOptions {
|
|
|
77
58
|
* @gridInfoItem
|
|
78
59
|
*/
|
|
79
60
|
transition?: 'Bounce' | 'Slide' | 'Zoom' | 'Flip';
|
|
80
|
-
/**
|
|
81
|
-
* onClick Handlers for Alert Buttons (defined in Alert State)
|
|
82
|
-
*/
|
|
83
|
-
actionHandlers?: ActionHandler[];
|
|
84
|
-
/**
|
|
85
|
-
* Full definitions of Alert Forms - the names of which are provided in Alert State
|
|
86
|
-
*/
|
|
87
|
-
alertForms?: AlertForm[];
|
|
88
|
-
/**
|
|
89
|
-
* Whether Alert rule is evaluated against the `rawValue` or `formattedValue` of the changed cell data
|
|
90
|
-
*
|
|
91
|
-
* @defaultValue 'rawValue'
|
|
92
|
-
* @gridInfoItem
|
|
93
|
-
*/
|
|
94
|
-
dataChangeDetectionPolicy?: 'rawValue' | 'formattedValue';
|
|
95
61
|
/**
|
|
96
62
|
* Display an Alert when a System Status Message is set
|
|
97
63
|
*
|
|
@@ -111,49 +77,6 @@ export interface NotificationsOptions {
|
|
|
111
77
|
* @defaultValue false
|
|
112
78
|
*/
|
|
113
79
|
showApplicationIcon?: boolean;
|
|
114
|
-
/**
|
|
115
|
-
* Function providing Message to display in Alert; if empty, AdapTable provides dynamically
|
|
116
|
-
*/
|
|
117
|
-
alertMessageText?: (alertDefinition: AlertDefinition, dataChangedInfo?: DataChangedInfo) => string | undefined;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Handles a Form Button Action
|
|
121
|
-
*/
|
|
122
|
-
export declare type ActionHandler = {
|
|
123
|
-
/**
|
|
124
|
-
* Name of the Handler
|
|
125
|
-
*/
|
|
126
|
-
name: string;
|
|
127
|
-
/**
|
|
128
|
-
* Handler function to call when the Button is clicked
|
|
129
|
-
*/
|
|
130
|
-
handler: (button: AlertButton<AlertButtonContext>, context: AlertButtonContext) => void;
|
|
131
|
-
};
|
|
132
|
-
/**
|
|
133
|
-
* Form to show in an Alert
|
|
134
|
-
*/
|
|
135
|
-
export declare type AlertForm = {
|
|
136
|
-
/**
|
|
137
|
-
* Name of the Form
|
|
138
|
-
*/
|
|
139
|
-
name: string;
|
|
140
|
-
/**
|
|
141
|
-
* The Form to display in the Alert
|
|
142
|
-
*/
|
|
143
|
-
form: AdaptableForm<AlertButtonContext>;
|
|
144
|
-
};
|
|
145
|
-
/**
|
|
146
|
-
* Context required by functions when using an Alert Button
|
|
147
|
-
*/
|
|
148
|
-
export interface AlertButtonContext extends ButtonContext {
|
|
149
|
-
/**
|
|
150
|
-
* Alert that has been triggered
|
|
151
|
-
*/
|
|
152
|
-
alert: AdaptableAlert;
|
|
153
|
-
/**
|
|
154
|
-
* Data in the Alert Form
|
|
155
|
-
*/
|
|
156
|
-
formData?: AdaptableFormData;
|
|
157
80
|
}
|
|
158
81
|
/**
|
|
159
82
|
* Different positions offered by Notifications
|
|
@@ -9,7 +9,6 @@ export interface QueryLanguageOptions {
|
|
|
9
9
|
*
|
|
10
10
|
* @defaultValue null (sets all)
|
|
11
11
|
* @gridInfoItem
|
|
12
|
-
* @see https://docs.adaptabletools.com/docs/adaptableql/query#boolean-functions
|
|
13
12
|
*/
|
|
14
13
|
defaultBooleanFunctions?: ExpressionFunctionMap;
|
|
15
14
|
/**
|
|
@@ -17,7 +16,6 @@ export interface QueryLanguageOptions {
|
|
|
17
16
|
*
|
|
18
17
|
* @defaultValue null (sets all)
|
|
19
18
|
* @gridInfoItem
|
|
20
|
-
* @see https://docs.adaptabletools.com/docs/adaptableql/query#scalar-functions
|
|
21
19
|
*/
|
|
22
20
|
defaultScalarFunctions?: ExpressionFunctionMap;
|
|
23
21
|
/**
|
|
@@ -25,7 +23,6 @@ export interface QueryLanguageOptions {
|
|
|
25
23
|
*
|
|
26
24
|
* @defaultValue null (sets all)
|
|
27
25
|
* @gridInfoItem
|
|
28
|
-
* @see https://docs.adaptabletools.com/docs/adaptableql/query#observable-functions
|
|
29
26
|
*/
|
|
30
27
|
defaultObservableFunctions?: ExpressionFunctionMap;
|
|
31
28
|
/**
|
|
@@ -33,7 +30,6 @@ export interface QueryLanguageOptions {
|
|
|
33
30
|
*
|
|
34
31
|
* @defaultValue null (sets all)
|
|
35
32
|
* @gridInfoItem
|
|
36
|
-
* @see https://docs.adaptabletools.com/docs/adaptableql/query#aggregation-functions
|
|
37
33
|
*/
|
|
38
34
|
defaultAggregationFunctions?: ExpressionFunctionMap;
|
|
39
35
|
/**
|
|
@@ -44,10 +44,11 @@ export declare type AdaptableStateFunctionConfig = {
|
|
|
44
44
|
* Used by the `persistState` function property in StateOptions
|
|
45
45
|
*
|
|
46
46
|
* @example
|
|
47
|
-
*
|
|
47
|
+
* ```
|
|
48
48
|
* persistState = (state, {adaptableId, adaptableStateKey}) => {
|
|
49
49
|
* localStorage.setItem(adaptableStateKey, JSON.stringify(state))
|
|
50
50
|
* }
|
|
51
|
+
* ```
|
|
51
52
|
*/
|
|
52
53
|
export interface AdaptablePersistStateFunction {
|
|
53
54
|
(state: any, { adaptableId, adaptableStateKey, userName, url }: AdaptableStateFunctionConfig): Promise<any>;
|
|
@@ -11,13 +11,13 @@ export interface TeamSharingOptions {
|
|
|
11
11
|
*/
|
|
12
12
|
enableTeamSharing: boolean;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* Async function which retrieves available Shared Entities that user can download and merge automatically with Adaptable State
|
|
15
15
|
*
|
|
16
16
|
* @defaultValue null
|
|
17
17
|
*/
|
|
18
18
|
getSharedEntities: (adaptableId: string) => Promise<SharedEntity[]>;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Async function which uploads Shared Entities so they can be downloaded by other members of the team
|
|
21
21
|
*
|
|
22
22
|
* @defaultValue null
|
|
23
23
|
*/
|
|
@@ -31,13 +31,11 @@ export interface ToolPanelOptions {
|
|
|
31
31
|
/**
|
|
32
32
|
* The initial width of AdapTable ToolPanel
|
|
33
33
|
* @defaultValue var(--ab-cmp-toolpanel__width)
|
|
34
|
-
* @see https://docs.adaptabletools.com/docs/theming/css-variables#toolpanel
|
|
35
34
|
*/
|
|
36
35
|
width?: number;
|
|
37
36
|
/**
|
|
38
37
|
* The min width of AdapTable ToolPanel
|
|
39
38
|
* @defaultValue var(--ab-cmp-toolpanel__width)
|
|
40
|
-
* @see https://docs.adaptabletools.com/docs/theming/css-variables#toolpanel
|
|
41
39
|
*/
|
|
42
40
|
minWidth?: number;
|
|
43
41
|
/**
|
|
@@ -120,7 +120,7 @@ export interface EditLookUpPermittedValues extends BasePermittedValues {
|
|
|
120
120
|
export interface FilterPermittedValues extends BasePermittedValues {
|
|
121
121
|
/**
|
|
122
122
|
* Prevents AdapTable from filtering the list of values client-side; When true, values is called each time the search bar is changed
|
|
123
|
-
* @
|
|
123
|
+
* @defaultValue false
|
|
124
124
|
*/
|
|
125
125
|
suppressFilterSearchBar?: boolean;
|
|
126
126
|
values: (params: FilterPermittedValuesParams) => any[] | Promise<any[]>;
|
|
@@ -139,7 +139,7 @@ export interface BulkUpdatePermittedValues extends BasePermittedValues {
|
|
|
139
139
|
}
|
|
140
140
|
/**
|
|
141
141
|
* Use PermittedValues instead
|
|
142
|
-
* @deprecated
|
|
142
|
+
* @deprecated use PermittedValues instead
|
|
143
143
|
*/
|
|
144
144
|
export declare type CellValuesList = PermittedValues;
|
|
145
145
|
/**
|
package/src/Api/AlertApi.d.ts
CHANGED
|
@@ -4,8 +4,7 @@ import { AdaptableScope } from '../PredefinedConfig/Common/AdaptableScope';
|
|
|
4
4
|
import { AdaptablePredicateDef } from '../PredefinedConfig/Common/AdaptablePredicate';
|
|
5
5
|
import { AdaptableAlert } from '../PredefinedConfig/Common/AdaptableAlert';
|
|
6
6
|
import { AdaptableForm, AdaptableFormData } from '../PredefinedConfig/Common/AdaptableForm';
|
|
7
|
-
import { AlertButtonContext } from '../
|
|
8
|
-
import { AdaptableMessageType, AlertProperties } from '../types';
|
|
7
|
+
import { AdaptableMessageType, AlertButtonContext, AlertProperties } from '../types';
|
|
9
8
|
/**
|
|
10
9
|
* Provides run-time access to Alert function and associated State
|
|
11
10
|
*/
|
|
@@ -158,7 +157,7 @@ export interface AlertApi {
|
|
|
158
157
|
suspendAlertDefinition(alertDefinition: AlertDefinition): AlertDefinition;
|
|
159
158
|
/**
|
|
160
159
|
* Activates a suspended Alert Definition
|
|
161
|
-
* @param alertDefinition Alert to Un-suspend (activate)
|
|
160
|
+
* @param alertDefinition - Alert to Un-suspend (activate)
|
|
162
161
|
* @returns alert definition
|
|
163
162
|
*/
|
|
164
163
|
unSuspendAlertDefinition(alertDefinition: AlertDefinition): AlertDefinition;
|
package/src/Api/EventApi.d.ts
CHANGED
|
@@ -195,9 +195,14 @@ export interface EventApi {
|
|
|
195
195
|
off(eventName: 'LiveDataChanged', callback: (liveDataChangedInfo: LiveDataChangedInfo) => void): void;
|
|
196
196
|
/**
|
|
197
197
|
* Fired when Adaptable is up and running - has no arguments.
|
|
198
|
-
* @param eventName
|
|
199
|
-
* @param callback An `AdaptableReadyInfo` object which contains the adaptableApi and GridOptions
|
|
200
|
-
* @returns the unsubscribe function
|
|
198
|
+
* @param eventName - AdaptableReady
|
|
199
|
+
* @param callback - An `AdaptableReadyInfo` object which contains the adaptableApi and GridOptions
|
|
200
|
+
* @returns the unsubscribe function
|
|
201
|
+
*
|
|
202
|
+
* @example Use as
|
|
203
|
+
* ```
|
|
204
|
+
* adaptableApi.eventApi.on('AdaptableReady', (adaptableReadyInfo: AdaptableReadyInfo) => { .....[do stuff]...})
|
|
205
|
+
* ```
|
|
201
206
|
*/
|
|
202
207
|
on(eventName: 'AdaptableReady', callback: (adaptableReadyInfo: AdaptableReadyInfo) => void): VoidFunction;
|
|
203
208
|
/**
|
|
@@ -5,13 +5,15 @@ import { BaseEventInfo } from './BaseEventInfo';
|
|
|
5
5
|
*/
|
|
6
6
|
export interface GridDataChangedInfo extends BaseEventInfo {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Data rows that have been added, updated, or deleted
|
|
9
9
|
*/
|
|
10
10
|
dataRows: any[];
|
|
11
11
|
/**
|
|
12
12
|
* Trigger for row change: 'Add', 'Edit' or 'Delete'
|
|
13
|
-
}
|
|
14
13
|
*/
|
|
15
14
|
rowTrigger: 'Add' | 'Edit' | 'Delete';
|
|
15
|
+
/**
|
|
16
|
+
* AG Grid Row Nodes that were affected by the Change
|
|
17
|
+
*/
|
|
16
18
|
rowNodes: RowNode[];
|
|
17
19
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SystemStatusMessageInfo } from '../../PredefinedConfig/Common/SystemStatusMessageInfo';
|
|
2
2
|
import { BaseEventInfo } from './BaseEventInfo';
|
|
3
3
|
/**
|
|
4
|
-
* Object returned by the `SystemStatusMessageDisplayed
|
|
4
|
+
* Object returned by the `SystemStatusMessageDisplayed` event
|
|
5
5
|
*/
|
|
6
6
|
export interface SystemStatusMessageDisplayedInfo extends BaseEventInfo {
|
|
7
7
|
/**
|
|
@@ -34,18 +34,6 @@ export interface FreeTextColumnApi {
|
|
|
34
34
|
editFreeTextColumn(freeTextColumn: Partial<FreeTextColumn> & {
|
|
35
35
|
ColumnId: string;
|
|
36
36
|
}): FreeTextColumn;
|
|
37
|
-
/**
|
|
38
|
-
* Creates new FreeTextColumn and adds it to Adaptable State
|
|
39
|
-
* @param columnId the id for the column - try to keep this small and unique (and dont use spaces)
|
|
40
|
-
* @param param.columnName the name for the column - optional - if not provided, will default to the columnId
|
|
41
|
-
* @param param.defaultValue the default value that will appear in the Column unless overrident - leave blank if you dont require a default value
|
|
42
|
-
* @returns free text column
|
|
43
|
-
*/
|
|
44
|
-
createFreeTextColumn(param: {
|
|
45
|
-
columnId: string;
|
|
46
|
-
columnName?: string;
|
|
47
|
-
defaultValue: string;
|
|
48
|
-
}): FreeTextColumn;
|
|
49
37
|
/**
|
|
50
38
|
* Deletes existing FreeTextColumn from Adaptable State
|
|
51
39
|
* @param columnId name of FreeTextColumn to delete
|
|
@@ -59,7 +59,7 @@ export interface IPushPullApi {
|
|
|
59
59
|
/**
|
|
60
60
|
* Retrieves all the ipushpull domain to which the current user has access
|
|
61
61
|
*
|
|
62
|
-
* An `IPushPullDomain
|
|
62
|
+
* An `IPushPullDomain` contains 3 properties:
|
|
63
63
|
*
|
|
64
64
|
* - **Name**: the name of the Domain / Folder
|
|
65
65
|
*
|
|
@@ -6,8 +6,7 @@ import { AdaptableScope } from '../../PredefinedConfig/Common/AdaptableScope';
|
|
|
6
6
|
import { AdaptablePredicateDef } from '../../PredefinedConfig/Common/AdaptablePredicate';
|
|
7
7
|
import { AdaptableAlert } from '../../PredefinedConfig/Common/AdaptableAlert';
|
|
8
8
|
import { AdaptableForm, AdaptableFormData } from '../../PredefinedConfig/Common/AdaptableForm';
|
|
9
|
-
import { AlertButtonContext } from '../../
|
|
10
|
-
import { AdaptableMessageType } from '../../types';
|
|
9
|
+
import { AdaptableMessageType, AlertButtonContext } from '../../types';
|
|
11
10
|
export declare class AlertApiImpl extends ApiBase implements AlertApi {
|
|
12
11
|
getAlertState(): AlertState;
|
|
13
12
|
getAdaptableFormByName(name: string): AdaptableForm<AlertButtonContext> | undefined;
|
|
@@ -16,7 +16,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
16
16
|
}
|
|
17
17
|
getAdaptableFormByName(name) {
|
|
18
18
|
var _a;
|
|
19
|
-
const alertForms = this.
|
|
19
|
+
const alertForms = this.getAlertOptions().alertForms || [];
|
|
20
20
|
return (_a = alertForms.find((f) => f.name === name)) === null || _a === void 0 ? void 0 : _a.form;
|
|
21
21
|
}
|
|
22
22
|
getAlertDefinitions() {
|
|
@@ -57,7 +57,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
57
57
|
}
|
|
58
58
|
actions.forEach((action) => {
|
|
59
59
|
var _a;
|
|
60
|
-
const buttonOnClick = (_a = this.
|
|
60
|
+
const buttonOnClick = (_a = this.getAlertOptions().actionHandlers) === null || _a === void 0 ? void 0 : _a.find((x) => x.name === action);
|
|
61
61
|
buttonOnClick === null || buttonOnClick === void 0 ? void 0 : buttonOnClick.handler(button, context);
|
|
62
62
|
this.adaptable.api.alertApi.executeAlertAction(action, {
|
|
63
63
|
alertDefinition: context.alert.alertDefinition,
|
|
@@ -92,7 +92,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
92
92
|
highlightStyle: {
|
|
93
93
|
BackColor: backgroundColor,
|
|
94
94
|
},
|
|
95
|
-
timeout: this.
|
|
95
|
+
timeout: this.getAlertOptions().cellHighlightDuration,
|
|
96
96
|
});
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
@@ -132,9 +132,12 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
132
132
|
// 3 things we always do with an alert are:
|
|
133
133
|
// 1. Dispatch the Alert (so it appears in the toolbar)
|
|
134
134
|
this.addUidToAdaptableObject(alertToShow);
|
|
135
|
-
this.dispatchAction(SystemRedux.SystemAlertAdd(alertToShow, this.
|
|
135
|
+
this.dispatchAction(SystemRedux.SystemAlertAdd(alertToShow, this.getAlertOptions().maxAlertsInStore));
|
|
136
136
|
// 2. Publish the Alert Fired Event
|
|
137
|
-
const alertFiredInfo = {
|
|
137
|
+
const alertFiredInfo = {
|
|
138
|
+
adaptableApi: this.adaptable.api,
|
|
139
|
+
alert: alertToShow,
|
|
140
|
+
};
|
|
138
141
|
const results = await this.adaptable.api.eventApi.emit('AlertFired', alertFiredInfo);
|
|
139
142
|
const showPopup = results.reduce((endResult, aResult) => {
|
|
140
143
|
return endResult && aResult !== false;
|
|
@@ -175,7 +178,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
175
178
|
this.adaptable.api.gridApi.refreshCells([alertNode], [dataChangedInfo.column.columnId]);
|
|
176
179
|
setTimeout(() => {
|
|
177
180
|
this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
|
|
178
|
-
}, this.adaptable.adaptableOptions.
|
|
181
|
+
}, this.adaptable.adaptableOptions.alertOptions.cellHighlightDuration);
|
|
179
182
|
}
|
|
180
183
|
}
|
|
181
184
|
if (alertProperties.HighlightRow && dataChangedInfo) {
|
|
@@ -187,7 +190,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
187
190
|
this.adaptable.api.gridApi.refreshRowNode(alertNode);
|
|
188
191
|
setTimeout(() => {
|
|
189
192
|
this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
|
|
190
|
-
}, this.adaptable.adaptableOptions.
|
|
193
|
+
}, this.adaptable.adaptableOptions.alertOptions.cellHighlightDuration);
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
196
|
if (alertProperties.LogToConsole) {
|
|
@@ -196,7 +199,10 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
196
199
|
}
|
|
197
200
|
}
|
|
198
201
|
publishAlertFiredEvent(alertToFire) {
|
|
199
|
-
const alertFiredInfo = {
|
|
202
|
+
const alertFiredInfo = {
|
|
203
|
+
adaptableApi: this.adaptable.api,
|
|
204
|
+
alert: alertToFire,
|
|
205
|
+
};
|
|
200
206
|
this.adaptable.api.eventApi.emit('AlertFired', alertFiredInfo);
|
|
201
207
|
}
|
|
202
208
|
displayMessageAlertPopup(alertToDisplayAsPopup) {
|
|
@@ -242,7 +248,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
|
|
|
242
248
|
}
|
|
243
249
|
getAlertDescription(alertDefinition, dataChangedInfo) {
|
|
244
250
|
var _a;
|
|
245
|
-
const alertMessageFunction = (_a = this.adaptable.adaptableOptions.
|
|
251
|
+
const alertMessageFunction = (_a = this.adaptable.adaptableOptions.alertOptions) === null || _a === void 0 ? void 0 : _a.alertMessageText;
|
|
246
252
|
if (alertMessageFunction) {
|
|
247
253
|
const returnText = alertMessageFunction(alertDefinition, dataChangedInfo);
|
|
248
254
|
if (returnText) {
|
|
@@ -12,6 +12,7 @@ import { NotificationsOptions } from '../../AdaptableOptions/NotificationsOption
|
|
|
12
12
|
import { ToolPanelOptions } from '../../AdaptableOptions/ToolPanelOptions';
|
|
13
13
|
import { ModuleParams } from '../../View/Components/SharedProps/ModuleViewPopupProps';
|
|
14
14
|
import { QueryLanguageOptions } from '../../AdaptableOptions/QueryLanguageOptions';
|
|
15
|
+
import { AlertOptions } from '../../AdaptableOptions/AlertOptions';
|
|
15
16
|
export declare abstract class ApiBase {
|
|
16
17
|
protected adaptable: IAdaptable;
|
|
17
18
|
/**
|
|
@@ -46,6 +47,7 @@ export declare abstract class ApiBase {
|
|
|
46
47
|
protected getOptions(): AdaptableOptions;
|
|
47
48
|
protected getContainerOptions(): ContainerOptions;
|
|
48
49
|
protected getNotificationsOptions(): NotificationsOptions;
|
|
50
|
+
protected getAlertOptions(): AlertOptions;
|
|
49
51
|
protected getDashboardOptions(): DashboardOptions;
|
|
50
52
|
protected getEditOptions(): EditOptions;
|
|
51
53
|
protected getExportOptions(): ExportOptions;
|
|
@@ -13,11 +13,6 @@ export declare class FreeTextColumnApiImpl extends ApiBase implements FreeTextCo
|
|
|
13
13
|
}): FreeTextColumn;
|
|
14
14
|
addEditFreeTextColumnStoredValue(freeTextColumn: FreeTextColumn, storedValue: FreeTextStoredValue): FreeTextColumn;
|
|
15
15
|
addStoredValuesToFreeTextColumn(columnId: string, storedValues: FreeTextStoredValue[], replaceAction: 'All' | 'Conflicting' | 'None'): void;
|
|
16
|
-
createFreeTextColumn({ columnName, columnId, defaultValue, }: {
|
|
17
|
-
columnId: string;
|
|
18
|
-
columnName?: string;
|
|
19
|
-
defaultValue: string;
|
|
20
|
-
}): FreeTextColumn;
|
|
21
16
|
deleteFreeTextColumn(columnId: string): void;
|
|
22
17
|
showFreeTextColumnPopup(): void;
|
|
23
18
|
getFreeTextColumnValueFromRowNode(freeTextColumn: FreeTextColumn, rowNode: RowNode): any;
|
|
@@ -4,7 +4,6 @@ exports.FreeTextColumnApiImpl = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const FreeTextColumnRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/FreeTextColumnRedux"));
|
|
6
6
|
const ApiBase_1 = require("./ApiBase");
|
|
7
|
-
const ObjectFactory_1 = require("../../Utilities/ObjectFactory");
|
|
8
7
|
const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
|
|
9
8
|
const ArrayExtensions_1 = tslib_1.__importDefault(require("../../Utilities/Extensions/ArrayExtensions"));
|
|
10
9
|
const LoggingHelper_1 = require("../../Utilities/Helpers/LoggingHelper");
|
|
@@ -67,14 +66,6 @@ class FreeTextColumnApiImpl extends ApiBase_1.ApiBase {
|
|
|
67
66
|
this.dispatchAction(FreeTextColumnRedux.FreeTextColumnEdit(freeTextColumn));
|
|
68
67
|
}
|
|
69
68
|
}
|
|
70
|
-
createFreeTextColumn({ columnName, columnId, defaultValue = null, }) {
|
|
71
|
-
let freeTextColumn = ObjectFactory_1.ObjectFactory.CreateEmptyFreeTextColumn(this.adaptable.api.internalApi.getAdaptableOptions().filterOptions
|
|
72
|
-
.enableFilterOnSpecialColumns);
|
|
73
|
-
freeTextColumn.ColumnId = columnId;
|
|
74
|
-
freeTextColumn.FriendlyName = columnName || columnId;
|
|
75
|
-
freeTextColumn.DefaultValue = defaultValue;
|
|
76
|
-
return this.addFreeTextColumn(freeTextColumn);
|
|
77
|
-
}
|
|
78
69
|
deleteFreeTextColumn(columnId) {
|
|
79
70
|
let freeTextColumn = this.getAllFreeTextColumn().find((ftc) => ftc.ColumnId == columnId);
|
|
80
71
|
if (this.checkItemExists(freeTextColumn, columnId, ModuleConstants.FreeTextColumnModuleId)) {
|
|
@@ -25,7 +25,7 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
|
|
|
25
25
|
let adaptableAlertForm;
|
|
26
26
|
let isActionForm = false;
|
|
27
27
|
if (typeof alertForm === 'string') {
|
|
28
|
-
const alertForms = this.
|
|
28
|
+
const alertForms = this.getAlertOptions().alertForms || [];
|
|
29
29
|
adaptableAlertForm = (_a = alertForms.find((f) => f.name === alertForm)) === null || _a === void 0 ? void 0 : _a.form;
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ApiBase } from './ApiBase';
|
|
2
2
|
import { LayoutApi } from '../LayoutApi';
|
|
3
3
|
import { LayoutState, Layout } from '../../PredefinedConfig/LayoutState';
|
|
4
|
+
import { AdaptableColumn } from '../../PredefinedConfig/Common/AdaptableColumn';
|
|
4
5
|
export declare class LayoutApiImpl extends ApiBase implements LayoutApi {
|
|
5
6
|
getLayoutState(): LayoutState;
|
|
6
7
|
shouldAutoSaveLayout: (layout?: Layout) => boolean;
|
|
@@ -27,6 +28,7 @@ export declare class LayoutApiImpl extends ApiBase implements LayoutApi {
|
|
|
27
28
|
getLayoutDescription(layout: Layout): string;
|
|
28
29
|
private getColumnSort;
|
|
29
30
|
createDefaultLayoutIfNeeded(): Layout | null;
|
|
31
|
+
showChangeColumnCaption(column: AdaptableColumn): void;
|
|
30
32
|
showLayoutPopup(): void;
|
|
31
33
|
isCurrentLayoutReadOnly(): boolean;
|
|
32
34
|
}
|
|
@@ -14,6 +14,8 @@ const isEqual_1 = tslib_1.__importDefault(require("lodash/isEqual"));
|
|
|
14
14
|
const GeneralConstants_1 = require("../../Utilities/Constants/GeneralConstants");
|
|
15
15
|
const Enums_1 = require("../../PredefinedConfig/Common/Enums");
|
|
16
16
|
const ArrayExtensions_1 = require("../../Utilities/Extensions/ArrayExtensions");
|
|
17
|
+
const PopupRedux_1 = require("../../Redux/ActionsReducers/PopupRedux");
|
|
18
|
+
const LayoutRedux_1 = require("../../Redux/ActionsReducers/LayoutRedux");
|
|
17
19
|
class LayoutApiImpl extends ApiBase_1.ApiBase {
|
|
18
20
|
constructor() {
|
|
19
21
|
super(...arguments);
|
|
@@ -229,6 +231,15 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
|
|
|
229
231
|
}
|
|
230
232
|
}
|
|
231
233
|
}
|
|
234
|
+
showChangeColumnCaption(column) {
|
|
235
|
+
this.dispatchAction(PopupRedux_1.PopupShowPrompt({
|
|
236
|
+
Header: `Change caption for '${column.friendlyName}'`,
|
|
237
|
+
Msg: '',
|
|
238
|
+
DefaultValue: column.friendlyName,
|
|
239
|
+
ConfirmActionCreator: (inputText) => inputText !== column.friendlyName &&
|
|
240
|
+
LayoutRedux_1.LayoutSetColumnCaption(this.getCurrentLayoutName(), column.columnId, inputText),
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
232
243
|
showLayoutPopup() {
|
|
233
244
|
this.showModulePopup(ModuleConstants.LayoutModuleId);
|
|
234
245
|
}
|
|
@@ -25,7 +25,10 @@ class QueryApiImpl extends ApiBase_1.ApiBase {
|
|
|
25
25
|
// check that there is no other existing named query with the same name
|
|
26
26
|
const duplicate = this.getAllNamedQuery().find((q) => q.Name === namedQuery.Name && q.Uuid !== namedQuery.Uuid);
|
|
27
27
|
if (duplicate) {
|
|
28
|
-
return {
|
|
28
|
+
return {
|
|
29
|
+
valid: false,
|
|
30
|
+
message: 'A Named Query already exists with that name',
|
|
31
|
+
};
|
|
29
32
|
}
|
|
30
33
|
return { valid: true, message: '' };
|
|
31
34
|
}
|
|
@@ -8,7 +8,7 @@ const ArrayExtensions_1 = tslib_1.__importDefault(require("../../Utilities/Exten
|
|
|
8
8
|
const LoggingHelper_1 = require("../../Utilities/Helpers/LoggingHelper");
|
|
9
9
|
class QueryLanguageApiImpl extends ApiBase_1.ApiBase {
|
|
10
10
|
isValidBooleanExpression(query, module, validationErrorMessage) {
|
|
11
|
-
const { isValid, errorMessage
|
|
11
|
+
const { isValid, errorMessage } = this.adaptable.api.internalApi
|
|
12
12
|
.getQueryLanguageService()
|
|
13
13
|
.validateBoolean(query, module, { force: true });
|
|
14
14
|
if (!isValid && validationErrorMessage) {
|
|
@@ -17,7 +17,7 @@ class QueryLanguageApiImpl extends ApiBase_1.ApiBase {
|
|
|
17
17
|
return isValid;
|
|
18
18
|
}
|
|
19
19
|
isValidObservableExpression(expression, module, validationErrorMessage) {
|
|
20
|
-
const { isValid, errorMessage
|
|
20
|
+
const { isValid, errorMessage } = this.adaptable.api.internalApi
|
|
21
21
|
.getQueryLanguageService()
|
|
22
22
|
.validateObservable(expression, module);
|
|
23
23
|
if (!isValid && validationErrorMessage) {
|
|
@@ -26,7 +26,7 @@ class QueryLanguageApiImpl extends ApiBase_1.ApiBase {
|
|
|
26
26
|
return isValid;
|
|
27
27
|
}
|
|
28
28
|
isValidAggregationExpression(expression, module, validationErrorMessage) {
|
|
29
|
-
const { isValid, errorMessage
|
|
29
|
+
const { isValid, errorMessage } = this.adaptable.api.internalApi
|
|
30
30
|
.getQueryLanguageService()
|
|
31
31
|
.validateAggregation(expression, module);
|
|
32
32
|
if (!isValid && validationErrorMessage) {
|
|
@@ -51,8 +51,7 @@ class QueryLanguageApiImpl extends ApiBase_1.ApiBase {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
getQueryableColumnIds() {
|
|
54
|
-
let queryableColumns = this.getQueryLanguageOptions()
|
|
55
|
-
.queryableColumns;
|
|
54
|
+
let queryableColumns = this.getQueryLanguageOptions().queryableColumns;
|
|
56
55
|
if (!queryableColumns) {
|
|
57
56
|
return undefined;
|
|
58
57
|
}
|
package/src/Api/LayoutApi.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AdaptableColumn } from '../../types';
|
|
1
2
|
import { LayoutState, Layout } from '../PredefinedConfig/LayoutState';
|
|
2
3
|
/**
|
|
3
4
|
* Provides run-time access to the Layout Module and associated state
|
|
@@ -128,4 +129,10 @@ export interface LayoutApi {
|
|
|
128
129
|
*/
|
|
129
130
|
setColumnCaption(columnId: string, caption: string): void;
|
|
130
131
|
isCurrentLayoutReadOnly(): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Opens change column caption popup
|
|
134
|
+
*
|
|
135
|
+
* @param column AdaptableColumn
|
|
136
|
+
*/
|
|
137
|
+
showChangeColumnCaption(column: AdaptableColumn): void;
|
|
131
138
|
}
|
package/src/Api/OpenFinApi.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { OpenFinState, OpenFinReport, OpenFinSchedule } from '../PredefinedConfi
|
|
|
2
2
|
import { AdaptableAlert } from '../PredefinedConfig/Common/AdaptableAlert';
|
|
3
3
|
import { OpenFinPluginOptions } from '../AdaptableOptions/OpenFinPluginOptions';
|
|
4
4
|
import { NotificationsOptions } from '../AdaptableOptions/NotificationsOptions';
|
|
5
|
+
import { AlertOptions } from '../AdaptableOptions/AlertOptions';
|
|
5
6
|
/**
|
|
6
7
|
* Provides run-time access to the OpenFin Plugin
|
|
7
8
|
*/
|
|
@@ -44,6 +45,10 @@ export interface OpenFinApi {
|
|
|
44
45
|
* Gets the Notification section from Adaptable Options
|
|
45
46
|
*/
|
|
46
47
|
getNotificationsOptions(): NotificationsOptions;
|
|
48
|
+
/**
|
|
49
|
+
* Gets the Alert section from Adaptable Options
|
|
50
|
+
*/
|
|
51
|
+
getAlertOptions(): AlertOptions;
|
|
47
52
|
/**
|
|
48
53
|
* Retrieves all Schedules that send data to Excel via OpenFin
|
|
49
54
|
*/
|