@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.
Files changed (107) hide show
  1. package/README.md +126 -50
  2. package/dist/ts-chart-sdk.d.ts +940 -0
  3. package/lib/index.d.ts +4 -0
  4. package/lib/index.d.ts.map +1 -1
  5. package/lib/index.js +4 -0
  6. package/lib/index.js.map +1 -1
  7. package/lib/main/custom-chart-context.d.ts +22 -7
  8. package/lib/main/custom-chart-context.d.ts.map +1 -1
  9. package/lib/main/custom-chart-context.js +59 -4
  10. package/lib/main/custom-chart-context.js.map +1 -1
  11. package/lib/main/custom-chart-context.spec.js +402 -5
  12. package/lib/main/custom-chart-context.spec.js.map +1 -1
  13. package/lib/main/post-message-event-bridge.js +2 -2
  14. package/lib/main/post-message-event-bridge.js.map +1 -1
  15. package/lib/main/util.spec.d.ts +2 -0
  16. package/lib/main/util.spec.d.ts.map +1 -0
  17. package/lib/main/util.spec.js +31 -0
  18. package/lib/main/util.spec.js.map +1 -0
  19. package/lib/react/use-custom-chart-context.spec.js +54 -3
  20. package/lib/react/use-custom-chart-context.spec.js.map +1 -1
  21. package/lib/test/test-conditional-formatting-utils.d.ts +5 -0
  22. package/lib/test/test-conditional-formatting-utils.d.ts.map +1 -0
  23. package/lib/test/test-conditional-formatting-utils.js +43 -0
  24. package/lib/test/test-conditional-formatting-utils.js.map +1 -0
  25. package/lib/types/answer-column.types.d.ts +57 -1
  26. package/lib/types/answer-column.types.d.ts.map +1 -1
  27. package/lib/types/answer-column.types.js +47 -0
  28. package/lib/types/answer-column.types.js.map +1 -1
  29. package/lib/types/chart-to-ts-event.types.d.ts +2 -0
  30. package/lib/types/chart-to-ts-event.types.d.ts.map +1 -1
  31. package/lib/types/chart-to-ts-event.types.js +1 -0
  32. package/lib/types/chart-to-ts-event.types.js.map +1 -1
  33. package/lib/types/common.types.d.ts +103 -4
  34. package/lib/types/common.types.d.ts.map +1 -1
  35. package/lib/types/common.types.js +15 -1
  36. package/lib/types/common.types.js.map +1 -1
  37. package/lib/types/conditional-formatting.types.d.ts +140 -0
  38. package/lib/types/conditional-formatting.types.d.ts.map +1 -0
  39. package/lib/types/conditional-formatting.types.js +60 -0
  40. package/lib/types/conditional-formatting.types.js.map +1 -0
  41. package/lib/types/configurator.types.d.ts +5 -0
  42. package/lib/types/configurator.types.d.ts.map +1 -1
  43. package/lib/types/number-formatting.types.d.ts +55 -0
  44. package/lib/types/number-formatting.types.d.ts.map +1 -0
  45. package/lib/types/number-formatting.types.js +23 -0
  46. package/lib/types/number-formatting.types.js.map +1 -0
  47. package/lib/types/ts-to-chart-event.types.d.ts +10 -5
  48. package/lib/types/ts-to-chart-event.types.d.ts.map +1 -1
  49. package/lib/types/ts-to-chart-event.types.js.map +1 -1
  50. package/lib/types/visual-prop.types.d.ts +21 -0
  51. package/lib/types/visual-prop.types.d.ts.map +1 -1
  52. package/lib/utils/conditional-formatting/conditional-formatting.d.ts +10 -0
  53. package/lib/utils/conditional-formatting/conditional-formatting.d.ts.map +1 -0
  54. package/lib/utils/conditional-formatting/conditional-formatting.js +103 -0
  55. package/lib/utils/conditional-formatting/conditional-formatting.js.map +1 -0
  56. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts +2 -0
  57. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts.map +1 -0
  58. package/lib/utils/conditional-formatting/conditional-formatting.spec.js +142 -0
  59. package/lib/utils/conditional-formatting/conditional-formatting.spec.js.map +1 -0
  60. package/lib/utils/date-formatting.d.ts +103 -0
  61. package/lib/utils/date-formatting.d.ts.map +1 -0
  62. package/lib/utils/date-formatting.js +389 -0
  63. package/lib/utils/date-formatting.js.map +1 -0
  64. package/lib/utils/date-formatting.spec.d.ts +2 -0
  65. package/lib/utils/date-formatting.spec.d.ts.map +1 -0
  66. package/lib/utils/date-formatting.spec.js +394 -0
  67. package/lib/utils/date-formatting.spec.js.map +1 -0
  68. package/lib/utils/date-utils.d.ts +6 -0
  69. package/lib/utils/date-utils.d.ts.map +1 -0
  70. package/lib/utils/date-utils.js +20 -0
  71. package/lib/utils/date-utils.js.map +1 -0
  72. package/lib/utils/date-utils.spec.d.ts +2 -0
  73. package/lib/utils/date-utils.spec.d.ts.map +1 -0
  74. package/lib/utils/date-utils.spec.js +63 -0
  75. package/lib/utils/date-utils.spec.js.map +1 -0
  76. package/lib/utils/formatting-util.d.ts +10 -0
  77. package/lib/utils/formatting-util.d.ts.map +1 -0
  78. package/lib/utils/formatting-util.js +78 -0
  79. package/lib/utils/formatting-util.js.map +1 -0
  80. package/lib/utils/formatting-util.spec.d.ts +2 -0
  81. package/lib/utils/formatting-util.spec.d.ts.map +1 -0
  82. package/lib/utils/formatting-util.spec.js +247 -0
  83. package/lib/utils/formatting-util.spec.js.map +1 -0
  84. package/package.json +6 -4
  85. package/src/index.ts +4 -0
  86. package/src/main/custom-chart-context.spec.ts +474 -9
  87. package/src/main/custom-chart-context.ts +246 -12
  88. package/src/main/post-message-event-bridge.ts +1 -1
  89. package/src/main/util.spec.ts +41 -0
  90. package/src/react/use-custom-chart-context.spec.tsx +65 -3
  91. package/src/test/test-conditional-formatting-utils.ts +95 -0
  92. package/src/types/answer-column.types.ts +102 -1
  93. package/src/types/chart-to-ts-event.types.ts +7 -0
  94. package/src/types/common.types.ts +165 -10
  95. package/src/types/conditional-formatting.types.ts +157 -0
  96. package/src/types/configurator.types.ts +21 -0
  97. package/src/types/number-formatting.types.ts +80 -0
  98. package/src/types/ts-to-chart-event.types.ts +38 -6
  99. package/src/types/visual-prop.types.ts +75 -1
  100. package/src/utils/conditional-formatting/conditional-formatting.spec.ts +469 -0
  101. package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
  102. package/src/utils/date-formatting.spec.ts +511 -0
  103. package/src/utils/date-formatting.ts +679 -0
  104. package/src/utils/date-utils.spec.ts +93 -0
  105. package/src/utils/date-utils.ts +69 -0
  106. package/src/utils/formatting-util.spec.ts +312 -0
  107. package/src/utils/formatting-util.ts +234 -0
@@ -1,6 +1,9 @@
1
- import { AllowedConfigurations } from '../main/custom-chart-context';
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 formatting.
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: ChartColumn[];
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
+ });