@thoughtspot/ts-chart-sdk 0.0.2-alpha.3 → 0.0.2-alpha.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/dist/ts-chart-sdk.d.ts +660 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/main/custom-chart-context.d.ts +8 -4
- package/lib/main/custom-chart-context.d.ts.map +1 -1
- package/lib/main/custom-chart-context.js +44 -2
- package/lib/main/custom-chart-context.js.map +1 -1
- package/lib/main/custom-chart-context.spec.js +101 -1
- package/lib/main/custom-chart-context.spec.js.map +1 -1
- package/lib/main/post-message-event-bridge.js +1 -1
- package/lib/main/post-message-event-bridge.js.map +1 -1
- package/lib/test/test-conditional-formatting-utils.d.ts +5 -0
- package/lib/test/test-conditional-formatting-utils.d.ts.map +1 -0
- package/lib/test/test-conditional-formatting-utils.js +43 -0
- package/lib/test/test-conditional-formatting-utils.js.map +1 -0
- package/lib/types/answer-column.types.d.ts +44 -0
- package/lib/types/answer-column.types.d.ts.map +1 -1
- package/lib/types/answer-column.types.js +40 -0
- package/lib/types/answer-column.types.js.map +1 -1
- package/lib/types/common.types.d.ts +6 -0
- package/lib/types/common.types.d.ts.map +1 -1
- package/lib/types/conditional-formatting.types.d.ts +155 -0
- package/lib/types/conditional-formatting.types.d.ts.map +1 -0
- package/lib/types/conditional-formatting.types.js +60 -0
- package/lib/types/conditional-formatting.types.js.map +1 -0
- package/lib/types/configurator.types.d.ts +3 -0
- package/lib/types/configurator.types.d.ts.map +1 -1
- package/lib/types/ts-to-chart-event.types.d.ts.map +1 -1
- package/lib/types/visual-prop.types.d.ts +3 -0
- package/lib/types/visual-prop.types.d.ts.map +1 -1
- package/lib/utils/conditional-formatting/conditional-formatting.d.ts +10 -0
- package/lib/utils/conditional-formatting/conditional-formatting.d.ts.map +1 -0
- package/lib/utils/conditional-formatting/conditional-formatting.js +103 -0
- package/lib/utils/conditional-formatting/conditional-formatting.js.map +1 -0
- package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts +2 -0
- package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts.map +1 -0
- package/lib/utils/conditional-formatting/conditional-formatting.spec.js +122 -0
- package/lib/utils/conditional-formatting/conditional-formatting.spec.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +2 -0
- package/src/main/custom-chart-context.spec.ts +118 -1
- package/src/main/custom-chart-context.ts +113 -8
- package/src/main/post-message-event-bridge.ts +1 -1
- package/src/test/test-conditional-formatting-utils.ts +95 -0
- package/src/types/answer-column.types.ts +63 -0
- package/src/types/common.types.ts +8 -0
- package/src/types/conditional-formatting.types.ts +172 -0
- package/src/types/configurator.types.ts +7 -0
- package/src/types/ts-to-chart-event.types.ts +2 -1
- package/src/types/visual-prop.types.ts +7 -0
- package/src/utils/conditional-formatting/conditional-formatting.spec.ts +415 -0
- package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file: Conditional Formatting Types
|
|
3
|
+
* @fileoverview All CF types for the Custom Chart implementations
|
|
4
|
+
* @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
|
|
5
|
+
*
|
|
6
|
+
* Copyright: ThoughtSpot Inc. 2023
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type Maybe<T> = T | null;
|
|
10
|
+
export type InputMaybe<T> = Maybe<T>;
|
|
11
|
+
|
|
12
|
+
export type ConditionalFormatting = {
|
|
13
|
+
__typename?: 'ConditionalFormatting';
|
|
14
|
+
rows?: Maybe<Array<Maybe<ConditionalMetric>>>;
|
|
15
|
+
};
|
|
16
|
+
export type Scalars = {
|
|
17
|
+
ID: string;
|
|
18
|
+
String: string;
|
|
19
|
+
Boolean: boolean;
|
|
20
|
+
Int: number;
|
|
21
|
+
Float: number;
|
|
22
|
+
FileUpload: any;
|
|
23
|
+
GUID: string;
|
|
24
|
+
JSON: {
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
};
|
|
27
|
+
JSONObject: any;
|
|
28
|
+
Long: any;
|
|
29
|
+
};
|
|
30
|
+
export declare enum BackgroundFormatTypes {
|
|
31
|
+
Gradient = 'GRADIENT',
|
|
32
|
+
Solid = 'SOLID',
|
|
33
|
+
}
|
|
34
|
+
export enum ConditionalFormattingComparisonTypes {
|
|
35
|
+
ColumnBased = 'COLUMN_BASED',
|
|
36
|
+
ParameterBased = 'PARAMETER_BASED',
|
|
37
|
+
ValueBased = 'VALUE_BASED',
|
|
38
|
+
}
|
|
39
|
+
export type FontAttrs = {
|
|
40
|
+
__typename?: 'FontAttrs';
|
|
41
|
+
bold?: Maybe<Scalars['Boolean']>;
|
|
42
|
+
color?: Maybe<Scalars['String']>;
|
|
43
|
+
italic?: Maybe<Scalars['Boolean']>;
|
|
44
|
+
strikeThrough?: Maybe<Scalars['Boolean']>;
|
|
45
|
+
underline?: Maybe<Scalars['Boolean']>;
|
|
46
|
+
};
|
|
47
|
+
export type GradientBackgroundAttrs = {
|
|
48
|
+
__typename?: 'GradientBackgroundAttrs';
|
|
49
|
+
backgroundFormatMidpoint?: Maybe<Scalars['Float']>;
|
|
50
|
+
backgroundFormatRange?: Maybe<Array<Maybe<Scalars['Float']>>>;
|
|
51
|
+
colors?: Maybe<Array<Maybe<Scalars['String']>>>;
|
|
52
|
+
};
|
|
53
|
+
export enum Operators {
|
|
54
|
+
Contains = 'CONTAINS',
|
|
55
|
+
DoesNotContain = 'DOES_NOT_CONTAIN',
|
|
56
|
+
EndsWith = 'ENDS_WITH',
|
|
57
|
+
EqualTo = 'EQUAL_TO',
|
|
58
|
+
GreaterThan = 'GREATER_THAN',
|
|
59
|
+
GreaterThanEqualTo = 'GREATER_THAN_EQUAL_TO',
|
|
60
|
+
Is = 'IS',
|
|
61
|
+
IsBetween = 'IS_BETWEEN',
|
|
62
|
+
IsEmpty = 'IS_EMPTY',
|
|
63
|
+
IsNot = 'IS_NOT',
|
|
64
|
+
IsNotEmpty = 'IS_NOT_EMPTY',
|
|
65
|
+
IsNotNull = 'IS_NOT_NULL',
|
|
66
|
+
IsNull = 'IS_NULL',
|
|
67
|
+
LessThan = 'LESS_THAN',
|
|
68
|
+
LessThanEqualTo = 'LESS_THAN_EQUAL_TO',
|
|
69
|
+
NotEqualTo = 'NOT_EQUAL_TO',
|
|
70
|
+
StartsWith = 'STARTS_WITH',
|
|
71
|
+
}
|
|
72
|
+
export type SolidBackgroundAttrs = {
|
|
73
|
+
__typename?: 'SolidBackgroundAttrs';
|
|
74
|
+
color?: Maybe<Scalars['String']>;
|
|
75
|
+
};
|
|
76
|
+
export type Range = {
|
|
77
|
+
__typename?: 'Range';
|
|
78
|
+
max?: Maybe<Scalars['Float']>;
|
|
79
|
+
min?: Maybe<Scalars['Float']>;
|
|
80
|
+
};
|
|
81
|
+
export type ConditionalMetric = {
|
|
82
|
+
__typename?: 'ConditionalMetric';
|
|
83
|
+
backgroundFormatType?: Maybe<BackgroundFormatTypes>;
|
|
84
|
+
comparisonParameterId?: Maybe<Scalars['String']>;
|
|
85
|
+
comparisonType?: Maybe<ConditionalFormattingComparisonTypes>;
|
|
86
|
+
fontProperties?: Maybe<FontAttrs>;
|
|
87
|
+
gradientBackgroundAttrs?: Maybe<GradientBackgroundAttrs>;
|
|
88
|
+
isHighlightRow?: Maybe<Scalars['Boolean']>;
|
|
89
|
+
lhsColumnId?: Maybe<Scalars['String']>;
|
|
90
|
+
operator?: Maybe<Operators>;
|
|
91
|
+
plotAsBand?: Maybe<Scalars['Boolean']>;
|
|
92
|
+
rangeValues?: Maybe<Range>;
|
|
93
|
+
rhsColumnId?: Maybe<Scalars['String']>;
|
|
94
|
+
solidBackgroundAttrs?: Maybe<SolidBackgroundAttrs>;
|
|
95
|
+
value?: Maybe<Scalars['String']>;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type Parameter = {
|
|
99
|
+
__typename?: 'Parameter';
|
|
100
|
+
dataType: FalconDataType;
|
|
101
|
+
defaultValue: Scalars['String'];
|
|
102
|
+
description: Scalars['String'];
|
|
103
|
+
id: Scalars['GUID'];
|
|
104
|
+
name: Scalars['String'];
|
|
105
|
+
/** If not present, the parameter has not been overridden */
|
|
106
|
+
overrideValue?: Maybe<Scalars['String']>;
|
|
107
|
+
owner: ParameterOwnerInfo;
|
|
108
|
+
valueList?: Maybe<Array<ParameterValueListItem>>;
|
|
109
|
+
valueRange?: Maybe<ParameterValueRange>;
|
|
110
|
+
valueType: ParameterValueType;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export enum FalconDataType {
|
|
114
|
+
Bool = 'BOOL',
|
|
115
|
+
Char = 'CHAR',
|
|
116
|
+
Date = 'DATE',
|
|
117
|
+
DateTime = 'DATE_TIME',
|
|
118
|
+
Double = 'DOUBLE',
|
|
119
|
+
Float = 'FLOAT',
|
|
120
|
+
Int32 = 'INT32',
|
|
121
|
+
Int64 = 'INT64',
|
|
122
|
+
List = 'LIST',
|
|
123
|
+
ListBool = 'LIST_BOOL',
|
|
124
|
+
ListDate = 'LIST_DATE',
|
|
125
|
+
ListDateTime = 'LIST_DATE_TIME',
|
|
126
|
+
ListDouble = 'LIST_DOUBLE',
|
|
127
|
+
ListInt = 'LIST_INT',
|
|
128
|
+
ListString = 'LIST_STRING',
|
|
129
|
+
ListTime = 'LIST_TIME',
|
|
130
|
+
MaxType = 'MAX_TYPE',
|
|
131
|
+
Time = 'TIME',
|
|
132
|
+
Unknown = 'UNKNOWN',
|
|
133
|
+
}
|
|
134
|
+
export type ParameterOwnerInfo = {
|
|
135
|
+
__typename?: 'ParameterOwnerInfo';
|
|
136
|
+
id: Scalars['GUID'];
|
|
137
|
+
name: Scalars['String'];
|
|
138
|
+
type: ParameterOwnerType;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
export enum ParameterOwnerType {
|
|
142
|
+
Answer = 'ANSWER',
|
|
143
|
+
Worksheet = 'WORKSHEET',
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export type ParameterValueListItem = {
|
|
147
|
+
__typename?: 'ParameterValueListItem';
|
|
148
|
+
displayAs?: Maybe<Scalars['String']>;
|
|
149
|
+
value: Scalars['String'];
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export type ParameterValueListItemInput = {
|
|
153
|
+
displayAs?: InputMaybe<Scalars['String']>;
|
|
154
|
+
value: Scalars['String'];
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
export type ParameterValueRange = {
|
|
158
|
+
__typename?: 'ParameterValueRange';
|
|
159
|
+
max?: Maybe<Scalars['Float']>;
|
|
160
|
+
min?: Maybe<Scalars['Float']>;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export type ParameterValueRangeInput = {
|
|
164
|
+
max?: InputMaybe<Scalars['Float']>;
|
|
165
|
+
min?: InputMaybe<Scalars['Float']>;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export enum ParameterValueType {
|
|
169
|
+
Any = 'ANY',
|
|
170
|
+
List = 'LIST',
|
|
171
|
+
Range = 'RANGE',
|
|
172
|
+
}
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* Copyright: ThoughtSpot Inc. 2023
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { CustomChartContext } from '../main/custom-chart-context';
|
|
18
|
+
import { ChartModel } from './common.types';
|
|
17
19
|
/**
|
|
18
20
|
*
|
|
19
21
|
* @group Chart Configuration Editor
|
|
@@ -100,3 +102,8 @@ export interface ChartConfigEditorDefinition {
|
|
|
100
102
|
*/
|
|
101
103
|
columnSections: ChartConfigSection[];
|
|
102
104
|
}
|
|
105
|
+
|
|
106
|
+
export type ConfigEditorDefinitionSetter = (
|
|
107
|
+
currentState: ChartModel,
|
|
108
|
+
ctx: CustomChartContext,
|
|
109
|
+
) => ChartConfigEditorDefinition[];
|
|
@@ -200,7 +200,8 @@ export interface InitializeEventResponsePayload {
|
|
|
200
200
|
*/
|
|
201
201
|
visualPropEditorDefinition?: VisualPropEditorDefinition;
|
|
202
202
|
/**
|
|
203
|
-
* Toggle native configurations supported by TS UI. Ex: column level number and conditional
|
|
203
|
+
* Toggle native configurations supported by TS UI. Ex: column level number and conditional
|
|
204
|
+
* formatting.
|
|
204
205
|
*
|
|
205
206
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
206
207
|
*/
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* Copyright: ThoughtSpot Inc. 2023
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { CustomChartContext } from '../main/custom-chart-context';
|
|
12
|
+
import { ChartModel } from './common.types';
|
|
11
13
|
/**
|
|
12
14
|
* Configuration for input validation rules
|
|
13
15
|
*/
|
|
@@ -373,6 +375,11 @@ export interface VisualPropEditorDefinition {
|
|
|
373
375
|
elements: PropElement[];
|
|
374
376
|
}
|
|
375
377
|
|
|
378
|
+
export type VisualEditorDefinitionSetter = (
|
|
379
|
+
currentState: ChartModel,
|
|
380
|
+
ctx: CustomChartContext,
|
|
381
|
+
) => VisualPropEditorDefinition;
|
|
382
|
+
|
|
376
383
|
/**
|
|
377
384
|
* Example config to be able to store config in the following keys
|
|
378
385
|
* 1. range.xaxis.min
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file: Conditional Formatting Spec
|
|
3
|
+
*
|
|
4
|
+
* @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
|
|
5
|
+
*
|
|
6
|
+
* Copyright: ThoughtSpot Inc. 2023
|
|
7
|
+
*/
|
|
8
|
+
import _ from 'lodash';
|
|
9
|
+
import {
|
|
10
|
+
createAttributeOperator,
|
|
11
|
+
createBetweenMetricOperator,
|
|
12
|
+
createMetricOperator,
|
|
13
|
+
} from '../../test/test-conditional-formatting-utils';
|
|
14
|
+
import {
|
|
15
|
+
ChartColumn,
|
|
16
|
+
ColumnTimeBucket,
|
|
17
|
+
ColumnType,
|
|
18
|
+
DataType,
|
|
19
|
+
} from '../../types/answer-column.types';
|
|
20
|
+
import { DataPointsArray } from '../../types/common.types';
|
|
21
|
+
import {
|
|
22
|
+
ConditionalFormatting,
|
|
23
|
+
ConditionalFormattingComparisonTypes,
|
|
24
|
+
Operators,
|
|
25
|
+
} from '../../types/conditional-formatting.types';
|
|
26
|
+
import {
|
|
27
|
+
applicableConditionalFormatting,
|
|
28
|
+
getCfForColumn,
|
|
29
|
+
isConditionSatisfied,
|
|
30
|
+
validateCfCondition,
|
|
31
|
+
} from './conditional-formatting';
|
|
32
|
+
|
|
33
|
+
const mockDataAttr: DataPointsArray = {
|
|
34
|
+
columns: ['col1', 'col2'],
|
|
35
|
+
dataValue: [
|
|
36
|
+
[1, 'abc'],
|
|
37
|
+
[100, 'def'],
|
|
38
|
+
[150, 'ghi'],
|
|
39
|
+
[200, 'jkl'],
|
|
40
|
+
[300, 'mno'],
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Measure operators
|
|
45
|
+
const lessThanOperator = createMetricOperator(Operators.LessThan);
|
|
46
|
+
const greaterThanOperator = createMetricOperator(Operators.GreaterThan);
|
|
47
|
+
const lessThanEqualToOperator = createMetricOperator(Operators.LessThanEqualTo);
|
|
48
|
+
const greaterThanEqualToOperator = createMetricOperator(
|
|
49
|
+
Operators.GreaterThanEqualTo,
|
|
50
|
+
);
|
|
51
|
+
const equalToOperator = createMetricOperator(Operators.EqualTo);
|
|
52
|
+
const notEqualToOperator = createMetricOperator(Operators.NotEqualTo);
|
|
53
|
+
const isBetweenOperator = createBetweenMetricOperator(Operators.IsBetween);
|
|
54
|
+
const isNullOperator = createMetricOperator(Operators.IsNull);
|
|
55
|
+
const isNotNullOperator = createMetricOperator(Operators.IsNotNull);
|
|
56
|
+
|
|
57
|
+
// Attribute operators
|
|
58
|
+
const isOperator = createAttributeOperator(Operators.Is);
|
|
59
|
+
const isNotOperator = createAttributeOperator(Operators.IsNot);
|
|
60
|
+
const containsOperator = createAttributeOperator(Operators.Contains);
|
|
61
|
+
const doesNotContainOperator = createAttributeOperator(
|
|
62
|
+
Operators.DoesNotContain,
|
|
63
|
+
);
|
|
64
|
+
const startsWithOperator = createAttributeOperator(Operators.StartsWith);
|
|
65
|
+
const endsWithOperator = createAttributeOperator(Operators.EndsWith);
|
|
66
|
+
|
|
67
|
+
const parameter = undefined;
|
|
68
|
+
|
|
69
|
+
const mockConditionalFormatting: ConditionalFormatting = {
|
|
70
|
+
rows: [lessThanOperator, greaterThanOperator, isBetweenOperator],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
describe('validateCfCondition', () => {
|
|
74
|
+
test('verify validateCfCondition util', () => {
|
|
75
|
+
expect(
|
|
76
|
+
validateCfCondition(lessThanOperator, 0, 'col1', mockDataAttr),
|
|
77
|
+
).toBe(true);
|
|
78
|
+
expect(
|
|
79
|
+
validateCfCondition(lessThanOperator, 3, 'col1', mockDataAttr),
|
|
80
|
+
).toBe(false);
|
|
81
|
+
expect(
|
|
82
|
+
validateCfCondition(
|
|
83
|
+
lessThanEqualToOperator,
|
|
84
|
+
3,
|
|
85
|
+
'col1',
|
|
86
|
+
mockDataAttr,
|
|
87
|
+
),
|
|
88
|
+
).toBe(true);
|
|
89
|
+
expect(
|
|
90
|
+
validateCfCondition(greaterThanOperator, 4, 'col1', mockDataAttr),
|
|
91
|
+
).toBe(true);
|
|
92
|
+
expect(
|
|
93
|
+
validateCfCondition(greaterThanOperator, 3, 'col1', mockDataAttr),
|
|
94
|
+
).toBe(false);
|
|
95
|
+
expect(
|
|
96
|
+
validateCfCondition(
|
|
97
|
+
greaterThanEqualToOperator,
|
|
98
|
+
3,
|
|
99
|
+
'col1',
|
|
100
|
+
mockDataAttr,
|
|
101
|
+
),
|
|
102
|
+
).toBe(true);
|
|
103
|
+
expect(
|
|
104
|
+
validateCfCondition(isBetweenOperator, 0, 'col1', mockDataAttr),
|
|
105
|
+
).toBe(false);
|
|
106
|
+
expect(
|
|
107
|
+
validateCfCondition(isBetweenOperator, 1, 'col1', mockDataAttr),
|
|
108
|
+
).toBe(true);
|
|
109
|
+
expect(
|
|
110
|
+
validateCfCondition(isBetweenOperator, 2, 'col1', mockDataAttr),
|
|
111
|
+
).toBe(true);
|
|
112
|
+
expect(
|
|
113
|
+
validateCfCondition(isBetweenOperator, 3, 'col1', mockDataAttr),
|
|
114
|
+
).toBe(true);
|
|
115
|
+
expect(
|
|
116
|
+
validateCfCondition(isBetweenOperator, 4, 'col1', mockDataAttr),
|
|
117
|
+
).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('applicableConditionalFormatting', () => {
|
|
122
|
+
test('returns the first applicable ConditionalMetric or null', () => {
|
|
123
|
+
expect(
|
|
124
|
+
applicableConditionalFormatting(
|
|
125
|
+
0,
|
|
126
|
+
'col1',
|
|
127
|
+
mockDataAttr,
|
|
128
|
+
mockConditionalFormatting,
|
|
129
|
+
),
|
|
130
|
+
).toEqual(lessThanOperator);
|
|
131
|
+
expect(
|
|
132
|
+
applicableConditionalFormatting(
|
|
133
|
+
3,
|
|
134
|
+
'col1',
|
|
135
|
+
mockDataAttr,
|
|
136
|
+
mockConditionalFormatting,
|
|
137
|
+
),
|
|
138
|
+
).toEqual(isBetweenOperator);
|
|
139
|
+
expect(
|
|
140
|
+
applicableConditionalFormatting(
|
|
141
|
+
4,
|
|
142
|
+
'col1',
|
|
143
|
+
mockDataAttr,
|
|
144
|
+
mockConditionalFormatting,
|
|
145
|
+
),
|
|
146
|
+
).toEqual(greaterThanOperator);
|
|
147
|
+
expect(
|
|
148
|
+
applicableConditionalFormatting(
|
|
149
|
+
0,
|
|
150
|
+
'col2',
|
|
151
|
+
mockDataAttr,
|
|
152
|
+
mockConditionalFormatting,
|
|
153
|
+
),
|
|
154
|
+
).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe('getCfForColumn', () => {
|
|
159
|
+
it('returns conditional formatting or null for the specified column', () => {
|
|
160
|
+
const column: ChartColumn = {
|
|
161
|
+
id: 'col3',
|
|
162
|
+
name: '',
|
|
163
|
+
type: ColumnType.MEASURE,
|
|
164
|
+
timeBucket: ColumnTimeBucket.AUTO,
|
|
165
|
+
dataType: DataType.UNKNOWN,
|
|
166
|
+
columnProperties: {
|
|
167
|
+
conditionalFormatting: mockConditionalFormatting,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
expect(getCfForColumn(column)).toEqual(mockConditionalFormatting);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe('isConditionSatisfied', () => {
|
|
176
|
+
test('verify isConditionSatisfied util', () => {
|
|
177
|
+
expect(isConditionSatisfied(lessThanOperator, parameter, 100)).toBe(
|
|
178
|
+
true,
|
|
179
|
+
);
|
|
180
|
+
expect(isConditionSatisfied(lessThanOperator, parameter, 200)).toBe(
|
|
181
|
+
false,
|
|
182
|
+
);
|
|
183
|
+
expect(
|
|
184
|
+
isConditionSatisfied(lessThanOperator, parameter, undefined),
|
|
185
|
+
).toBe(false);
|
|
186
|
+
expect(isConditionSatisfied(greaterThanOperator, parameter, 300)).toBe(
|
|
187
|
+
true,
|
|
188
|
+
);
|
|
189
|
+
expect(isConditionSatisfied(greaterThanOperator, parameter, 100)).toBe(
|
|
190
|
+
false,
|
|
191
|
+
);
|
|
192
|
+
expect(
|
|
193
|
+
isConditionSatisfied(lessThanEqualToOperator, parameter, 200),
|
|
194
|
+
).toBe(true);
|
|
195
|
+
expect(
|
|
196
|
+
isConditionSatisfied(lessThanEqualToOperator, parameter, 300),
|
|
197
|
+
).toBe(false);
|
|
198
|
+
expect(
|
|
199
|
+
isConditionSatisfied(greaterThanEqualToOperator, parameter, 200),
|
|
200
|
+
).toBe(true);
|
|
201
|
+
expect(
|
|
202
|
+
isConditionSatisfied(
|
|
203
|
+
greaterThanEqualToOperator,
|
|
204
|
+
parameter,
|
|
205
|
+
undefined,
|
|
206
|
+
),
|
|
207
|
+
).toBe(false);
|
|
208
|
+
expect(
|
|
209
|
+
isConditionSatisfied(greaterThanEqualToOperator, parameter, 100),
|
|
210
|
+
).toBe(false);
|
|
211
|
+
expect(isConditionSatisfied(equalToOperator, parameter, 200)).toBe(
|
|
212
|
+
true,
|
|
213
|
+
);
|
|
214
|
+
expect(isConditionSatisfied(equalToOperator, parameter, 100)).toBe(
|
|
215
|
+
false,
|
|
216
|
+
);
|
|
217
|
+
expect(isConditionSatisfied(notEqualToOperator, parameter, 300)).toBe(
|
|
218
|
+
true,
|
|
219
|
+
);
|
|
220
|
+
expect(isConditionSatisfied(notEqualToOperator, parameter, 200)).toBe(
|
|
221
|
+
false,
|
|
222
|
+
);
|
|
223
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 200)).toBe(
|
|
224
|
+
true,
|
|
225
|
+
);
|
|
226
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 150)).toBe(
|
|
227
|
+
true,
|
|
228
|
+
);
|
|
229
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 201)).toBe(
|
|
230
|
+
false,
|
|
231
|
+
);
|
|
232
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 50)).toBe(
|
|
233
|
+
false,
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
expect(
|
|
237
|
+
isConditionSatisfied(
|
|
238
|
+
createBetweenMetricOperator(
|
|
239
|
+
Operators.IsBetween,
|
|
240
|
+
-2.5412312,
|
|
241
|
+
2.112312,
|
|
242
|
+
),
|
|
243
|
+
parameter,
|
|
244
|
+
-2.54,
|
|
245
|
+
),
|
|
246
|
+
).toBe(true);
|
|
247
|
+
expect(
|
|
248
|
+
isConditionSatisfied(
|
|
249
|
+
createBetweenMetricOperator(
|
|
250
|
+
Operators.IsBetween,
|
|
251
|
+
-2.5412312,
|
|
252
|
+
2.112312,
|
|
253
|
+
),
|
|
254
|
+
parameter,
|
|
255
|
+
-2.5412312,
|
|
256
|
+
),
|
|
257
|
+
).toBe(true);
|
|
258
|
+
expect(
|
|
259
|
+
isConditionSatisfied(
|
|
260
|
+
createBetweenMetricOperator(
|
|
261
|
+
Operators.IsBetween,
|
|
262
|
+
-2.5412312,
|
|
263
|
+
2.112312,
|
|
264
|
+
),
|
|
265
|
+
parameter,
|
|
266
|
+
-2.5412313,
|
|
267
|
+
),
|
|
268
|
+
).toBe(false);
|
|
269
|
+
expect(
|
|
270
|
+
isConditionSatisfied(
|
|
271
|
+
createBetweenMetricOperator(
|
|
272
|
+
Operators.IsBetween,
|
|
273
|
+
-2.5412312,
|
|
274
|
+
2.112312,
|
|
275
|
+
),
|
|
276
|
+
parameter,
|
|
277
|
+
2.1,
|
|
278
|
+
),
|
|
279
|
+
).toBe(true);
|
|
280
|
+
expect(
|
|
281
|
+
isConditionSatisfied(
|
|
282
|
+
createBetweenMetricOperator(
|
|
283
|
+
Operators.IsBetween,
|
|
284
|
+
-2.5412312,
|
|
285
|
+
2.112312,
|
|
286
|
+
),
|
|
287
|
+
parameter,
|
|
288
|
+
2.112312,
|
|
289
|
+
),
|
|
290
|
+
).toBe(true);
|
|
291
|
+
expect(
|
|
292
|
+
isConditionSatisfied(
|
|
293
|
+
createBetweenMetricOperator(
|
|
294
|
+
Operators.IsBetween,
|
|
295
|
+
-2.5412312,
|
|
296
|
+
2.112312,
|
|
297
|
+
),
|
|
298
|
+
parameter,
|
|
299
|
+
2.112313,
|
|
300
|
+
),
|
|
301
|
+
).toBe(false);
|
|
302
|
+
|
|
303
|
+
expect(isConditionSatisfied(isNullOperator, parameter, undefined)).toBe(
|
|
304
|
+
true,
|
|
305
|
+
);
|
|
306
|
+
expect(isConditionSatisfied(isNullOperator, parameter, 50)).toBe(false);
|
|
307
|
+
expect(isConditionSatisfied(isNullOperator, parameter, null)).toBe(
|
|
308
|
+
true,
|
|
309
|
+
);
|
|
310
|
+
expect(isConditionSatisfied(isNotNullOperator, parameter, 50)).toBe(
|
|
311
|
+
true,
|
|
312
|
+
);
|
|
313
|
+
expect(
|
|
314
|
+
isConditionSatisfied(isNotNullOperator, parameter, undefined),
|
|
315
|
+
).toBe(false);
|
|
316
|
+
|
|
317
|
+
expect(
|
|
318
|
+
isConditionSatisfied(isOperator, parameter, 'check attribute'),
|
|
319
|
+
).toBe(true);
|
|
320
|
+
expect(
|
|
321
|
+
isConditionSatisfied(isOperator, parameter, 'check not attribute'),
|
|
322
|
+
).toBe(false);
|
|
323
|
+
expect(
|
|
324
|
+
isConditionSatisfied(
|
|
325
|
+
isNotOperator,
|
|
326
|
+
parameter,
|
|
327
|
+
'check not attribute',
|
|
328
|
+
),
|
|
329
|
+
).toBe(true);
|
|
330
|
+
expect(
|
|
331
|
+
isConditionSatisfied(isNotOperator, parameter, 'check attribute'),
|
|
332
|
+
).toBe(false);
|
|
333
|
+
expect(
|
|
334
|
+
isConditionSatisfied(
|
|
335
|
+
containsOperator,
|
|
336
|
+
parameter,
|
|
337
|
+
'check attribute check',
|
|
338
|
+
),
|
|
339
|
+
).toBe(true);
|
|
340
|
+
expect(
|
|
341
|
+
isConditionSatisfied(
|
|
342
|
+
{ operator: Operators.Contains, value: '4' },
|
|
343
|
+
parameter,
|
|
344
|
+
4099,
|
|
345
|
+
),
|
|
346
|
+
).toBe(true);
|
|
347
|
+
expect(
|
|
348
|
+
isConditionSatisfied(
|
|
349
|
+
{ operator: Operators.Contains, value: '4' },
|
|
350
|
+
parameter,
|
|
351
|
+
5099,
|
|
352
|
+
),
|
|
353
|
+
).toBe(false);
|
|
354
|
+
expect(
|
|
355
|
+
isConditionSatisfied(containsOperator, parameter, 'check attribut'),
|
|
356
|
+
).toBe(false);
|
|
357
|
+
expect(
|
|
358
|
+
isConditionSatisfied(
|
|
359
|
+
doesNotContainOperator,
|
|
360
|
+
parameter,
|
|
361
|
+
'check attribut',
|
|
362
|
+
),
|
|
363
|
+
).toBe(true);
|
|
364
|
+
expect(
|
|
365
|
+
isConditionSatisfied(
|
|
366
|
+
doesNotContainOperator,
|
|
367
|
+
parameter,
|
|
368
|
+
'check attribute check',
|
|
369
|
+
),
|
|
370
|
+
).toBe(false);
|
|
371
|
+
expect(
|
|
372
|
+
isConditionSatisfied(
|
|
373
|
+
startsWithOperator,
|
|
374
|
+
parameter,
|
|
375
|
+
'check attribute check',
|
|
376
|
+
),
|
|
377
|
+
).toBe(true);
|
|
378
|
+
expect(
|
|
379
|
+
isConditionSatisfied(
|
|
380
|
+
startsWithOperator,
|
|
381
|
+
parameter,
|
|
382
|
+
'check check attribute',
|
|
383
|
+
),
|
|
384
|
+
).toBe(false);
|
|
385
|
+
expect(
|
|
386
|
+
isConditionSatisfied(
|
|
387
|
+
endsWithOperator,
|
|
388
|
+
parameter,
|
|
389
|
+
'check check attribute',
|
|
390
|
+
),
|
|
391
|
+
).toBe(true);
|
|
392
|
+
expect(
|
|
393
|
+
isConditionSatisfied(
|
|
394
|
+
endsWithOperator,
|
|
395
|
+
parameter,
|
|
396
|
+
'check attribute check',
|
|
397
|
+
),
|
|
398
|
+
).toBe(false);
|
|
399
|
+
|
|
400
|
+
// Column Based
|
|
401
|
+
const columnBasedOperator = createMetricOperator(
|
|
402
|
+
Operators.EqualTo,
|
|
403
|
+
'col1',
|
|
404
|
+
'col2',
|
|
405
|
+
'',
|
|
406
|
+
ConditionalFormattingComparisonTypes.ColumnBased,
|
|
407
|
+
);
|
|
408
|
+
expect(
|
|
409
|
+
isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'abc'),
|
|
410
|
+
).toBe(true);
|
|
411
|
+
expect(
|
|
412
|
+
isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'def'),
|
|
413
|
+
).toBe(false);
|
|
414
|
+
});
|
|
415
|
+
});
|