@sisense/sdk-data 1.12.0 → 1.14.0

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 (48) hide show
  1. package/dist/cjs/dimensional-model/analytics/factory.js +6 -4
  2. package/dist/cjs/dimensional-model/attributes.js +20 -1
  3. package/dist/cjs/dimensional-model/dimensions.d.ts +8 -0
  4. package/dist/cjs/dimensional-model/dimensions.js +4 -0
  5. package/dist/cjs/dimensional-model/dimensions.test.js +30 -0
  6. package/dist/cjs/dimensional-model/filters/factory.d.ts +3 -2
  7. package/dist/cjs/dimensional-model/filters/factory.js +5 -5
  8. package/dist/cjs/dimensional-model/filters/factory.test.js +1 -1
  9. package/dist/cjs/dimensional-model/filters/filters.d.ts +37 -2
  10. package/dist/cjs/dimensional-model/filters/filters.js +88 -4
  11. package/dist/cjs/dimensional-model/filters/filters.test.js +16 -0
  12. package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.js +4 -2
  13. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.js +5 -1
  14. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
  15. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.js +28 -3
  16. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.test.js +80 -15
  17. package/dist/cjs/dimensional-model/filters/utils/filter-types-util.js +3 -3
  18. package/dist/cjs/dimensional-model/filters/utils/types.d.ts +6 -0
  19. package/dist/cjs/dimensional-model/interfaces.d.ts +14 -0
  20. package/dist/cjs/dimensional-model/types.d.ts +2 -0
  21. package/dist/cjs/dimensional-model/types.js +4 -0
  22. package/dist/cjs/interfaces.d.ts +1 -1
  23. package/dist/cjs/translation/resources/en.js +1 -1
  24. package/dist/cjs/translation/resources/uk.js +1 -1
  25. package/dist/cjs/utils.js +6 -2
  26. package/dist/cjs/utils.test.js +24 -0
  27. package/dist/dimensional-model/analytics/factory.js +6 -4
  28. package/dist/dimensional-model/attributes.js +20 -1
  29. package/dist/dimensional-model/dimensions.d.ts +8 -0
  30. package/dist/dimensional-model/dimensions.js +4 -0
  31. package/dist/dimensional-model/filters/factory.d.ts +3 -2
  32. package/dist/dimensional-model/filters/factory.js +6 -6
  33. package/dist/dimensional-model/filters/filters.d.ts +37 -2
  34. package/dist/dimensional-model/filters/filters.js +86 -3
  35. package/dist/dimensional-model/filters/utils/condition-filter-util.js +4 -2
  36. package/dist/dimensional-model/filters/utils/filter-code-util.js +5 -1
  37. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
  38. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +26 -2
  39. package/dist/dimensional-model/filters/utils/filter-types-util.js +3 -3
  40. package/dist/dimensional-model/filters/utils/types.d.ts +6 -0
  41. package/dist/dimensional-model/interfaces.d.ts +14 -0
  42. package/dist/dimensional-model/types.d.ts +2 -0
  43. package/dist/dimensional-model/types.js +4 -0
  44. package/dist/interfaces.d.ts +1 -1
  45. package/dist/translation/resources/en.js +1 -1
  46. package/dist/translation/resources/uk.js +1 -1
  47. package/dist/utils.js +6 -2
  48. package/package.json +3 -3
@@ -105,8 +105,8 @@ const boxWhiskerIqrOutliers = (target) => {
105
105
  Attr: target,
106
106
  });
107
107
  outliersAttrWithInnerFilter.name = `${outliersAttrWithInnerFilter.name} (Outliers)`;
108
- outliersAttrWithInnerFilter.jaql = () => {
109
- return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
108
+ outliersAttrWithInnerFilter.jaql = (nested) => {
109
+ const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
110
110
  or: [
111
111
  {
112
112
  fromNotEqual: outliersMax.jaql(true),
@@ -116,6 +116,7 @@ const boxWhiskerIqrOutliers = (target) => {
116
116
  },
117
117
  ],
118
118
  } });
119
+ return nested ? jaql : { jaql };
119
120
  };
120
121
  return outliersAttrWithInnerFilter;
121
122
  };
@@ -134,8 +135,8 @@ const boxWhiskerStdDevOutliers = (target) => {
134
135
  const outliersMin = (0, factory_js_1.customFormula)(exports.BOX_WHISKER.OUTLIER_MIN_VALUE_NAME, '(LOWERWHISKERMAX_STDEVP([Attr]), all([Attr]))', {
135
136
  Attr: target,
136
137
  });
137
- outliersAttrWithInnerFilter.jaql = () => {
138
- return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
138
+ outliersAttrWithInnerFilter.jaql = (nested) => {
139
+ const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
139
140
  or: [
140
141
  {
141
142
  fromNotEqual: outliersMax.jaql(true),
@@ -145,6 +146,7 @@ const boxWhiskerStdDevOutliers = (target) => {
145
146
  },
146
147
  ],
147
148
  } });
149
+ return nested ? jaql : { jaql };
148
150
  };
149
151
  return outliersAttrWithInnerFilter;
150
152
  };
@@ -163,6 +163,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
163
163
  */
164
164
  translateGranularityToJaql() {
165
165
  const MINUTES_LEVEL = 'minutes';
166
+ const SECONDS_LEVEL = 'seconds';
166
167
  switch (this.granularity) {
167
168
  case types_js_1.DateLevels.Years:
168
169
  case types_js_1.DateLevels.Quarters:
@@ -185,6 +186,16 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
185
186
  dateTimeLevel: MINUTES_LEVEL,
186
187
  bucket: '15',
187
188
  };
189
+ case types_js_1.DateLevels.Minutes:
190
+ return {
191
+ dateTimeLevel: MINUTES_LEVEL,
192
+ bucket: '1',
193
+ };
194
+ case types_js_1.DateLevels.Seconds:
195
+ return {
196
+ dateTimeLevel: SECONDS_LEVEL,
197
+ bucket: '0',
198
+ };
188
199
  case types_js_1.DateLevels.AggHours:
189
200
  return {
190
201
  level: MINUTES_LEVEL,
@@ -216,7 +227,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
216
227
  return lvl;
217
228
  };
218
229
  if (json.dateTimeLevel) {
219
- if (json.dateTimeLevel !== 'minutes') {
230
+ if (json.dateTimeLevel !== 'minutes' && json.dateTimeLevel !== 'seconds') {
220
231
  return returnUnsupported(json.dateTimeLevel);
221
232
  }
222
233
  switch (json.bucket) {
@@ -226,6 +237,10 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
226
237
  return types_js_1.DateLevels.MinutesRoundTo30;
227
238
  case '15':
228
239
  return types_js_1.DateLevels.MinutesRoundTo15;
240
+ case '1':
241
+ return types_js_1.DateLevels.Minutes;
242
+ case '0':
243
+ return types_js_1.DateLevels.Seconds;
229
244
  default:
230
245
  return returnUnsupported(json.dateTimeLevel);
231
246
  }
@@ -277,6 +292,10 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
277
292
  return 'yyyy-MM-dd HH:mm';
278
293
  case types_js_1.DateLevels.MinutesRoundTo15:
279
294
  return 'yyyy-MM-dd HH:mm';
295
+ case types_js_1.DateLevels.Minutes:
296
+ return 'yyyy-MM-dd HH:mm';
297
+ case types_js_1.DateLevels.Seconds:
298
+ return 'yyyy-MM-dd HH:mm:ss';
280
299
  case types_js_1.DateLevels.AggHours:
281
300
  return 'HH:mm';
282
301
  case types_js_1.DateLevels.AggMinutesRoundTo30:
@@ -94,6 +94,14 @@ export declare class DimensionalDateDimension extends DimensionalDimension imple
94
94
  * Minutes (round to 15) level
95
95
  */
96
96
  readonly MinutesRoundTo15: LevelAttribute;
97
+ /**
98
+ * Minutes level (for Live Models)
99
+ */
100
+ readonly Minutes: LevelAttribute;
101
+ /**
102
+ * Seconds level (for Live Models)
103
+ */
104
+ readonly Seconds: LevelAttribute;
97
105
  /**
98
106
  * Aggregated Hours level
99
107
  */
@@ -164,6 +164,8 @@ class DimensionalDateDimension extends DimensionalDimension {
164
164
  this.Hours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Hours, expression, types_js_1.DateLevels.Hours, 'yyyy-MM-dd HH:mm');
165
165
  this.MinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo30, expression, types_js_1.DateLevels.MinutesRoundTo30, 'yyyy-MM-dd HH:mm');
166
166
  this.MinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo15, expression, types_js_1.DateLevels.MinutesRoundTo15, 'yyyy-MM-dd HH:mm');
167
+ this.Minutes = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Minutes, expression, types_js_1.DateLevels.Minutes, 'yyyy-MM-dd HH:mm');
168
+ this.Seconds = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Seconds, expression, types_js_1.DateLevels.Seconds, 'yyyy-MM-dd HH:mm:ss');
167
169
  this.AggHours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggHours, expression, types_js_1.DateLevels.AggHours, 'HH:mm');
168
170
  this.AggMinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo30, expression, types_js_1.DateLevels.AggMinutesRoundTo30, 'HH:mm');
169
171
  this.AggMinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo15, expression, types_js_1.DateLevels.AggMinutesRoundTo15, 'HH:mm');
@@ -177,6 +179,8 @@ class DimensionalDateDimension extends DimensionalDimension {
177
179
  this.Hours,
178
180
  this.MinutesRoundTo30,
179
181
  this.MinutesRoundTo15,
182
+ this.Minutes,
183
+ this.Seconds,
180
184
  this.AggHours,
181
185
  this.AggMinutesRoundTo30,
182
186
  this.AggMinutesRoundTo15,
@@ -43,6 +43,36 @@ describe('Dimension jaql preparations', () => {
43
43
  const jaql = dimension.jaql();
44
44
  expect(jaql).toStrictEqual(result);
45
45
  });
46
+ it('must prepare jaql for date dimension with "seconds" level', () => {
47
+ const result = {
48
+ jaql: {
49
+ title: 'Seconds',
50
+ dim: '[Commerce.Date (Calendar)]',
51
+ bucket: '0',
52
+ dateTimeLevel: 'seconds',
53
+ datatype: 'datetime',
54
+ },
55
+ format: { mask: { seconds: 'yyyy-MM-dd HH:mm:ss' } },
56
+ };
57
+ const dimension = new dimensions_js_1.DimensionalDateDimension('Date', '[Commerce.Date (Calendar)]');
58
+ const jaql = dimension.Seconds.jaql();
59
+ expect(jaql).toStrictEqual(result);
60
+ });
61
+ it('must prepare jaql for date dimension with "minutes" level', () => {
62
+ const result = {
63
+ jaql: {
64
+ title: 'Minutes',
65
+ dim: '[Commerce.Date (Calendar)]',
66
+ bucket: '1',
67
+ dateTimeLevel: 'minutes',
68
+ datatype: 'datetime',
69
+ },
70
+ format: { mask: { minutes: 'yyyy-MM-dd HH:mm' } },
71
+ };
72
+ const dimension = new dimensions_js_1.DimensionalDateDimension('Date', '[Commerce.Date (Calendar)]');
73
+ const jaql = dimension.Minutes.jaql();
74
+ expect(jaql).toStrictEqual(result);
75
+ });
46
76
  it('must handle sort', () => {
47
77
  const dimensionAscSort = new dimensions_js_1.DimensionalDimension('Brand', '[Brand.Brand]', [new attributes_js_1.DimensionalAttribute('Brand', '[Brand.Brand]')], [], 'textdimension', '', types_js_1.Sort.Ascending);
48
78
  const dimensionDescSort = new dimensions_js_1.DimensionalDimension('Brand', '[Brand.Brand]', [new attributes_js_1.DimensionalAttribute('Brand', '[Brand.Brand]')], [], 'textdimension', '', types_js_1.Sort.Descending);
@@ -373,10 +373,11 @@ export declare function numeric(attribute: Attribute, operatorA?: string, valueA
373
373
  * ```
374
374
  * @param attribute - Attribute to filter on
375
375
  * @param members - Array of member values to filter by
376
+ * @param _deactivatedMembers - [internal] Array of deactivated member values
376
377
  * @param guid - Optional GUID for the filter
377
378
  * @returns A filter instance
378
379
  */
379
- export declare function members(attribute: Attribute, members: string[], guid?: string): Filter;
380
+ export declare function members(attribute: Attribute, members: string[], _deactivatedMembers?: string[], guid?: string, backgroundFilter?: Filter): Filter;
380
381
  /**
381
382
  * Creates a filter to isolate date values starting from and including the given date and level.
382
383
  *
@@ -793,4 +794,4 @@ export declare namespace logic {
793
794
  * @returns A filter instance
794
795
  * @internal
795
796
  */
796
- export declare function customFilter(jaql: any, guid?: string): Filter;
797
+ export declare function customFilter(attribute: Attribute, jaql: any, guid?: string): Filter;
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.customFilter = exports.logic = exports.bottomRanking = exports.topRanking = exports.measureBetweenNotEqual = exports.measureBetween = exports.measureLessThan = exports.measureLessThanOrEqual = exports.measureGreaterThanOrEqual = exports.measureGreaterThan = exports.measureEquals = exports.measureBase = exports.today = exports.thisQuarter = exports.thisMonth = exports.thisYear = exports.dateRelativeTo = exports.dateRelativeFrom = exports.dateRelative = exports.dateRange = exports.dateTo = exports.dateFrom = exports.members = exports.numeric = exports.betweenNotEqual = exports.between = exports.lessThanOrEqual = exports.lessThan = exports.greaterThanOrEqual = exports.greaterThan = exports.equals = exports.doesntEqual = exports.like = exports.startsWith = exports.endsWith = exports.contains = exports.doesntStartWith = exports.doesntEndWith = exports.doesntContain = exports.exclude = exports.intersection = exports.union = void 0;
4
4
  const filters_js_1 = require("./filters.js");
5
- const filter_from_jaql_util_js_1 = require("./utils/filter-from-jaql-util.js");
6
5
  // LOGICAL FILTERS
7
6
  /**
8
7
  * Creates a filter representing the union of multiple filters on the same attribute. The resulting
@@ -446,11 +445,12 @@ exports.numeric = numeric;
446
445
  * ```
447
446
  * @param attribute - Attribute to filter on
448
447
  * @param members - Array of member values to filter by
448
+ * @param _deactivatedMembers - [internal] Array of deactivated member values
449
449
  * @param guid - Optional GUID for the filter
450
450
  * @returns A filter instance
451
451
  */
452
- function members(attribute, members, guid) {
453
- return new filters_js_1.MembersFilter(attribute, members, guid);
452
+ function members(attribute, members, _deactivatedMembers, guid, backgroundFilter) {
453
+ return new filters_js_1.MembersFilter(attribute, members, _deactivatedMembers, guid, backgroundFilter);
454
454
  }
455
455
  exports.members = members;
456
456
  // DATE FILTERS
@@ -956,7 +956,7 @@ var logic;
956
956
  * @returns A filter instance
957
957
  * @internal
958
958
  */
959
- function customFilter(jaql, guid) {
960
- return (0, filter_from_jaql_util_js_1.createGenericFilter)(jaql, guid);
959
+ function customFilter(attribute, jaql, guid) {
960
+ return new filters_js_1.CustomFilter(attribute, jaql, guid);
961
961
  }
962
962
  exports.customFilter = customFilter;
@@ -195,7 +195,7 @@ describe('filterFactory', () => {
195
195
  expect(f).toHaveProperty('operatorA', filters_js_1.NumericOperators.Equals);
196
196
  expect(f).toHaveProperty('valueA', 5);
197
197
  });
198
- test('filterFactory.member()', () => {
198
+ test('filterFactory.members()', () => {
199
199
  const f = filterFactory.members(TextDim, ['mem1', 'mem2']);
200
200
  expect(f).toBeInstanceOf(filters_js_1.MembersFilter);
201
201
  expect(f).toHaveProperty('attribute', TextDim);
@@ -74,6 +74,7 @@ export declare const FilterTypes: {
74
74
  date: string;
75
75
  relativeDate: string;
76
76
  cascading: string;
77
+ advanced: string;
77
78
  };
78
79
  /**
79
80
  * base implementation for filter classes
@@ -93,12 +94,22 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
93
94
  * Global filter identifier
94
95
  */
95
96
  readonly guid: string;
97
+ private _disabled;
98
+ private _locked;
96
99
  /**
97
100
  * Boolean flag whether the filter is disabled
98
101
  *
99
102
  * @internal
100
103
  */
101
- disabled: boolean;
104
+ get disabled(): boolean;
105
+ set disabled(value: boolean);
106
+ /**
107
+ * Boolean flag whether the filter is locked
108
+ *
109
+ * @internal
110
+ */
111
+ get locked(): boolean;
112
+ set locked(value: boolean);
102
113
  constructor(att: Attribute, filterType: string, guid?: string);
103
114
  get name(): string;
104
115
  /**
@@ -151,7 +162,11 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
151
162
  */
152
163
  export declare class MembersFilter extends AbstractFilter {
153
164
  readonly members: any[];
154
- constructor(attribute: Attribute, members?: any[], guid?: string);
165
+ /** @internal */
166
+ _deactivatedMembers: any[];
167
+ /** @internal */
168
+ backgroundFilter?: Filter;
169
+ constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string, backgroundFilter?: Filter);
155
170
  /**
156
171
  * gets the element's ID
157
172
  */
@@ -175,6 +190,10 @@ export declare class CascadingFilter extends AbstractFilter {
175
190
  * gets the element's ID
176
191
  */
177
192
  get id(): string;
193
+ get disabled(): boolean;
194
+ set disabled(value: boolean);
195
+ get locked(): boolean;
196
+ set locked(value: boolean);
178
197
  /**
179
198
  * Gets a serializable representation of the element
180
199
  */
@@ -313,6 +332,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
313
332
  */
314
333
  filterJaql(): any;
315
334
  }
335
+ /**
336
+ * @internal
337
+ */
338
+ export declare class CustomFilter extends AbstractFilter {
339
+ readonly jaqlExpression: any;
340
+ constructor(att: Attribute, jaql: any, guid?: string);
341
+ /**
342
+ * gets the element's ID
343
+ */
344
+ get id(): string;
345
+ /**
346
+ * Gets JAQL representing this Filter instance
347
+ *
348
+ */
349
+ filterJaql(): any;
350
+ }
316
351
  /**
317
352
  * @param json - Filter JSON representation
318
353
  * @internal
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createFilter = exports.RelativeDateFilter = exports.DateRangeFilter = exports.TextFilter = exports.NumericFilter = exports.RankingFilter = exports.MeasureFilter = exports.DoubleOperatorFilter = exports.ExcludeFilter = exports.CascadingFilter = exports.MembersFilter = exports.LogicalAttributeFilter = exports.FilterTypes = exports.RankingOperators = exports.LogicalOperators = exports.DateOperators = exports.NumericOperators = exports.TextOperators = void 0;
6
+ exports.createFilter = exports.CustomFilter = exports.RelativeDateFilter = exports.DateRangeFilter = exports.TextFilter = exports.NumericFilter = exports.RankingFilter = exports.MeasureFilter = exports.DoubleOperatorFilter = exports.ExcludeFilter = exports.CascadingFilter = exports.MembersFilter = exports.LogicalAttributeFilter = exports.FilterTypes = exports.RankingOperators = exports.LogicalOperators = exports.DateOperators = exports.NumericOperators = exports.TextOperators = void 0;
7
7
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
8
8
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
9
9
  /* eslint-disable @typescript-eslint/no-unsafe-return */
@@ -92,6 +92,7 @@ exports.FilterTypes = {
92
92
  date: 'date',
93
93
  relativeDate: 'relativeDate',
94
94
  cascading: 'cascading',
95
+ advanced: 'advanced',
95
96
  };
96
97
  // CLASSES
97
98
  /**
@@ -107,6 +108,29 @@ class AbstractFilter extends base_js_1.DimensionalElement {
107
108
  this.attribute = att;
108
109
  this.guid = guid || (0, utils_js_1.guidFast)(13);
109
110
  this.disabled = false;
111
+ this.locked = false;
112
+ }
113
+ /**
114
+ * Boolean flag whether the filter is disabled
115
+ *
116
+ * @internal
117
+ */
118
+ get disabled() {
119
+ return this._disabled;
120
+ }
121
+ set disabled(value) {
122
+ this._disabled = value;
123
+ }
124
+ /**
125
+ * Boolean flag whether the filter is locked
126
+ *
127
+ * @internal
128
+ */
129
+ get locked() {
130
+ return this._locked;
131
+ }
132
+ set locked(value) {
133
+ this._locked = value;
110
134
  }
111
135
  get name() {
112
136
  return (0, object_hash_1.default)(this.jaql());
@@ -149,7 +173,9 @@ class AbstractFilter extends base_js_1.DimensionalElement {
149
173
  const { granularity } = attribute;
150
174
  if (granularity === types_js_1.DateLevels.Hours ||
151
175
  granularity === types_js_1.DateLevels.MinutesRoundTo30 ||
152
- granularity === types_js_1.DateLevels.MinutesRoundTo15) {
176
+ granularity === types_js_1.DateLevels.MinutesRoundTo15 ||
177
+ granularity === types_js_1.DateLevels.Minutes ||
178
+ granularity === types_js_1.DateLevels.Seconds) {
153
179
  throw new translatable_error_js_1.TranslatableError('errors.filter.unsupportedDatetimeLevel');
154
180
  }
155
181
  }
@@ -195,9 +221,11 @@ exports.LogicalAttributeFilter = LogicalAttributeFilter;
195
221
  * @internal
196
222
  */
197
223
  class MembersFilter extends AbstractFilter {
198
- constructor(attribute, members, guid) {
224
+ constructor(attribute, members, _deactivatedMembers, guid, backgroundFilter) {
199
225
  super(attribute, exports.FilterTypes.members, guid);
200
226
  this.members = members !== null && members !== void 0 ? members : [];
227
+ this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
228
+ this.backgroundFilter = backgroundFilter;
201
229
  if (this.members.filter((m) => m === null || m === undefined).length > 0) {
202
230
  throw new translatable_error_js_1.TranslatableError('errors.filter.membersFilterNullMember', {
203
231
  attributeId: attribute.id,
@@ -216,15 +244,24 @@ class MembersFilter extends AbstractFilter {
216
244
  serializable() {
217
245
  const result = super.serializable();
218
246
  result.members = this.members;
247
+ if (this.backgroundFilter) {
248
+ result.backgroundFilter = this.backgroundFilter.serializable();
249
+ }
219
250
  return result;
220
251
  }
221
252
  /**
222
253
  * Gets JAQL representing this Filter instance
223
254
  */
224
255
  filterJaql() {
225
- return {
256
+ const filterJaql = {
226
257
  members: this.members.map((m) => m.toString()),
227
258
  };
259
+ if (this.backgroundFilter) {
260
+ return {
261
+ and: [filterJaql, this.backgroundFilter.filterJaql()],
262
+ };
263
+ }
264
+ return filterJaql;
228
265
  }
229
266
  }
230
267
  exports.MembersFilter = MembersFilter;
@@ -242,6 +279,28 @@ class CascadingFilter extends AbstractFilter {
242
279
  get id() {
243
280
  return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
244
281
  }
282
+ get disabled() {
283
+ return super.disabled;
284
+ }
285
+ set disabled(value) {
286
+ super.disabled = value;
287
+ if (this.filters) {
288
+ this.filters.forEach((filter) => {
289
+ filter.disabled = value;
290
+ });
291
+ }
292
+ }
293
+ get locked() {
294
+ return super.locked;
295
+ }
296
+ set locked(value) {
297
+ super.locked = value;
298
+ if (this.filters) {
299
+ this.filters.forEach((filter) => {
300
+ filter.locked = value;
301
+ });
302
+ }
303
+ }
245
304
  /**
246
305
  * Gets a serializable representation of the element
247
306
  */
@@ -573,6 +632,31 @@ class RelativeDateFilter extends AbstractFilter {
573
632
  }
574
633
  }
575
634
  exports.RelativeDateFilter = RelativeDateFilter;
635
+ /**
636
+ * @internal
637
+ */
638
+ class CustomFilter extends AbstractFilter {
639
+ constructor(att, jaql, guid) {
640
+ super(att, exports.FilterTypes.advanced, guid);
641
+ // remove filterType from jaql as it is not needed
642
+ delete jaql.filterType;
643
+ this.jaqlExpression = jaql;
644
+ }
645
+ /**
646
+ * gets the element's ID
647
+ */
648
+ get id() {
649
+ return `custom_${this.attribute.id}_${this.guid}`;
650
+ }
651
+ /**
652
+ * Gets JAQL representing this Filter instance
653
+ *
654
+ */
655
+ filterJaql() {
656
+ return this.jaqlExpression;
657
+ }
658
+ }
659
+ exports.CustomFilter = CustomFilter;
576
660
  /**
577
661
  * @param json - Filter JSON representation
578
662
  * @internal
@@ -206,6 +206,22 @@ describe('Filters jaql preparations', () => {
206
206
  const jaql = filter.jaql();
207
207
  expect(jaql).toStrictEqual(result);
208
208
  });
209
+ it('must prepare members filter jaql with inner background filter', () => {
210
+ const result = {
211
+ jaql: {
212
+ title: 'CommerceGender',
213
+ dim: '[Commerce.Gender]',
214
+ datatype: 'text',
215
+ filter: { and: [{ members: ['Female'] }, { members: ['Female', 'Male'] }] },
216
+ },
217
+ };
218
+ const attribute = new attributes_js_1.DimensionalAttribute('[Commerce.Gender]', '[Commerce.Gender]');
219
+ const backgroundFilter = new filters_js_1.MembersFilter(attribute, ['Female', 'Male']);
220
+ const filter = new filters_js_1.MembersFilter(attribute, ['Female'], undefined, undefined, backgroundFilter);
221
+ expect(filter.backgroundFilter).toBe(backgroundFilter);
222
+ const jaql = filter.jaql();
223
+ expect(jaql).toStrictEqual(result);
224
+ });
209
225
  });
210
226
  describe('Disabled Filter', () => {
211
227
  it('must prepare empty jaql for attribute filter', () => {
@@ -108,7 +108,7 @@ exports.getSelectedConditionOption = getSelectedConditionOption;
108
108
  * @returns attribute filter
109
109
  */
110
110
  const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, guid) => {
111
- var _a, _b;
111
+ var _a, _b, _c;
112
112
  const conditionType = (0, exports.getSelectedConditionOption)(conditionFilterJaql);
113
113
  switch (conditionType) {
114
114
  case types_js_1.ConditionFilterType.BOTTOM:
@@ -146,7 +146,7 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
146
146
  case types_js_1.ConditionFilterType.BETWEEN:
147
147
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.between)(attribute, conditionFilterJaql.from, conditionFilterJaql.to, guid);
148
148
  case types_js_1.ConditionFilterType.IS_NOT_BETWEEN:
149
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.withComposeCode)(filterFactory.between)(attribute, (_a = conditionFilterJaql.exclude) === null || _a === void 0 ? void 0 : _a.from, (_b = conditionFilterJaql.exclude) === null || _b === void 0 ? void 0 : _b.to, guid));
149
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.withComposeCode)(filterFactory.between)(attribute, (_a = conditionFilterJaql.exclude) === null || _a === void 0 ? void 0 : _a.from, (_b = conditionFilterJaql.exclude) === null || _b === void 0 ? void 0 : _b.to, guid), undefined, guid);
150
150
  case types_js_1.ConditionFilterType.MULTIPLE_CONDITION:
151
151
  if (conditionFilterJaql.and) {
152
152
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.intersection)(conditionFilterJaql.and.map((c) => (0, exports.createAttributeFilterFromConditionFilterJaql)(attribute, c, guid)), guid);
@@ -155,6 +155,8 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
155
155
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.union)(conditionFilterJaql.or.map((c) => (0, exports.createAttributeFilterFromConditionFilterJaql)(attribute, c, guid)), guid);
156
156
  }
157
157
  break;
158
+ case types_js_1.ConditionFilterType.IS_NOT:
159
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, ((_c = conditionFilterJaql.exclude) === null || _c === void 0 ? void 0 : _c.members) || [], undefined, guid), undefined, guid);
158
160
  case types_js_1.ConditionFilterType.AFTER:
159
161
  case types_js_1.ConditionFilterType.BEFORE:
160
162
  case types_js_1.ConditionFilterType.IS_EMPTY:
@@ -44,7 +44,11 @@ exports.stringifyHelper = stringifyHelper;
44
44
  */
45
45
  function withComposeCode(func) {
46
46
  return function (...args) {
47
- const argValues = args.map(stringifyHelper).join(', ').replace(/, $/, '');
47
+ const argValues = args
48
+ .map(stringifyHelper)
49
+ .join(', ')
50
+ // remove any number of trailing commas
51
+ .replace(/(,\s*)+$/, '');
48
52
  const signature = `filterFactory.${func.name}(${argValues})`;
49
53
  const filter = func(...args);
50
54
  filter.composeCode = signature;
@@ -1,4 +1,4 @@
1
- import { ConditionFilterJaql, FilterJaqlInternal, PeriodFilterJaql, RangeFilterJaql, SpecificItemsFilterJaql } from './types.js';
1
+ import { BaseFilterJaql, ConditionFilterJaql, FilterJaqlInternal, PeriodFilterJaql, RangeFilterJaql, SpecificItemsFilterJaql } from './types.js';
2
2
  import { Attribute, BaseMeasure, Filter, LevelAttribute } from '../../interfaces.js';
3
3
  import { FilterJaql } from '../../types.js';
4
4
  /**
@@ -63,6 +63,15 @@ export declare const createFilterFromPeriodFilterJaql: (attribute: LevelAttribut
63
63
  * @returns Filter object
64
64
  */
65
65
  export declare const createFilterFromConditionFilterJaql: (attribute: Attribute, conditionFilterJaql: ConditionFilterJaql, measure?: BaseMeasure, guid?: string) => Filter;
66
+ /**
67
+ * Creates a filter from a custom filter JAQL object.
68
+ *
69
+ * @param attribute - attribute
70
+ * @param customFilterJaql - Custom Filter Jaql
71
+ * @param guid - Optional GUID for the filter
72
+ * @returns Filter object
73
+ */
74
+ export declare const createFilterFromCustomFilterJaql: (attribute: Attribute, customFilterJaql: BaseFilterJaql, guid?: string) => Filter;
66
75
  /**
67
76
  * Creates a filter from a filter JAQL object.
68
77
  *
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.createFilterFromJaqlInternal = exports.createFilterFromConditionFilterJaql = exports.createFilterFromPeriodFilterJaql = exports.createFilterFromNumericRangeJaql = exports.createFilterFromDateRangeFilterJaql = exports.createFilterFromSpecificItemsFilterJaql = exports.createFilterIncludeAll = exports.createGenericFilter = void 0;
26
+ exports.createFilterFromJaqlInternal = exports.createFilterFromCustomFilterJaql = exports.createFilterFromConditionFilterJaql = exports.createFilterFromPeriodFilterJaql = exports.createFilterFromNumericRangeJaql = exports.createFilterFromDateRangeFilterJaql = exports.createFilterFromSpecificItemsFilterJaql = exports.createFilterIncludeAll = exports.createGenericFilter = void 0;
27
27
  const types_js_1 = require("./types.js");
28
28
  const filterFactory = __importStar(require("../factory.js"));
29
29
  const condition_filter_util_js_1 = require("./condition-filter-util.js");
@@ -71,7 +71,7 @@ exports.createGenericFilter = createGenericFilter;
71
71
  * @returns The created Filter object.
72
72
  */
73
73
  const createFilterIncludeAll = (attribute, guid) => {
74
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, [], guid);
74
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, [], [], guid);
75
75
  };
76
76
  exports.createFilterIncludeAll = createFilterIncludeAll;
77
77
  /**
@@ -83,9 +83,21 @@ exports.createFilterIncludeAll = createFilterIncludeAll;
83
83
  * @returns Filter object
84
84
  */
85
85
  const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid) => {
86
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, specificItemsFilterJaql.members, guid);
86
+ const deactivatedMembers = getDeactivatedMembersFromFilterJaql(specificItemsFilterJaql);
87
+ const activeMembers = getActiveMembersFromFilterJaql(specificItemsFilterJaql, deactivatedMembers);
88
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, activeMembers, deactivatedMembers, guid);
87
89
  };
88
90
  exports.createFilterFromSpecificItemsFilterJaql = createFilterFromSpecificItemsFilterJaql;
91
+ function getDeactivatedMembersFromFilterJaql(filterJaql) {
92
+ var _a, _b, _c;
93
+ return ((_a = filterJaql.filter) === null || _a === void 0 ? void 0 : _a.turnedOff) ? (_c = (_b = filterJaql.filter) === null || _b === void 0 ? void 0 : _b.exclude) === null || _c === void 0 ? void 0 : _c.members : undefined;
94
+ }
95
+ function getActiveMembersFromFilterJaql(filterJaql, deactivatedMembers) {
96
+ const allMembers = filterJaql.members;
97
+ return deactivatedMembers
98
+ ? allMembers.filter((member) => !deactivatedMembers.includes(member))
99
+ : allMembers;
100
+ }
89
101
  /**
90
102
  * Creates a filter from a date range filter JAQL object.
91
103
  *
@@ -145,6 +157,18 @@ const createFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, mea
145
157
  }
146
158
  };
147
159
  exports.createFilterFromConditionFilterJaql = createFilterFromConditionFilterJaql;
160
+ /**
161
+ * Creates a filter from a custom filter JAQL object.
162
+ *
163
+ * @param attribute - attribute
164
+ * @param customFilterJaql - Custom Filter Jaql
165
+ * @param guid - Optional GUID for the filter
166
+ * @returns Filter object
167
+ */
168
+ const createFilterFromCustomFilterJaql = (attribute, customFilterJaql, guid) => {
169
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.customFilter)(attribute, customFilterJaql, guid);
170
+ };
171
+ exports.createFilterFromCustomFilterJaql = createFilterFromCustomFilterJaql;
148
172
  /**
149
173
  * Creates a filter from a filter JAQL object.
150
174
  *
@@ -177,6 +201,7 @@ const createFilterFromJaqlInternal = (jaql, guid) => {
177
201
  case types_js_1.FILTER_TYPES.NUMERIC_RANGE:
178
202
  return (0, exports.createFilterFromNumericRangeJaql)(attribute, filterJaqlWithType, guid);
179
203
  case types_js_1.FILTER_TYPES.ADVANCED:
204
+ return (0, exports.createFilterFromCustomFilterJaql)(attribute, filterJaqlWithType, guid);
180
205
  case types_js_1.FILTER_TYPES.INVALID:
181
206
  return (0, exports.createGenericFilter)(jaql, guid);
182
207
  }