@thoughtspot/ts-chart-sdk 0.0.2-alpha.2 → 0.0.2-alpha.21
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/README.md +126 -50
- package/dist/ts-chart-sdk.d.ts +940 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/main/custom-chart-context.d.ts +22 -7
- package/lib/main/custom-chart-context.d.ts.map +1 -1
- package/lib/main/custom-chart-context.js +59 -4
- package/lib/main/custom-chart-context.js.map +1 -1
- package/lib/main/custom-chart-context.spec.js +402 -5
- package/lib/main/custom-chart-context.spec.js.map +1 -1
- package/lib/main/post-message-event-bridge.js +2 -2
- package/lib/main/post-message-event-bridge.js.map +1 -1
- package/lib/main/util.spec.d.ts +2 -0
- package/lib/main/util.spec.d.ts.map +1 -0
- package/lib/main/util.spec.js +31 -0
- package/lib/main/util.spec.js.map +1 -0
- package/lib/react/use-custom-chart-context.spec.js +54 -3
- package/lib/react/use-custom-chart-context.spec.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 +57 -1
- package/lib/types/answer-column.types.d.ts.map +1 -1
- package/lib/types/answer-column.types.js +47 -0
- package/lib/types/answer-column.types.js.map +1 -1
- package/lib/types/chart-to-ts-event.types.d.ts +2 -0
- package/lib/types/chart-to-ts-event.types.d.ts.map +1 -1
- package/lib/types/chart-to-ts-event.types.js +1 -0
- package/lib/types/chart-to-ts-event.types.js.map +1 -1
- package/lib/types/common.types.d.ts +103 -4
- package/lib/types/common.types.d.ts.map +1 -1
- package/lib/types/common.types.js +15 -1
- package/lib/types/common.types.js.map +1 -1
- package/lib/types/conditional-formatting.types.d.ts +140 -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 +5 -0
- package/lib/types/configurator.types.d.ts.map +1 -1
- package/lib/types/number-formatting.types.d.ts +55 -0
- package/lib/types/number-formatting.types.d.ts.map +1 -0
- package/lib/types/number-formatting.types.js +23 -0
- package/lib/types/number-formatting.types.js.map +1 -0
- package/lib/types/ts-to-chart-event.types.d.ts +10 -5
- package/lib/types/ts-to-chart-event.types.d.ts.map +1 -1
- package/lib/types/ts-to-chart-event.types.js.map +1 -1
- package/lib/types/visual-prop.types.d.ts +21 -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 +142 -0
- package/lib/utils/conditional-formatting/conditional-formatting.spec.js.map +1 -0
- package/lib/utils/date-formatting.d.ts +103 -0
- package/lib/utils/date-formatting.d.ts.map +1 -0
- package/lib/utils/date-formatting.js +389 -0
- package/lib/utils/date-formatting.js.map +1 -0
- package/lib/utils/date-formatting.spec.d.ts +2 -0
- package/lib/utils/date-formatting.spec.d.ts.map +1 -0
- package/lib/utils/date-formatting.spec.js +394 -0
- package/lib/utils/date-formatting.spec.js.map +1 -0
- package/lib/utils/date-utils.d.ts +6 -0
- package/lib/utils/date-utils.d.ts.map +1 -0
- package/lib/utils/date-utils.js +20 -0
- package/lib/utils/date-utils.js.map +1 -0
- package/lib/utils/date-utils.spec.d.ts +2 -0
- package/lib/utils/date-utils.spec.d.ts.map +1 -0
- package/lib/utils/date-utils.spec.js +63 -0
- package/lib/utils/date-utils.spec.js.map +1 -0
- package/lib/utils/formatting-util.d.ts +10 -0
- package/lib/utils/formatting-util.d.ts.map +1 -0
- package/lib/utils/formatting-util.js +78 -0
- package/lib/utils/formatting-util.js.map +1 -0
- package/lib/utils/formatting-util.spec.d.ts +2 -0
- package/lib/utils/formatting-util.spec.d.ts.map +1 -0
- package/lib/utils/formatting-util.spec.js +247 -0
- package/lib/utils/formatting-util.spec.js.map +1 -0
- package/package.json +6 -4
- package/src/index.ts +4 -0
- package/src/main/custom-chart-context.spec.ts +474 -9
- package/src/main/custom-chart-context.ts +246 -12
- package/src/main/post-message-event-bridge.ts +1 -1
- package/src/main/util.spec.ts +41 -0
- package/src/react/use-custom-chart-context.spec.tsx +65 -3
- package/src/test/test-conditional-formatting-utils.ts +95 -0
- package/src/types/answer-column.types.ts +102 -1
- package/src/types/chart-to-ts-event.types.ts +7 -0
- package/src/types/common.types.ts +165 -10
- package/src/types/conditional-formatting.types.ts +157 -0
- package/src/types/configurator.types.ts +21 -0
- package/src/types/number-formatting.types.ts +80 -0
- package/src/types/ts-to-chart-event.types.ts +38 -6
- package/src/types/visual-prop.types.ts +75 -1
- package/src/utils/conditional-formatting/conditional-formatting.spec.ts +469 -0
- package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
- package/src/utils/date-formatting.spec.ts +511 -0
- package/src/utils/date-formatting.ts +679 -0
- package/src/utils/date-utils.spec.ts +93 -0
- package/src/utils/date-utils.ts +69 -0
- package/src/utils/formatting-util.spec.ts +312 -0
- package/src/utils/formatting-util.ts +234 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
|
+
AllowedConfigurations,
|
|
3
|
+
ChartConfigParameters,
|
|
4
|
+
} from '../main/custom-chart-context';
|
|
2
5
|
import { ChartColumn } from './answer-column.types';
|
|
3
|
-
import { Point } from './chart-to-ts-event.types';
|
|
6
|
+
import type { Point } from './chart-to-ts-event.types';
|
|
4
7
|
import {
|
|
5
8
|
AppConfig,
|
|
6
9
|
ChartConfig,
|
|
@@ -9,8 +12,8 @@ import {
|
|
|
9
12
|
ValidationResponse,
|
|
10
13
|
VisualProps,
|
|
11
14
|
} from './common.types';
|
|
12
|
-
import { ChartConfigEditorDefinition } from './configurator.types';
|
|
13
|
-
import { VisualPropEditorDefinition } from './visual-prop.types';
|
|
15
|
+
import type { ChartConfigEditorDefinition } from './configurator.types';
|
|
16
|
+
import type { VisualPropEditorDefinition } from './visual-prop.types';
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* All the events sent from the ThoughtSpot application to Custom Chart App
|
|
@@ -200,11 +203,19 @@ export interface InitializeEventResponsePayload {
|
|
|
200
203
|
*/
|
|
201
204
|
visualPropEditorDefinition?: VisualPropEditorDefinition;
|
|
202
205
|
/**
|
|
203
|
-
* Toggle native configurations supported by TS UI. Ex: column level number and conditional
|
|
206
|
+
* Toggle native configurations supported by TS UI. Ex: column level number and conditional
|
|
207
|
+
* formatting.
|
|
204
208
|
*
|
|
205
209
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
206
210
|
*/
|
|
207
211
|
allowedConfigurations?: AllowedConfigurations;
|
|
212
|
+
/**
|
|
213
|
+
* Additional chart configuration parameters supported by TS UI. Ex: show/hide Measure Name/
|
|
214
|
+
* Value columns.
|
|
215
|
+
*
|
|
216
|
+
* @version SDK: 0.1 | ThoughtSpot:
|
|
217
|
+
*/
|
|
218
|
+
chartConfigParameters?: ChartConfigParameters;
|
|
208
219
|
}
|
|
209
220
|
|
|
210
221
|
/**
|
|
@@ -215,12 +226,26 @@ export interface GetDataQueryPayload {
|
|
|
215
226
|
config: ChartConfig[];
|
|
216
227
|
}
|
|
217
228
|
|
|
229
|
+
/**
|
|
230
|
+
*
|
|
231
|
+
* @group ThoughtSpot to Chart Events
|
|
232
|
+
*/
|
|
233
|
+
export interface QueryColumn extends ChartColumn {
|
|
234
|
+
/**
|
|
235
|
+
* Flag to identify if the column is a measure value,
|
|
236
|
+
* to be used along with MEASURE_NAME/MEASUE_VALUE column in the query
|
|
237
|
+
*
|
|
238
|
+
* @version SDK: 0.1 | ThoughtSpot:
|
|
239
|
+
*/
|
|
240
|
+
isMeasureValue?: boolean;
|
|
241
|
+
}
|
|
242
|
+
|
|
218
243
|
/**
|
|
219
244
|
*
|
|
220
245
|
* @group ThoughtSpot to Chart Events
|
|
221
246
|
*/
|
|
222
247
|
export interface Query {
|
|
223
|
-
queryColumns:
|
|
248
|
+
queryColumns: QueryColumn[];
|
|
224
249
|
queryParams?: {
|
|
225
250
|
offset?: number;
|
|
226
251
|
size?: number;
|
|
@@ -280,6 +305,13 @@ export interface VisualPropsValidateEventPayload {
|
|
|
280
305
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
281
306
|
*/
|
|
282
307
|
visualProps: VisualProps;
|
|
308
|
+
/**
|
|
309
|
+
* used to identify active column for column level settings, empty string in case of overall
|
|
310
|
+
* chart settings
|
|
311
|
+
*
|
|
312
|
+
* @version SDK: 0.1 | ThoughtSpot:
|
|
313
|
+
*/
|
|
314
|
+
activeColumnId?: string;
|
|
283
315
|
}
|
|
284
316
|
|
|
285
317
|
/**
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* Copyright: ThoughtSpot Inc. 2023
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import type { CustomChartContext } from '../main/custom-chart-context';
|
|
12
|
+
import { ColumnType } from './answer-column.types';
|
|
13
|
+
import { ChartModel } from './common.types';
|
|
11
14
|
/**
|
|
12
15
|
* Configuration for input validation rules
|
|
13
16
|
*/
|
|
@@ -113,6 +116,12 @@ export interface TextInputFormDetail {
|
|
|
113
116
|
* @version SDK: 0.0.1-alpha.3 | ThoughtSpot:
|
|
114
117
|
*/
|
|
115
118
|
inputValidation?: InputValidation;
|
|
119
|
+
/**
|
|
120
|
+
* Determines whether it should be disabled or not
|
|
121
|
+
*
|
|
122
|
+
* @version SDK: 0.0.2-alpha.13 | ThoughtSpot:
|
|
123
|
+
*/
|
|
124
|
+
disabled?: boolean;
|
|
116
125
|
}
|
|
117
126
|
|
|
118
127
|
/**
|
|
@@ -146,6 +155,12 @@ export interface NumberInputFormDetail {
|
|
|
146
155
|
* @version SDK: 0.0.1-alpha.7 | ThoughtSpot:
|
|
147
156
|
*/
|
|
148
157
|
inputValidation?: InputValidation;
|
|
158
|
+
/**
|
|
159
|
+
* Determines whether it should be disabled or not
|
|
160
|
+
*
|
|
161
|
+
* @version SDK: 0.0.2-alpha.13 | ThoughtSpot:
|
|
162
|
+
*/
|
|
163
|
+
disabled?: boolean;
|
|
149
164
|
}
|
|
150
165
|
|
|
151
166
|
/**
|
|
@@ -207,6 +222,12 @@ export interface ToggleFormDetail {
|
|
|
207
222
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
208
223
|
*/
|
|
209
224
|
defaultValue?: boolean;
|
|
225
|
+
/**
|
|
226
|
+
* Determines whether it should be disabled or not
|
|
227
|
+
*
|
|
228
|
+
* @version SDK: 0.0.2-alpha.13 | ThoughtSpot:
|
|
229
|
+
*/
|
|
230
|
+
disabled?: boolean;
|
|
210
231
|
}
|
|
211
232
|
|
|
212
233
|
/**
|
|
@@ -234,6 +255,12 @@ export interface CheckboxFormDetail {
|
|
|
234
255
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
235
256
|
*/
|
|
236
257
|
defaultValue?: boolean;
|
|
258
|
+
/**
|
|
259
|
+
* Determines whether it should be disabled or not
|
|
260
|
+
*
|
|
261
|
+
* @version SDK: 0.0.2-alpha.13 | ThoughtSpot:
|
|
262
|
+
*/
|
|
263
|
+
disabled?: boolean;
|
|
237
264
|
}
|
|
238
265
|
|
|
239
266
|
/**
|
|
@@ -267,6 +294,12 @@ export interface RadioButtonFormDetail {
|
|
|
267
294
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
268
295
|
*/
|
|
269
296
|
values: string[];
|
|
297
|
+
/**
|
|
298
|
+
* Determines whether it should be disabled or not
|
|
299
|
+
*
|
|
300
|
+
* @version SDK: 0.0.2-3 | ThoughtSpot:
|
|
301
|
+
*/
|
|
302
|
+
disabled?: boolean;
|
|
270
303
|
}
|
|
271
304
|
|
|
272
305
|
/**
|
|
@@ -300,6 +333,12 @@ export interface DropDownFormDetail {
|
|
|
300
333
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
301
334
|
*/
|
|
302
335
|
values: string[];
|
|
336
|
+
/**
|
|
337
|
+
* Determines whether it should be disabled or not
|
|
338
|
+
*
|
|
339
|
+
* @version SDK: 0.0.2-alpha.13 | ThoughtSpot:
|
|
340
|
+
*/
|
|
341
|
+
disabled?: boolean;
|
|
303
342
|
}
|
|
304
343
|
|
|
305
344
|
/**
|
|
@@ -329,7 +368,6 @@ export interface Section {
|
|
|
329
368
|
children?: PropElement[];
|
|
330
369
|
/**
|
|
331
370
|
* Defines form alignment in the view for the section
|
|
332
|
-
*
|
|
333
371
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
334
372
|
*/
|
|
335
373
|
alignment?: 'row' | 'column';
|
|
@@ -341,6 +379,18 @@ export interface Section {
|
|
|
341
379
|
* @version SDK: 0.0.1-alpha.3 | ThoughtSpot:
|
|
342
380
|
*/
|
|
343
381
|
layoutType?: 'accordion' | 'tab' | 'none';
|
|
382
|
+
/**
|
|
383
|
+
* Determines whether section should be disabled or not
|
|
384
|
+
*
|
|
385
|
+
* @version SDK: 0.0.2-alpha.18 | ThoughtSpot:
|
|
386
|
+
*/
|
|
387
|
+
disabled?: boolean;
|
|
388
|
+
/* Optional property to make the accordian expanded by default. If
|
|
389
|
+
* not passed the accordian will remain closed by default. Only works with layout type 'accordian'
|
|
390
|
+
*
|
|
391
|
+
* @version SDK: 0.0.2-alpha.19 | ThoughtSpot:
|
|
392
|
+
*/
|
|
393
|
+
isAccordianExpanded?: boolean;
|
|
344
394
|
}
|
|
345
395
|
|
|
346
396
|
/**
|
|
@@ -358,6 +408,18 @@ export type PropElement =
|
|
|
358
408
|
| RadioButtonFormDetail
|
|
359
409
|
| DropDownFormDetail;
|
|
360
410
|
|
|
411
|
+
/**
|
|
412
|
+
* Define Column settings, based on column type, settings needs to be defined in
|
|
413
|
+
* visualPropEditorDefinition using the current config columns,
|
|
414
|
+
* @version SDK: 0.2 | ThoughtSpot:
|
|
415
|
+
*/
|
|
416
|
+
export interface ColumnProp {
|
|
417
|
+
type: ColumnType;
|
|
418
|
+
columnSettingsDefinition: {
|
|
419
|
+
[columnId: string]: { elements: PropElement[] };
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
|
|
361
423
|
/**
|
|
362
424
|
* Visual property editor definition object
|
|
363
425
|
*
|
|
@@ -371,8 +433,20 @@ export interface VisualPropEditorDefinition {
|
|
|
371
433
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
372
434
|
*/
|
|
373
435
|
elements: PropElement[];
|
|
436
|
+
/**
|
|
437
|
+
*To Define column level settings.
|
|
438
|
+
*
|
|
439
|
+
* @version SDK: 0.2 | ThoughtSpot:
|
|
440
|
+
*/
|
|
441
|
+
columnsVizPropDefinition?: ColumnProp[];
|
|
374
442
|
}
|
|
375
443
|
|
|
444
|
+
export type VisualEditorDefinitionSetter = (
|
|
445
|
+
currentState: ChartModel,
|
|
446
|
+
ctx: CustomChartContext,
|
|
447
|
+
activeColumnId?: string,
|
|
448
|
+
) => VisualPropEditorDefinition;
|
|
449
|
+
|
|
376
450
|
/**
|
|
377
451
|
* Example config to be able to store config in the following keys
|
|
378
452
|
* 1. range.xaxis.min
|
|
@@ -0,0 +1,469 @@
|
|
|
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
|
+
ChartSpecificColumnType,
|
|
17
|
+
ColumnTimeBucket,
|
|
18
|
+
ColumnType,
|
|
19
|
+
DataType,
|
|
20
|
+
} from '../../types/answer-column.types';
|
|
21
|
+
import { DataPointsArray } from '../../types/common.types';
|
|
22
|
+
import {
|
|
23
|
+
ConditionalFormatting,
|
|
24
|
+
ConditionalFormattingComparisonTypes,
|
|
25
|
+
FalconDataType,
|
|
26
|
+
Operators,
|
|
27
|
+
ParameterValueType,
|
|
28
|
+
} from '../../types/conditional-formatting.types';
|
|
29
|
+
import {
|
|
30
|
+
applicableConditionalFormatting,
|
|
31
|
+
getCfForColumn,
|
|
32
|
+
isConditionSatisfied,
|
|
33
|
+
validateCfCondition,
|
|
34
|
+
} from './conditional-formatting';
|
|
35
|
+
|
|
36
|
+
const mockDataAttr: DataPointsArray = {
|
|
37
|
+
columns: ['col1', 'col2'],
|
|
38
|
+
dataValue: [
|
|
39
|
+
[1, 'abc'],
|
|
40
|
+
[100, 'def'],
|
|
41
|
+
[150, 'ghi'],
|
|
42
|
+
[200, 'jkl'],
|
|
43
|
+
[300, 'mno'],
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Measure operators
|
|
48
|
+
const lessThanOperator = createMetricOperator(Operators.LessThan);
|
|
49
|
+
const greaterThanOperator = createMetricOperator(Operators.GreaterThan);
|
|
50
|
+
const lessThanEqualToOperator = createMetricOperator(Operators.LessThanEqualTo);
|
|
51
|
+
const greaterThanEqualToOperator = createMetricOperator(
|
|
52
|
+
Operators.GreaterThanEqualTo,
|
|
53
|
+
);
|
|
54
|
+
const equalToOperator = createMetricOperator(Operators.EqualTo);
|
|
55
|
+
const notEqualToOperator = createMetricOperator(Operators.NotEqualTo);
|
|
56
|
+
const isBetweenOperator = createBetweenMetricOperator(Operators.IsBetween);
|
|
57
|
+
const isNullOperator = createMetricOperator(Operators.IsNull);
|
|
58
|
+
const isNotNullOperator = createMetricOperator(Operators.IsNotNull);
|
|
59
|
+
|
|
60
|
+
// Attribute operators
|
|
61
|
+
const isOperator = createAttributeOperator(Operators.Is);
|
|
62
|
+
const isNotOperator = createAttributeOperator(Operators.IsNot);
|
|
63
|
+
const containsOperator = createAttributeOperator(Operators.Contains);
|
|
64
|
+
const doesNotContainOperator = createAttributeOperator(
|
|
65
|
+
Operators.DoesNotContain,
|
|
66
|
+
);
|
|
67
|
+
const startsWithOperator = createAttributeOperator(Operators.StartsWith);
|
|
68
|
+
const endsWithOperator = createAttributeOperator(Operators.EndsWith);
|
|
69
|
+
|
|
70
|
+
const invalidOperator = createMetricOperator('invalid-operator' as any);
|
|
71
|
+
|
|
72
|
+
const parameter = undefined;
|
|
73
|
+
|
|
74
|
+
const mockConditionalFormatting: ConditionalFormatting = {
|
|
75
|
+
rows: [lessThanOperator, greaterThanOperator, isBetweenOperator],
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const parameters = [
|
|
79
|
+
{
|
|
80
|
+
id: 'parameter1',
|
|
81
|
+
defaultValue: 'abc',
|
|
82
|
+
dataType: FalconDataType.Char,
|
|
83
|
+
description: '',
|
|
84
|
+
owner: null as any,
|
|
85
|
+
valueType: ParameterValueType.Any,
|
|
86
|
+
name: 'parameter1',
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
describe('validateCfCondition', () => {
|
|
91
|
+
test('verify validateCfCondition util', () => {
|
|
92
|
+
expect(
|
|
93
|
+
validateCfCondition(lessThanOperator, 0, 'col1', mockDataAttr),
|
|
94
|
+
).toBe(true);
|
|
95
|
+
expect(
|
|
96
|
+
validateCfCondition(lessThanOperator, 3, 'col1', mockDataAttr),
|
|
97
|
+
).toBe(false);
|
|
98
|
+
expect(
|
|
99
|
+
validateCfCondition(
|
|
100
|
+
lessThanEqualToOperator,
|
|
101
|
+
3,
|
|
102
|
+
'col1',
|
|
103
|
+
mockDataAttr,
|
|
104
|
+
),
|
|
105
|
+
).toBe(true);
|
|
106
|
+
expect(
|
|
107
|
+
validateCfCondition(greaterThanOperator, 4, 'col1', mockDataAttr),
|
|
108
|
+
).toBe(true);
|
|
109
|
+
expect(
|
|
110
|
+
validateCfCondition(greaterThanOperator, 3, 'col1', mockDataAttr),
|
|
111
|
+
).toBe(false);
|
|
112
|
+
expect(
|
|
113
|
+
validateCfCondition(
|
|
114
|
+
greaterThanEqualToOperator,
|
|
115
|
+
3,
|
|
116
|
+
'col1',
|
|
117
|
+
mockDataAttr,
|
|
118
|
+
),
|
|
119
|
+
).toBe(true);
|
|
120
|
+
expect(
|
|
121
|
+
validateCfCondition(isBetweenOperator, 0, 'col1', mockDataAttr),
|
|
122
|
+
).toBe(false);
|
|
123
|
+
expect(
|
|
124
|
+
validateCfCondition(isBetweenOperator, 1, 'col1', mockDataAttr),
|
|
125
|
+
).toBe(true);
|
|
126
|
+
expect(
|
|
127
|
+
validateCfCondition(isBetweenOperator, 2, 'col1', mockDataAttr),
|
|
128
|
+
).toBe(true);
|
|
129
|
+
expect(
|
|
130
|
+
validateCfCondition(isBetweenOperator, 3, 'col1', mockDataAttr),
|
|
131
|
+
).toBe(true);
|
|
132
|
+
expect(
|
|
133
|
+
validateCfCondition(isBetweenOperator, 4, 'col1', mockDataAttr),
|
|
134
|
+
).toBe(false);
|
|
135
|
+
expect(
|
|
136
|
+
validateCfCondition(invalidOperator, 4, 'col1', mockDataAttr),
|
|
137
|
+
).toBe(false);
|
|
138
|
+
|
|
139
|
+
const operatorWithColId = createMetricOperator(
|
|
140
|
+
Operators.LessThan,
|
|
141
|
+
'col1',
|
|
142
|
+
'col2',
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
expect(
|
|
146
|
+
validateCfCondition(operatorWithColId, 4, '', mockDataAttr),
|
|
147
|
+
).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('applicableConditionalFormatting', () => {
|
|
152
|
+
test('returns the first applicable ConditionalMetric or null', () => {
|
|
153
|
+
expect(
|
|
154
|
+
applicableConditionalFormatting(
|
|
155
|
+
0,
|
|
156
|
+
'col1',
|
|
157
|
+
mockDataAttr,
|
|
158
|
+
mockConditionalFormatting,
|
|
159
|
+
),
|
|
160
|
+
).toEqual(lessThanOperator);
|
|
161
|
+
expect(
|
|
162
|
+
applicableConditionalFormatting(
|
|
163
|
+
3,
|
|
164
|
+
'col1',
|
|
165
|
+
mockDataAttr,
|
|
166
|
+
mockConditionalFormatting,
|
|
167
|
+
),
|
|
168
|
+
).toEqual(isBetweenOperator);
|
|
169
|
+
expect(
|
|
170
|
+
applicableConditionalFormatting(
|
|
171
|
+
4,
|
|
172
|
+
'col1',
|
|
173
|
+
mockDataAttr,
|
|
174
|
+
mockConditionalFormatting,
|
|
175
|
+
),
|
|
176
|
+
).toEqual(greaterThanOperator);
|
|
177
|
+
expect(
|
|
178
|
+
applicableConditionalFormatting(
|
|
179
|
+
0,
|
|
180
|
+
'col2',
|
|
181
|
+
mockDataAttr,
|
|
182
|
+
mockConditionalFormatting,
|
|
183
|
+
),
|
|
184
|
+
).toBeNull();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('getCfForColumn', () => {
|
|
189
|
+
it('returns conditional formatting or null for the specified column', () => {
|
|
190
|
+
const column: ChartColumn = {
|
|
191
|
+
id: 'col3',
|
|
192
|
+
name: '',
|
|
193
|
+
type: ColumnType.MEASURE,
|
|
194
|
+
chartSpecificColumnType: ChartSpecificColumnType.UNKNOWN,
|
|
195
|
+
timeBucket: ColumnTimeBucket.AUTO,
|
|
196
|
+
dataType: DataType.UNKNOWN,
|
|
197
|
+
columnProperties: {
|
|
198
|
+
conditionalFormatting: mockConditionalFormatting,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
expect(getCfForColumn(column)).toEqual(mockConditionalFormatting);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe('isConditionSatisfied', () => {
|
|
207
|
+
test('verify isConditionSatisfied util', () => {
|
|
208
|
+
expect(isConditionSatisfied(lessThanOperator, parameter, 100)).toBe(
|
|
209
|
+
true,
|
|
210
|
+
);
|
|
211
|
+
expect(isConditionSatisfied(lessThanOperator, parameter, 200)).toBe(
|
|
212
|
+
false,
|
|
213
|
+
);
|
|
214
|
+
expect(
|
|
215
|
+
isConditionSatisfied(lessThanOperator, parameter, undefined),
|
|
216
|
+
).toBe(false);
|
|
217
|
+
expect(isConditionSatisfied(greaterThanOperator, parameter, 300)).toBe(
|
|
218
|
+
true,
|
|
219
|
+
);
|
|
220
|
+
expect(isConditionSatisfied(greaterThanOperator, parameter, 100)).toBe(
|
|
221
|
+
false,
|
|
222
|
+
);
|
|
223
|
+
expect(
|
|
224
|
+
isConditionSatisfied(lessThanEqualToOperator, parameter, 200),
|
|
225
|
+
).toBe(true);
|
|
226
|
+
expect(
|
|
227
|
+
isConditionSatisfied(lessThanEqualToOperator, parameter, 300),
|
|
228
|
+
).toBe(false);
|
|
229
|
+
expect(
|
|
230
|
+
isConditionSatisfied(greaterThanEqualToOperator, parameter, 200),
|
|
231
|
+
).toBe(true);
|
|
232
|
+
expect(
|
|
233
|
+
isConditionSatisfied(
|
|
234
|
+
greaterThanEqualToOperator,
|
|
235
|
+
parameter,
|
|
236
|
+
undefined,
|
|
237
|
+
),
|
|
238
|
+
).toBe(false);
|
|
239
|
+
expect(
|
|
240
|
+
isConditionSatisfied(greaterThanEqualToOperator, parameter, 100),
|
|
241
|
+
).toBe(false);
|
|
242
|
+
expect(isConditionSatisfied(equalToOperator, parameter, 200)).toBe(
|
|
243
|
+
true,
|
|
244
|
+
);
|
|
245
|
+
expect(isConditionSatisfied(equalToOperator, parameter, 100)).toBe(
|
|
246
|
+
false,
|
|
247
|
+
);
|
|
248
|
+
expect(isConditionSatisfied(notEqualToOperator, parameter, 300)).toBe(
|
|
249
|
+
true,
|
|
250
|
+
);
|
|
251
|
+
expect(isConditionSatisfied(notEqualToOperator, parameter, 200)).toBe(
|
|
252
|
+
false,
|
|
253
|
+
);
|
|
254
|
+
expect(isConditionSatisfied(notEqualToOperator, parameter, null)).toBe(
|
|
255
|
+
true,
|
|
256
|
+
);
|
|
257
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 200)).toBe(
|
|
258
|
+
true,
|
|
259
|
+
);
|
|
260
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 150)).toBe(
|
|
261
|
+
true,
|
|
262
|
+
);
|
|
263
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 201)).toBe(
|
|
264
|
+
false,
|
|
265
|
+
);
|
|
266
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 50)).toBe(
|
|
267
|
+
false,
|
|
268
|
+
);
|
|
269
|
+
expect(isConditionSatisfied(isBetweenOperator, parameter, 50)).toBe(
|
|
270
|
+
false,
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
expect(
|
|
274
|
+
isConditionSatisfied(
|
|
275
|
+
createBetweenMetricOperator(
|
|
276
|
+
Operators.IsBetween,
|
|
277
|
+
-2.5412312,
|
|
278
|
+
2.112312,
|
|
279
|
+
),
|
|
280
|
+
parameter,
|
|
281
|
+
-2.54,
|
|
282
|
+
),
|
|
283
|
+
).toBe(true);
|
|
284
|
+
expect(
|
|
285
|
+
isConditionSatisfied(
|
|
286
|
+
createBetweenMetricOperator(
|
|
287
|
+
Operators.IsBetween,
|
|
288
|
+
-2.5412312,
|
|
289
|
+
2.112312,
|
|
290
|
+
),
|
|
291
|
+
parameter,
|
|
292
|
+
-2.5412312,
|
|
293
|
+
),
|
|
294
|
+
).toBe(true);
|
|
295
|
+
expect(
|
|
296
|
+
isConditionSatisfied(
|
|
297
|
+
createBetweenMetricOperator(
|
|
298
|
+
Operators.IsBetween,
|
|
299
|
+
-2.5412312,
|
|
300
|
+
2.112312,
|
|
301
|
+
),
|
|
302
|
+
parameter,
|
|
303
|
+
-2.5412313,
|
|
304
|
+
),
|
|
305
|
+
).toBe(false);
|
|
306
|
+
expect(
|
|
307
|
+
isConditionSatisfied(
|
|
308
|
+
createBetweenMetricOperator(
|
|
309
|
+
Operators.IsBetween,
|
|
310
|
+
-2.5412312,
|
|
311
|
+
2.112312,
|
|
312
|
+
),
|
|
313
|
+
parameter,
|
|
314
|
+
2.1,
|
|
315
|
+
),
|
|
316
|
+
).toBe(true);
|
|
317
|
+
expect(
|
|
318
|
+
isConditionSatisfied(
|
|
319
|
+
createBetweenMetricOperator(
|
|
320
|
+
Operators.IsBetween,
|
|
321
|
+
-2.5412312,
|
|
322
|
+
2.112312,
|
|
323
|
+
),
|
|
324
|
+
parameter,
|
|
325
|
+
2.112312,
|
|
326
|
+
),
|
|
327
|
+
).toBe(true);
|
|
328
|
+
expect(
|
|
329
|
+
isConditionSatisfied(
|
|
330
|
+
createBetweenMetricOperator(
|
|
331
|
+
Operators.IsBetween,
|
|
332
|
+
-2.5412312,
|
|
333
|
+
2.112312,
|
|
334
|
+
),
|
|
335
|
+
parameter,
|
|
336
|
+
2.112313,
|
|
337
|
+
),
|
|
338
|
+
).toBe(false);
|
|
339
|
+
|
|
340
|
+
expect(isConditionSatisfied(isNullOperator, parameter, undefined)).toBe(
|
|
341
|
+
true,
|
|
342
|
+
);
|
|
343
|
+
expect(isConditionSatisfied(isNullOperator, parameter, 50)).toBe(false);
|
|
344
|
+
expect(isConditionSatisfied(isNullOperator, parameter, null)).toBe(
|
|
345
|
+
true,
|
|
346
|
+
);
|
|
347
|
+
expect(isConditionSatisfied(isNotNullOperator, parameter, 50)).toBe(
|
|
348
|
+
true,
|
|
349
|
+
);
|
|
350
|
+
expect(
|
|
351
|
+
isConditionSatisfied(isNotNullOperator, parameter, undefined),
|
|
352
|
+
).toBe(false);
|
|
353
|
+
|
|
354
|
+
expect(
|
|
355
|
+
isConditionSatisfied(isOperator, parameter, 'check attribute'),
|
|
356
|
+
).toBe(true);
|
|
357
|
+
expect(
|
|
358
|
+
isConditionSatisfied(isOperator, parameter, 'check not attribute'),
|
|
359
|
+
).toBe(false);
|
|
360
|
+
expect(
|
|
361
|
+
isConditionSatisfied(
|
|
362
|
+
isNotOperator,
|
|
363
|
+
parameter,
|
|
364
|
+
'check not attribute',
|
|
365
|
+
),
|
|
366
|
+
).toBe(true);
|
|
367
|
+
expect(
|
|
368
|
+
isConditionSatisfied(isNotOperator, parameter, 'check attribute'),
|
|
369
|
+
).toBe(false);
|
|
370
|
+
expect(
|
|
371
|
+
isConditionSatisfied(
|
|
372
|
+
containsOperator,
|
|
373
|
+
parameter,
|
|
374
|
+
'check attribute check',
|
|
375
|
+
),
|
|
376
|
+
).toBe(true);
|
|
377
|
+
expect(
|
|
378
|
+
isConditionSatisfied(
|
|
379
|
+
{ operator: Operators.Contains, value: '4' },
|
|
380
|
+
parameter,
|
|
381
|
+
4099,
|
|
382
|
+
),
|
|
383
|
+
).toBe(true);
|
|
384
|
+
expect(
|
|
385
|
+
isConditionSatisfied(
|
|
386
|
+
{ operator: Operators.Contains, value: '4' },
|
|
387
|
+
parameter,
|
|
388
|
+
5099,
|
|
389
|
+
),
|
|
390
|
+
).toBe(false);
|
|
391
|
+
expect(
|
|
392
|
+
isConditionSatisfied(containsOperator, parameter, 'check attribut'),
|
|
393
|
+
).toBe(false);
|
|
394
|
+
expect(
|
|
395
|
+
isConditionSatisfied(
|
|
396
|
+
doesNotContainOperator,
|
|
397
|
+
parameter,
|
|
398
|
+
'check attribut',
|
|
399
|
+
),
|
|
400
|
+
).toBe(true);
|
|
401
|
+
expect(
|
|
402
|
+
isConditionSatisfied(
|
|
403
|
+
doesNotContainOperator,
|
|
404
|
+
parameter,
|
|
405
|
+
'check attribute check',
|
|
406
|
+
),
|
|
407
|
+
).toBe(false);
|
|
408
|
+
expect(
|
|
409
|
+
isConditionSatisfied(
|
|
410
|
+
startsWithOperator,
|
|
411
|
+
parameter,
|
|
412
|
+
'check attribute check',
|
|
413
|
+
),
|
|
414
|
+
).toBe(true);
|
|
415
|
+
expect(
|
|
416
|
+
isConditionSatisfied(
|
|
417
|
+
startsWithOperator,
|
|
418
|
+
parameter,
|
|
419
|
+
'check check attribute',
|
|
420
|
+
),
|
|
421
|
+
).toBe(false);
|
|
422
|
+
expect(
|
|
423
|
+
isConditionSatisfied(
|
|
424
|
+
endsWithOperator,
|
|
425
|
+
parameter,
|
|
426
|
+
'check check attribute',
|
|
427
|
+
),
|
|
428
|
+
).toBe(true);
|
|
429
|
+
expect(
|
|
430
|
+
isConditionSatisfied(
|
|
431
|
+
endsWithOperator,
|
|
432
|
+
parameter,
|
|
433
|
+
'check attribute check',
|
|
434
|
+
),
|
|
435
|
+
).toBe(false);
|
|
436
|
+
|
|
437
|
+
// Column Based
|
|
438
|
+
const columnBasedOperator = createMetricOperator(
|
|
439
|
+
Operators.EqualTo,
|
|
440
|
+
'col1',
|
|
441
|
+
'col2',
|
|
442
|
+
'',
|
|
443
|
+
ConditionalFormattingComparisonTypes.ColumnBased,
|
|
444
|
+
);
|
|
445
|
+
expect(
|
|
446
|
+
isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'abc'),
|
|
447
|
+
).toBe(true);
|
|
448
|
+
expect(
|
|
449
|
+
isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'def'),
|
|
450
|
+
).toBe(false);
|
|
451
|
+
|
|
452
|
+
// Parameter Based
|
|
453
|
+
const parameterBasedOperator = createMetricOperator(
|
|
454
|
+
Operators.EqualTo,
|
|
455
|
+
'col1',
|
|
456
|
+
'col2',
|
|
457
|
+
'parameter1',
|
|
458
|
+
ConditionalFormattingComparisonTypes.ParameterBased,
|
|
459
|
+
);
|
|
460
|
+
expect(
|
|
461
|
+
isConditionSatisfied(
|
|
462
|
+
parameterBasedOperator,
|
|
463
|
+
parameters,
|
|
464
|
+
'abc',
|
|
465
|
+
'abc',
|
|
466
|
+
),
|
|
467
|
+
).toBe(true);
|
|
468
|
+
});
|
|
469
|
+
});
|