@adaptabletools/adaptable 20.0.0-canary.4 → 20.0.0-canary.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/AdaptableInterfaces/IAdaptable.d.ts +2 -1
- package/src/AdaptableOptions/DefaultAdaptableOptions.js +1 -0
- package/src/AdaptableOptions/EditOptions.d.ts +13 -2
- package/src/AdaptableOptions/UserInterfaceOptions.d.ts +7 -0
- package/src/Api/Fdc3Api.d.ts +5 -3
- package/src/Api/Implementation/Fdc3ApiImpl.d.ts +3 -3
- package/src/Api/Implementation/Fdc3ApiImpl.js +4 -4
- package/src/Api/Implementation/LayoutHelpers.js +8 -27
- package/src/Api/Implementation/ThemeApiImpl.js +3 -1
- package/src/Api/Internal/RowFormInternalApi.js +1 -1
- package/src/Api/ThemeApi.d.ts +2 -0
- package/src/PredefinedConfig/AlertState.d.ts +1 -1
- package/src/PredefinedConfig/Common/AdaptablePredicate.js +0 -16
- package/src/PredefinedConfig/FlashingCellState.d.ts +1 -1
- package/src/PredefinedConfig/LayoutState.d.ts +2 -2
- package/src/Utilities/Helpers/AdaptableHelper.d.ts +2 -0
- package/src/Utilities/Helpers/AdaptableHelper.js +10 -0
- package/src/Utilities/Services/Fdc3Service.d.ts +2 -2
- package/src/Utilities/Services/Fdc3Service.js +7 -2
- package/src/Utilities/Services/ThemeService.d.ts +1 -1
- package/src/Utilities/Services/ThemeService.js +5 -5
- package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/ConfigurationWizard.js +41 -0
- package/src/View/DataChangeHistory/DataChangeHistoryPopup.js +4 -1
- package/src/View/GridInfo/GridInfoPopup/GridInfoPopup.js +7 -2
- package/src/agGrid/AdaptableAgGrid.d.ts +2 -2
- package/src/agGrid/AdaptableAgGrid.js +15 -74
- package/src/agGrid/AgGridAdapter.d.ts +1 -1
- package/src/agGrid/AgGridAdapter.js +3 -7
- package/src/agGrid/AgGridColumnAdapter.js +0 -7
- package/src/agGrid/AgGridThemeAdapter.d.ts +19 -0
- package/src/agGrid/AgGridThemeAdapter.js +122 -0
- package/src/components/OverlayTrigger/useAgGridClassName.js +1 -1
- package/src/env.js +2 -2
- package/src/metamodel/adaptable.metamodel.d.ts +16 -0
- package/src/metamodel/adaptable.metamodel.js +1 -1
- package/src/migration/VersionUpgrade20.js +49 -5
- package/tsconfig.esm.tsbuildinfo +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptabletools/adaptable",
|
|
3
|
-
"version": "20.0.0-canary.
|
|
3
|
+
"version": "20.0.0-canary.6",
|
|
4
4
|
"description": "Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web-components",
|
|
@@ -31,6 +31,7 @@ import { AgGridMenuAdapter } from '../agGrid/AgGridMenuAdapter';
|
|
|
31
31
|
import { RowFormService } from '../Utilities/Services/RowFormService';
|
|
32
32
|
import { FlashingCellService } from '../Utilities/Services/FlashingCellService';
|
|
33
33
|
import { AgGridExportAdapter } from '../agGrid/AgGridExportAdapter';
|
|
34
|
+
import { AgGridThemeAdapter } from '../agGrid/AgGridThemeAdapter';
|
|
34
35
|
/**
|
|
35
36
|
* Contains AG Grid Options and Modules - used when instantiating AdapTable vanilla
|
|
36
37
|
*/
|
|
@@ -66,6 +67,7 @@ export interface IAdaptable {
|
|
|
66
67
|
agGridMenuAdapter: AgGridMenuAdapter;
|
|
67
68
|
agGridColumnAdapter: AgGridColumnAdapter;
|
|
68
69
|
agGridExportAdapter: AgGridExportAdapter;
|
|
70
|
+
agGridThemeAdapter: AgGridThemeAdapter;
|
|
69
71
|
hasAdaptableToolPanel: boolean;
|
|
70
72
|
renderReactRoot: RenderReactRootFn;
|
|
71
73
|
/**
|
|
@@ -244,7 +246,6 @@ export interface IAdaptable {
|
|
|
244
246
|
isGridRangeSelectable(): boolean;
|
|
245
247
|
isGridRowSelectable(): boolean;
|
|
246
248
|
isGridGroupingActive(): boolean;
|
|
247
|
-
getAgGridCurrentThemeName(): string;
|
|
248
249
|
applyAdaptableTheme(theme: AdaptableTheme | string): void;
|
|
249
250
|
setRowGroupColumns(columnIds: string[]): void;
|
|
250
251
|
getAllGridColumns(): Column<any>[];
|
|
@@ -39,17 +39,28 @@ export interface EditOptions<TData = any> {
|
|
|
39
39
|
*/
|
|
40
40
|
export interface CustomEditColumnValuesContext<TData = any> extends AdaptableColumnContext<TData> {
|
|
41
41
|
/**
|
|
42
|
-
* Current distinct values in
|
|
42
|
+
* Current distinct values in Column
|
|
43
43
|
*/
|
|
44
44
|
defaultValues: Required<CustomEditColumnValueInfo>[];
|
|
45
|
+
/**
|
|
46
|
+
* Search text in Edit - used when fetching values from server
|
|
47
|
+
*/
|
|
45
48
|
currentSearchValue: string;
|
|
46
49
|
/**
|
|
47
50
|
* Currently edited Grid Cell
|
|
48
51
|
*/
|
|
49
52
|
gridCell: GridCell;
|
|
50
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Information about items in the Edit Controls
|
|
56
|
+
*/
|
|
51
57
|
export interface CustomEditColumnValueInfo {
|
|
52
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Item's label
|
|
60
|
+
*/ label?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Value of Item being shown
|
|
63
|
+
*/
|
|
53
64
|
value: any;
|
|
54
65
|
}
|
|
55
66
|
/**
|
|
@@ -68,6 +68,13 @@ export interface UserInterfaceOptions<TData = any> {
|
|
|
68
68
|
* @gridInfoItem
|
|
69
69
|
*/
|
|
70
70
|
showAdapTableVersion?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Displays the AG Grid version in Grid Info section of Settings Panel
|
|
73
|
+
*
|
|
74
|
+
* @defaultValue true
|
|
75
|
+
* @gridInfoItem
|
|
76
|
+
*/
|
|
77
|
+
showAgGridVersion?: boolean;
|
|
71
78
|
/**
|
|
72
79
|
* English variant to use in AdapTable UI
|
|
73
80
|
*
|
package/src/Api/Fdc3Api.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IRowNode } from 'ag-grid-enterprise';
|
|
2
|
-
import { AppIdentifier, Context, ContextType, DesktopAgent, Intent, IntentResolution } from '@finos/fdc3';
|
|
2
|
+
import { AppIdentifier, Channel, Context, ContextType, DesktopAgent, Intent, IntentResolution } from '@finos/fdc3';
|
|
3
3
|
/**
|
|
4
4
|
* Provides run-time access to AdapTable's FDC3 functionality
|
|
5
5
|
*/
|
|
@@ -59,14 +59,16 @@ export interface Fdc3Api {
|
|
|
59
59
|
* Broadcasts the given Context from the given Row Node
|
|
60
60
|
* @param rowNode - The Row Node
|
|
61
61
|
* @param contextType - The FDC3 Context Type
|
|
62
|
+
* @param channel - (optional) Channel to broadcast to; if not provided, the Context will be broadcast to whatever User Channel the app is joined to
|
|
62
63
|
*/
|
|
63
|
-
broadcastFromRow(rowNode: IRowNode, contextType: ContextType): Promise<void>;
|
|
64
|
+
broadcastFromRow(rowNode: IRowNode, contextType: ContextType, channel?: Channel): Promise<void>;
|
|
64
65
|
/**
|
|
65
66
|
* Broadcasts the given Context from the given Row Node with the given Primary Key Value
|
|
66
67
|
* @param primaryKeyValue - The Primary Key Value
|
|
67
68
|
* @param contextType - The FDC3 Context Type
|
|
69
|
+
* @param channel - (optional) Channel to broadcast to; if not provided, the Context will be broadcast to whatever User Channel the app is joined to
|
|
68
70
|
*/
|
|
69
|
-
broadcastFromPrimaryKey(primaryKeyValue: string | number, contextType: ContextType): Promise<void> | undefined;
|
|
71
|
+
broadcastFromPrimaryKey(primaryKeyValue: string | number, contextType: ContextType, channel?: Channel): Promise<void> | undefined;
|
|
70
72
|
/**
|
|
71
73
|
* Checks if the given Context Type is a FDC3 standard Context Type
|
|
72
74
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IRowNode } from 'ag-grid-enterprise';
|
|
2
|
-
import { Context, ContextType, DesktopAgent, Intent, IntentResolution, StandardContextType, StandardIntent } from '@finos/fdc3';
|
|
2
|
+
import { Channel, Context, ContextType, DesktopAgent, Intent, IntentResolution, StandardContextType, StandardIntent } from '@finos/fdc3';
|
|
3
3
|
import { ApiBase } from './ApiBase';
|
|
4
4
|
import { Fdc3Api } from '../Fdc3Api';
|
|
5
5
|
import { Fdc3InternalApi } from '../Internal/Fdc3InternalApi';
|
|
@@ -15,8 +15,8 @@ export declare class Fdc3ApiImpl extends ApiBase implements Fdc3Api {
|
|
|
15
15
|
raiseIntentFromRow(rowNode: IRowNode, intent: Intent, contextType: ContextType, appIdentifier?: AppIdentifier): Promise<IntentResolution>;
|
|
16
16
|
raiseIntentForContextFromRow(rowNode: IRowNode, contextType: ContextType, appIdentifier?: AppIdentifier): Promise<IntentResolution>;
|
|
17
17
|
raiseIntentForContextFromPrimaryKey(primaryKeyValue: string | number, contextType: ContextType, appIdentifier?: AppIdentifier): Promise<IntentResolution> | undefined;
|
|
18
|
-
broadcastFromRow(rowNode: IRowNode, contextType: ContextType): Promise<void>;
|
|
19
|
-
broadcastFromPrimaryKey(primaryKeyValue: string | number, contextType: ContextType): Promise<void> | undefined;
|
|
18
|
+
broadcastFromRow(rowNode: IRowNode, contextType: ContextType, channel?: Channel): Promise<void>;
|
|
19
|
+
broadcastFromPrimaryKey(primaryKeyValue: string | number, contextType: ContextType, channel?: Channel): Promise<void> | undefined;
|
|
20
20
|
getContextLabel(contextType: ContextType): string;
|
|
21
21
|
isStandardContextType(contextType: string): contextType is StandardContextType;
|
|
22
22
|
isStandardIntentType(intentType: string): intentType is StandardIntent;
|
|
@@ -44,17 +44,17 @@ export class Fdc3ApiImpl extends ApiBase {
|
|
|
44
44
|
}
|
|
45
45
|
return this.raiseIntentForContextFromRow(rowNode, contextType, appIdentifier);
|
|
46
46
|
}
|
|
47
|
-
broadcastFromRow(rowNode, contextType) {
|
|
47
|
+
broadcastFromRow(rowNode, contextType, channel) {
|
|
48
48
|
const contextData = this.buildContextDataFromRow(contextType, rowNode);
|
|
49
|
-
return this.getFdc3Service().broadcast(contextData);
|
|
49
|
+
return this.getFdc3Service().broadcast(contextData, channel);
|
|
50
50
|
}
|
|
51
|
-
broadcastFromPrimaryKey(primaryKeyValue, contextType) {
|
|
51
|
+
broadcastFromPrimaryKey(primaryKeyValue, contextType, channel) {
|
|
52
52
|
const rowNode = this.getGridApi().getRowNodeForPrimaryKey(primaryKeyValue);
|
|
53
53
|
if (!rowNode) {
|
|
54
54
|
this.logWarn(`No row found for primary key value '${primaryKeyValue}'`);
|
|
55
55
|
return undefined;
|
|
56
56
|
}
|
|
57
|
-
return this.broadcastFromRow(rowNode, contextType);
|
|
57
|
+
return this.broadcastFromRow(rowNode, contextType, channel);
|
|
58
58
|
}
|
|
59
59
|
getContextLabel(contextType) {
|
|
60
60
|
return this.isStandardContextType(contextType)
|
|
@@ -3,6 +3,7 @@ import { isPivotLayoutModel } from '../../layout-manager/src/isPivotLayoutModel'
|
|
|
3
3
|
import { normalizeTableLayoutModel, normalizePivotLayoutModel, } from '../../layout-manager/src/normalizeLayoutModel';
|
|
4
4
|
import { simplifyTableLayoutModel, simplifyPivotLayoutModel, } from '../../layout-manager/src/simplifyLayoutModel';
|
|
5
5
|
import { isWeightedAverageAggregation, WEIGHTED_AVERAGE_AGG_FN_NAME, isWeightedAverageAggFuncName, } from '../../PredefinedConfig/Common/AggregationColumns';
|
|
6
|
+
import { removeAdaptableObjectPrimitivesInline } from '../../Utilities/Helpers/AdaptableHelper';
|
|
6
7
|
export const layoutStateToLayoutModel = (layout) => {
|
|
7
8
|
if (isPivotLayout(layout)) {
|
|
8
9
|
return pivotLayoutToPivotLayoutModel(layout);
|
|
@@ -18,44 +19,23 @@ export const layoutModelToLayoutState = (layoutModel, defaults) => {
|
|
|
18
19
|
function cleanupAdaptableObjectPrimitives(layout) {
|
|
19
20
|
if (layout.TableAggregationColumns) {
|
|
20
21
|
layout.TableAggregationColumns.forEach((AggValue) => {
|
|
21
|
-
|
|
22
|
-
delete AggValue.Source;
|
|
23
|
-
// @ts-ignore
|
|
24
|
-
delete AggValue.Uuid;
|
|
25
|
-
// @ts-ignore
|
|
26
|
-
delete AggValue.AdaptableVersion;
|
|
22
|
+
removeAdaptableObjectPrimitivesInline(AggValue);
|
|
27
23
|
if (typeof AggValue.AggFunc === 'object' && AggValue.AggFunc) {
|
|
28
|
-
|
|
29
|
-
delete AggValue.AggFunc.Source;
|
|
30
|
-
// @ts-ignore
|
|
31
|
-
delete AggValue.AggFunc.Uuid;
|
|
32
|
-
// @ts-ignore
|
|
33
|
-
delete AggValue.AggFunc.AdaptableVersion;
|
|
24
|
+
removeAdaptableObjectPrimitivesInline(AggValue.AggFunc);
|
|
34
25
|
}
|
|
35
26
|
});
|
|
36
27
|
}
|
|
37
28
|
if (layout.ColumnHeaders) {
|
|
38
|
-
|
|
39
|
-
delete layout.ColumnHeaders.Uuid;
|
|
40
|
-
delete layout.ColumnHeaders.AdaptableVersion;
|
|
29
|
+
removeAdaptableObjectPrimitivesInline(layout.ColumnHeaders);
|
|
41
30
|
}
|
|
42
31
|
if (layout.ColumnVisibility) {
|
|
43
|
-
|
|
44
|
-
delete layout.ColumnVisibility.Uuid;
|
|
45
|
-
delete layout.ColumnVisibility.AdaptableVersion;
|
|
32
|
+
removeAdaptableObjectPrimitivesInline(layout.ColumnVisibility);
|
|
46
33
|
}
|
|
47
34
|
if (layout.ColumnWidths) {
|
|
48
|
-
|
|
49
|
-
delete layout.ColumnWidths.Uuid;
|
|
50
|
-
delete layout.ColumnWidths.AdaptableVersion;
|
|
35
|
+
removeAdaptableObjectPrimitivesInline(layout.ColumnWidths);
|
|
51
36
|
}
|
|
52
37
|
if (layout.RowGroupValues) {
|
|
53
|
-
|
|
54
|
-
delete layout.RowGroupValues.Source;
|
|
55
|
-
// @ts-ignore
|
|
56
|
-
delete layout.RowGroupValues.Uuid;
|
|
57
|
-
// @ts-ignore
|
|
58
|
-
delete layout.RowGroupValues.AdaptableVersion;
|
|
38
|
+
removeAdaptableObjectPrimitivesInline(layout.RowGroupValues);
|
|
59
39
|
}
|
|
60
40
|
}
|
|
61
41
|
/**
|
|
@@ -258,6 +238,7 @@ export const tableLayoutModelToTableLayout = (layoutModel, defaults) => {
|
|
|
258
238
|
else {
|
|
259
239
|
delete tableLayout.TableAggregationColumns;
|
|
260
240
|
}
|
|
241
|
+
cleanupAdaptableObjectPrimitives(tableLayout);
|
|
261
242
|
return tableLayout;
|
|
262
243
|
};
|
|
263
244
|
function toAggregationColumnValue(columnAggregationModel) {
|
|
@@ -4,6 +4,7 @@ import { ApiBase } from './ApiBase';
|
|
|
4
4
|
import { StaticThemes } from '../../themes';
|
|
5
5
|
import { ThemeInternalApi } from '../Internal/ThemeInternalApi';
|
|
6
6
|
import AdaptableHelper from '../../Utilities/Helpers/AdaptableHelper';
|
|
7
|
+
import { logDeprecation } from '../../Utilities/logDeprecation';
|
|
7
8
|
export class ThemeApiImpl extends ApiBase {
|
|
8
9
|
constructor(_adaptable) {
|
|
9
10
|
super(_adaptable);
|
|
@@ -70,7 +71,8 @@ export class ThemeApiImpl extends ApiBase {
|
|
|
70
71
|
this.showModulePopup(ModuleConstants.ThemeModuleId);
|
|
71
72
|
}
|
|
72
73
|
getAgGridCurrentThemeName() {
|
|
73
|
-
|
|
74
|
+
logDeprecation(this._adaptable.logger, 'ThemeApi', 'getAgGridCurrentThemeName', null, `This is required only for AG Grid's legacy themes. See https://www.ag-grid.com/javascript-data-grid/theming-v32/`);
|
|
75
|
+
return this._adaptable.agGridThemeAdapter.getAgGridCurrentThemeClassNames();
|
|
74
76
|
}
|
|
75
77
|
editTheme(theme) {
|
|
76
78
|
this.dispatchAction(ThemeRedux.ThemeEdit(theme));
|
|
@@ -187,7 +187,7 @@ export class RowFormInternalApi extends ApiBase {
|
|
|
187
187
|
}
|
|
188
188
|
const returnValues = this.getGridApi().internalApi.getDistinctDisplayValuesForColumnOld(column.columnId);
|
|
189
189
|
// FIXME add support for asynchronous custom select cell editor values
|
|
190
|
-
// it involves refactoring the AdaptableForm &
|
|
190
|
+
// it involves refactoring the AdaptableForm & adaptableFormComponent
|
|
191
191
|
// await this.getSelectCellEditorValuesForColumn(
|
|
192
192
|
// column,
|
|
193
193
|
// gridCell
|
package/src/Api/ThemeApi.d.ts
CHANGED
|
@@ -81,6 +81,8 @@ export interface ThemeApi {
|
|
|
81
81
|
openThemeSettingsPanel(): void;
|
|
82
82
|
/**
|
|
83
83
|
* Get the name of the current AG Grid theme
|
|
84
|
+
*
|
|
85
|
+
* @deprecated required only for legacy AG Grid themes, see https://www.ag-grid.com/javascript-data-grid/theming-v32/
|
|
84
86
|
*/
|
|
85
87
|
getAgGridCurrentThemeName(): string;
|
|
86
88
|
}
|
|
@@ -150,4 +150,4 @@ export type SystemAlertPredicateIds = SystemAlertPredicateId[];
|
|
|
150
150
|
/**
|
|
151
151
|
* List of System Predicates available for Alerts
|
|
152
152
|
*/
|
|
153
|
-
export type SystemAlertPredicateId = 'Blanks' | 'NonBlanks' | 'Equals' | 'NotEquals' | 'GreaterThan' | 'LessThan' | 'Positive' | 'Negative' | 'Zero' | 'Between' | 'NotBetween' | 'Is' | 'IsNot' | 'Contains' | 'NotContains' | 'StartsWith' | 'EndsWith' | 'Regex' | 'Today' | 'Yesterday' | 'Tomorrow' | 'ThisWeek' | 'ThisMonth' | 'ThisQuarter' | 'ThisYear' | 'InPast' | 'InFuture' | 'Before' | 'After' | 'On' | 'NotOn' | 'NextWorkDay' | 'LastWorkDay' | 'WorkDay' | 'Holiday' | 'True' | 'False' | 'PercentChange' | '
|
|
153
|
+
export type SystemAlertPredicateId = 'Blanks' | 'NonBlanks' | 'Equals' | 'NotEquals' | 'GreaterThan' | 'LessThan' | 'Positive' | 'Negative' | 'Zero' | 'Between' | 'NotBetween' | 'Is' | 'IsNot' | 'Contains' | 'NotContains' | 'StartsWith' | 'EndsWith' | 'Regex' | 'Today' | 'Yesterday' | 'Tomorrow' | 'ThisWeek' | 'ThisMonth' | 'ThisQuarter' | 'ThisYear' | 'InPast' | 'InFuture' | 'Before' | 'After' | 'On' | 'NotOn' | 'NextWorkDay' | 'LastWorkDay' | 'WorkDay' | 'Holiday' | 'True' | 'False' | 'PercentChange' | 'In' | 'NotIn' | 'AnyChange';
|
|
@@ -266,22 +266,6 @@ export const SystemPredicateDefs = [
|
|
|
266
266
|
toString: ({ inputs }) => `Not Between ${inputs[0] ?? ''}:${inputs[1]}`,
|
|
267
267
|
shortcuts: ['!:'],
|
|
268
268
|
},
|
|
269
|
-
{
|
|
270
|
-
id: 'IsNumeric',
|
|
271
|
-
label: 'Is Numeric',
|
|
272
|
-
icon: { text: '1' },
|
|
273
|
-
columnScope: { DataTypes: ['number'] },
|
|
274
|
-
moduleScope: ['alert', 'flashingcell'],
|
|
275
|
-
handler: ({ value }) => !isNaN(Number(value)),
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
id: 'IsNotNumeric',
|
|
279
|
-
label: 'Is Not Numeric',
|
|
280
|
-
icon: { text: '1' },
|
|
281
|
-
columnScope: { DataTypes: ['number'] },
|
|
282
|
-
moduleScope: ['alert', 'flashingcell'],
|
|
283
|
-
handler: ({ value }) => isNaN(Number(value)),
|
|
284
|
-
},
|
|
285
269
|
// String System Filters
|
|
286
270
|
{
|
|
287
271
|
id: 'Is',
|
|
@@ -72,4 +72,4 @@ export type SystemFlashingCellPredicateIds = SystemFlashingCellPredicateId[];
|
|
|
72
72
|
/**
|
|
73
73
|
* List of System Predicates available for Flashing Cells
|
|
74
74
|
*/
|
|
75
|
-
export type SystemFlashingCellPredicateId = 'Blanks' | 'NonBlanks' | 'Equals' | 'NotEquals' | 'GreaterThan' | 'LessThan' | 'Positive' | 'Negative' | 'Zero' | 'Between' | 'NotBetween' | 'Is' | 'IsNot' | 'Contains' | 'NotContains' | 'StartsWith' | 'EndsWith' | 'Regex' | 'Today' | 'Yesterday' | 'Tomorrow' | 'ThisWeek' | 'ThisMonth' | 'ThisQuarter' | 'ThisYear' | 'InPast' | 'InFuture' | 'Before' | 'After' | 'On' | 'NotOn' | 'NextWorkDay' | 'LastWorkDay' | 'WorkDay' | 'Holiday' | 'True' | 'False' | 'PercentChange' | '
|
|
75
|
+
export type SystemFlashingCellPredicateId = 'Blanks' | 'NonBlanks' | 'Equals' | 'NotEquals' | 'GreaterThan' | 'LessThan' | 'Positive' | 'Negative' | 'Zero' | 'Between' | 'NotBetween' | 'Is' | 'IsNot' | 'Contains' | 'NotContains' | 'StartsWith' | 'EndsWith' | 'Regex' | 'Today' | 'Yesterday' | 'Tomorrow' | 'ThisWeek' | 'ThisMonth' | 'ThisQuarter' | 'ThisYear' | 'InPast' | 'InFuture' | 'Before' | 'After' | 'On' | 'NotOn' | 'NextWorkDay' | 'LastWorkDay' | 'WorkDay' | 'Holiday' | 'True' | 'False' | 'PercentChange' | 'In' | 'NotIn' | 'AnyChange';
|
|
@@ -51,7 +51,7 @@ export interface LayoutBase extends AdaptableObject {
|
|
|
51
51
|
*/
|
|
52
52
|
ColumnHeaders?: ColumnStringMap;
|
|
53
53
|
/**
|
|
54
|
-
* Whether to include aggFunc name in
|
|
54
|
+
* Whether to include aggFunc name in Column header: e.g. 'sum(Price)' becomes 'Price'
|
|
55
55
|
*/
|
|
56
56
|
SuppressAggFuncInHeader?: boolean;
|
|
57
57
|
/**
|
|
@@ -88,7 +88,7 @@ export interface TableLayout extends LayoutBase {
|
|
|
88
88
|
*/
|
|
89
89
|
RowSummaries?: RowSummary[];
|
|
90
90
|
/**
|
|
91
|
-
* Columns showing aggregated values in
|
|
91
|
+
* Columns showing aggregated values in Grouped Rows; a record of ColumnId and aggfunc (e.g. sum) or 'true' (to use default aggfunc)
|
|
92
92
|
*/
|
|
93
93
|
TableAggregationColumns?: TableAggregationColumns;
|
|
94
94
|
/**
|
|
@@ -4,6 +4,7 @@ import { AccessLevel } from '../../PredefinedConfig/Common/Entitlement';
|
|
|
4
4
|
export declare function initPredefinedConfigWithUuids(predefinedConfig: PredefinedConfig): PredefinedConfig;
|
|
5
5
|
export declare function getAccessLevelForObject(adaptableObject: AdaptableObject, moduleAccessLevel: AccessLevel): AccessLevel;
|
|
6
6
|
export declare function addAdaptableObjectPrimitives<T extends AdaptableObject>(adaptableObject: T): T;
|
|
7
|
+
export declare function removeAdaptableObjectPrimitivesInline(target: any): any;
|
|
7
8
|
export declare function removeAdaptableObjectPrimitives<T extends AdaptableObject>(adaptableObject: T): T;
|
|
8
9
|
export declare function isAdaptableObject(object: unknown): object is AdaptableObject;
|
|
9
10
|
export declare const AdaptableHelper: {
|
|
@@ -11,6 +12,7 @@ export declare const AdaptableHelper: {
|
|
|
11
12
|
getAccessLevelForObject: typeof getAccessLevelForObject;
|
|
12
13
|
addAdaptableObjectPrimitives: typeof addAdaptableObjectPrimitives;
|
|
13
14
|
removeAdaptableObjectPrimitives: typeof removeAdaptableObjectPrimitives;
|
|
15
|
+
removeAdaptableObjectPrimitivesInline: typeof removeAdaptableObjectPrimitivesInline;
|
|
14
16
|
isAdaptableObject: typeof isAdaptableObject;
|
|
15
17
|
};
|
|
16
18
|
export default AdaptableHelper;
|
|
@@ -43,6 +43,15 @@ export function addAdaptableObjectPrimitives(adaptableObject) {
|
|
|
43
43
|
adaptableObject.AdaptableVersion = GET_CURRENT_VERSION();
|
|
44
44
|
return adaptableObject;
|
|
45
45
|
}
|
|
46
|
+
export function removeAdaptableObjectPrimitivesInline(target) {
|
|
47
|
+
if (!target || typeof target !== 'object') {
|
|
48
|
+
return target;
|
|
49
|
+
}
|
|
50
|
+
delete target.Source;
|
|
51
|
+
delete target.Uuid;
|
|
52
|
+
delete target.AdaptableVersion;
|
|
53
|
+
return target;
|
|
54
|
+
}
|
|
46
55
|
export function removeAdaptableObjectPrimitives(adaptableObject) {
|
|
47
56
|
const clonedObject = structuredClone(adaptableObject);
|
|
48
57
|
const sanitiseObject = (object) => {
|
|
@@ -70,6 +79,7 @@ export const AdaptableHelper = {
|
|
|
70
79
|
getAccessLevelForObject,
|
|
71
80
|
addAdaptableObjectPrimitives,
|
|
72
81
|
removeAdaptableObjectPrimitives,
|
|
82
|
+
removeAdaptableObjectPrimitivesInline,
|
|
73
83
|
isAdaptableObject,
|
|
74
84
|
};
|
|
75
85
|
export default AdaptableHelper;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IAdaptableService } from './Interface/IAdaptableService';
|
|
2
2
|
import { AdaptableApi } from '../../Api/AdaptableApi';
|
|
3
3
|
import { Fdc3Options } from '../../AdaptableOptions/Fdc3Options';
|
|
4
|
-
import { AppIdentifier, DesktopAgent, IntentResolution } from '@finos/fdc3';
|
|
4
|
+
import { AppIdentifier, Channel, DesktopAgent, IntentResolution } from '@finos/fdc3';
|
|
5
5
|
import { Context } from '@finos/fdc3/dist/context/ContextTypes';
|
|
6
6
|
export declare class Fdc3Service implements IAdaptableService {
|
|
7
7
|
private adaptableApi;
|
|
@@ -15,7 +15,7 @@ export declare class Fdc3Service implements IAdaptableService {
|
|
|
15
15
|
destroy(): void;
|
|
16
16
|
raiseIntent(intent: string, context: Context, app?: AppIdentifier): Promise<IntentResolution>;
|
|
17
17
|
raiseIntentForContext(context: Context, app?: AppIdentifier): Promise<IntentResolution>;
|
|
18
|
-
broadcast(context: Context): Promise<void>;
|
|
18
|
+
broadcast(context: Context, channel?: Channel): Promise<void>;
|
|
19
19
|
private logFdc3Event;
|
|
20
20
|
private logFdc3Error;
|
|
21
21
|
private getFdc3Api;
|
|
@@ -131,7 +131,7 @@ export class Fdc3Service {
|
|
|
131
131
|
this.logFdc3Error(error);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
broadcast(context) {
|
|
134
|
+
broadcast(context, channel) {
|
|
135
135
|
if (!this.getDesktopAgent()) {
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
@@ -144,7 +144,12 @@ export class Fdc3Service {
|
|
|
144
144
|
context,
|
|
145
145
|
};
|
|
146
146
|
this.adaptableApi.eventApi.emit('Fdc3Message', payload);
|
|
147
|
-
|
|
147
|
+
if (channel) {
|
|
148
|
+
return channel.broadcast(context);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
return this.getDesktopAgent().broadcast(context);
|
|
152
|
+
}
|
|
148
153
|
}
|
|
149
154
|
catch (error) {
|
|
150
155
|
this.logFdc3Error(error);
|
|
@@ -5,10 +5,10 @@ export declare class ThemeService implements IThemeService {
|
|
|
5
5
|
private unsubscribe;
|
|
6
6
|
private styleSheetObject;
|
|
7
7
|
constructor(api: AdaptableApi);
|
|
8
|
+
destroy(): void;
|
|
8
9
|
subscribe(): void;
|
|
9
10
|
onThemeChanged: () => void;
|
|
10
11
|
applyNewThemeVariables(theme: AdaptableTheme): void;
|
|
11
|
-
destroy(): void;
|
|
12
12
|
showMissingThemeFiles(theme: AdaptableTheme): void;
|
|
13
13
|
getDOMPrefferedColorScheme(): 'dark' | 'light';
|
|
14
14
|
mapOsTheme(theme: AdaptableTheme | string): AdaptableTheme;
|
|
@@ -20,6 +20,11 @@ export class ThemeService {
|
|
|
20
20
|
];
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
destroy() {
|
|
24
|
+
this.api = null;
|
|
25
|
+
this.unsubscribe();
|
|
26
|
+
document.adoptedStyleSheets = [...document.adoptedStyleSheets].filter((sheet) => sheet !== this.styleSheetObject);
|
|
27
|
+
}
|
|
23
28
|
subscribe() {
|
|
24
29
|
const themeChangedUnsubscribe = this.api.eventApi.on('ThemeChanged', this.onThemeChanged);
|
|
25
30
|
const prefferedColorSchemeUnsubscribe = this.attachPrefferedColorSchemeListener();
|
|
@@ -44,11 +49,6 @@ export class ThemeService {
|
|
|
44
49
|
str += '}';
|
|
45
50
|
this.styleSheetObject.replaceSync(str);
|
|
46
51
|
}
|
|
47
|
-
destroy() {
|
|
48
|
-
this.api = null;
|
|
49
|
-
this.unsubscribe();
|
|
50
|
-
document.adoptedStyleSheets = [...document.adoptedStyleSheets].filter((sheet) => sheet !== this.styleSheetObject);
|
|
51
|
-
}
|
|
52
52
|
showMissingThemeFiles(theme) {
|
|
53
53
|
// run time defined theme
|
|
54
54
|
// because it may be an empty theme
|
|
@@ -42,6 +42,47 @@ export const ConfigurationWizard = (props) => {
|
|
|
42
42
|
delete newColumn.caption;
|
|
43
43
|
return newColumn;
|
|
44
44
|
});
|
|
45
|
+
const columnDefs = adaptableConfig.gridOptions.columnDefs;
|
|
46
|
+
// handle the layout creation
|
|
47
|
+
let Layouts = newAdaptableOptions.predefinedConfig?.Layout?.Layouts || [];
|
|
48
|
+
const NewLayout = {
|
|
49
|
+
TableColumns: columnDefs.map((col) => col.colId ?? col.field),
|
|
50
|
+
Name: 'Default Layout',
|
|
51
|
+
};
|
|
52
|
+
let currentLayoutName = NewLayout.Name;
|
|
53
|
+
let found = false;
|
|
54
|
+
if (!Layouts.length) {
|
|
55
|
+
// no layouts, make this the only one
|
|
56
|
+
Layouts = [NewLayout];
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
Layouts = Layouts.map((layout) => {
|
|
60
|
+
if (found) {
|
|
61
|
+
return layout;
|
|
62
|
+
}
|
|
63
|
+
if (layout.TableColumns?.length === 0) {
|
|
64
|
+
// when finding the first empty layout
|
|
65
|
+
// set its column to be those of the new layout
|
|
66
|
+
found = true;
|
|
67
|
+
// and grab the name so we can put it in the Layout.CurrentLayout state
|
|
68
|
+
currentLayoutName = layout.Name;
|
|
69
|
+
layout = { ...layout };
|
|
70
|
+
layout.TableColumns = NewLayout.TableColumns;
|
|
71
|
+
}
|
|
72
|
+
return layout;
|
|
73
|
+
});
|
|
74
|
+
if (!found) {
|
|
75
|
+
Layouts.push(NewLayout);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
newAdaptableOptions.predefinedConfig = {
|
|
79
|
+
...newAdaptableOptions.predefinedConfig,
|
|
80
|
+
Layout: {
|
|
81
|
+
...newAdaptableOptions.predefinedConfig.Layout,
|
|
82
|
+
Layouts: Layouts,
|
|
83
|
+
CurrentLayout: currentLayoutName,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
45
86
|
newAdaptableOptions.primaryKey = columnsHandle.current.getPrimaryKey();
|
|
46
87
|
}
|
|
47
88
|
const newAdaptableConfig = {
|
|
@@ -54,7 +54,10 @@ class DataChangeHistoryPopupComponent extends React.Component {
|
|
|
54
54
|
this.props.api.dataChangeHistoryApi.clearDataChangeHistoryEntry(changeToBeUndone);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
-
const
|
|
57
|
+
const agGridThemeMode = this.props.api.internalApi
|
|
58
|
+
.getAdaptableInstance()
|
|
59
|
+
.agGridThemeAdapter.getAgGridThemeMode();
|
|
60
|
+
const currentAgGridTheme = agGridThemeMode === 'legacy' ? this.props.api.themeApi.getAgGridCurrentThemeName() : '';
|
|
58
61
|
return (React.createElement(PopupPanel, { headerText: this.props.moduleInfo.FriendlyName, glyphicon: this.props.moduleInfo.Glyph, infoLink: this.props.moduleInfo.HelpPage, infoLinkDisabled: !this.props.api.internalApi.isDocumentationLinksDisplayed() },
|
|
59
62
|
React.createElement(Flex, { className: "ab-DataChangeHistoryPopup", flexDirection: "column", style: { height: '100%' } },
|
|
60
63
|
React.createElement(Flex, { style: {
|
|
@@ -10,7 +10,9 @@ import { AdaptableObjectRow } from '../../Components/AdaptableObjectRow';
|
|
|
10
10
|
import { PopupPanel } from '../../Components/Popups/AdaptablePopup/PopupPanel';
|
|
11
11
|
import { AdaptableObjectsSummary } from './AdaptableObjectsSummary';
|
|
12
12
|
import { ADAPTABLE_VERSION } from '../../../EnvVars';
|
|
13
|
-
|
|
13
|
+
import { AG_GRID_VERSION } from '../../../agGrid/agGridModules';
|
|
14
|
+
const adaptableVersion = ADAPTABLE_VERSION;
|
|
15
|
+
const agGridVersion = AG_GRID_VERSION;
|
|
14
16
|
export const GridInfoPopup = (props) => {
|
|
15
17
|
const api = props.api;
|
|
16
18
|
const CreateGridSummaries = (colItems) => {
|
|
@@ -33,7 +35,10 @@ export const GridInfoPopup = (props) => {
|
|
|
33
35
|
: null;
|
|
34
36
|
const selectedRowInfo = api.gridApi.getSelectedRowInfo();
|
|
35
37
|
if (api.optionsApi.getUserInterfaceOptions()?.showAdapTableVersion) {
|
|
36
|
-
returnRows.push(createReadOnlyColItem(colItems, 'AdapTable Version',
|
|
38
|
+
returnRows.push(createReadOnlyColItem(colItems, 'AdapTable Version', adaptableVersion));
|
|
39
|
+
}
|
|
40
|
+
if (api.optionsApi.getUserInterfaceOptions()?.showAgGridVersion) {
|
|
41
|
+
returnRows.push(createReadOnlyColItem(colItems, 'AG Grid Version', agGridVersion));
|
|
37
42
|
}
|
|
38
43
|
returnRows.push(createReadOnlyColItem(colItems, 'Sorted Columns', ArrayExtensions.IsNotNullOrEmpty(sorts) ? sorts.join('; ') : 'None'));
|
|
39
44
|
returnRows.push(createReadOnlyColItem(colItems, 'Column Filters', columnFilterDescription));
|
|
@@ -29,6 +29,7 @@ import { RowFormService } from '../Utilities/Services/RowFormService';
|
|
|
29
29
|
import { GridCellWithCount } from '../PredefinedConfig/Selection/GridCell';
|
|
30
30
|
import { FlashingCellService } from '../Utilities/Services/FlashingCellService';
|
|
31
31
|
import { AgGridExportAdapter } from './AgGridExportAdapter';
|
|
32
|
+
import { AgGridThemeAdapter } from './AgGridThemeAdapter';
|
|
32
33
|
export type AdaptableLifecycleState = 'initial' | 'preprocessOptions' | 'initAdaptableState' | 'setupAgGrid' | 'initAgGrid' | 'agGridReady' | 'available' | 'ready' | 'preDestroyed';
|
|
33
34
|
type RenderAgGridFrameworkComponentResult = false | GridApi;
|
|
34
35
|
interface AdaptableInitInternalConfig<TData = any> {
|
|
@@ -70,6 +71,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
|
|
|
70
71
|
agGridColumnAdapter: AgGridColumnAdapter;
|
|
71
72
|
agGridMenuAdapter: AgGridMenuAdapter;
|
|
72
73
|
agGridExportAdapter: AgGridExportAdapter;
|
|
74
|
+
agGridThemeAdapter: AgGridThemeAdapter;
|
|
73
75
|
private DANGER_USE_GETTER_adaptableContainerElement;
|
|
74
76
|
private DANGER_USE_GETTER_agGridContainerElement;
|
|
75
77
|
api: AdaptableApi;
|
|
@@ -295,8 +297,6 @@ export declare class AdaptableAgGrid implements IAdaptable {
|
|
|
295
297
|
isGridGroupingActive(): boolean;
|
|
296
298
|
setAgGridQuickSearch(searchText: string): void;
|
|
297
299
|
clearAgGridQuickSearch(): void;
|
|
298
|
-
getAgGridCurrentThemeName(): string;
|
|
299
|
-
private getAgGridLightThemeName;
|
|
300
300
|
applyAdaptableTheme(theme: AdaptableTheme | string): void;
|
|
301
301
|
setRowGroupColumns(columnIds: string[]): void;
|
|
302
302
|
getAllGridColumns(): Column<any>[];
|