@sisense/sdk-data 1.12.0 → 1.13.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 (25) hide show
  1. package/dist/cjs/dimensional-model/analytics/factory.js +6 -4
  2. package/dist/cjs/dimensional-model/filters/factory.d.ts +3 -2
  3. package/dist/cjs/dimensional-model/filters/factory.js +5 -5
  4. package/dist/cjs/dimensional-model/filters/factory.test.js +1 -1
  5. package/dist/cjs/dimensional-model/filters/filters.d.ts +25 -2
  6. package/dist/cjs/dimensional-model/filters/filters.js +51 -2
  7. package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.js +4 -2
  8. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.js +5 -1
  9. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
  10. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.js +28 -3
  11. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.test.js +80 -15
  12. package/dist/cjs/dimensional-model/filters/utils/filter-types-util.js +3 -3
  13. package/dist/cjs/dimensional-model/filters/utils/types.d.ts +6 -0
  14. package/dist/dimensional-model/analytics/factory.js +6 -4
  15. package/dist/dimensional-model/filters/factory.d.ts +3 -2
  16. package/dist/dimensional-model/filters/factory.js +6 -6
  17. package/dist/dimensional-model/filters/filters.d.ts +25 -2
  18. package/dist/dimensional-model/filters/filters.js +49 -1
  19. package/dist/dimensional-model/filters/utils/condition-filter-util.js +4 -2
  20. package/dist/dimensional-model/filters/utils/filter-code-util.js +5 -1
  21. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
  22. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +26 -2
  23. package/dist/dimensional-model/filters/utils/filter-types-util.js +3 -3
  24. package/dist/dimensional-model/filters/utils/types.d.ts +6 -0
  25. 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
  };
@@ -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): 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) {
453
+ return new filters_js_1.MembersFilter(attribute, members, _deactivatedMembers, guid);
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,14 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
93
94
  * Global filter identifier
94
95
  */
95
96
  readonly guid: string;
97
+ private _disabled;
96
98
  /**
97
99
  * Boolean flag whether the filter is disabled
98
100
  *
99
101
  * @internal
100
102
  */
101
- disabled: boolean;
103
+ get disabled(): boolean;
104
+ set disabled(value: boolean);
102
105
  constructor(att: Attribute, filterType: string, guid?: string);
103
106
  get name(): string;
104
107
  /**
@@ -151,7 +154,9 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
151
154
  */
152
155
  export declare class MembersFilter extends AbstractFilter {
153
156
  readonly members: any[];
154
- constructor(attribute: Attribute, members?: any[], guid?: string);
157
+ /** @internal */
158
+ _deactivatedMembers: any[];
159
+ constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string);
155
160
  /**
156
161
  * gets the element's ID
157
162
  */
@@ -175,6 +180,8 @@ export declare class CascadingFilter extends AbstractFilter {
175
180
  * gets the element's ID
176
181
  */
177
182
  get id(): string;
183
+ get disabled(): boolean;
184
+ set disabled(value: boolean);
178
185
  /**
179
186
  * Gets a serializable representation of the element
180
187
  */
@@ -313,6 +320,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
313
320
  */
314
321
  filterJaql(): any;
315
322
  }
323
+ /**
324
+ * @internal
325
+ */
326
+ export declare class CustomFilter extends AbstractFilter {
327
+ readonly jaqlExpression: any;
328
+ constructor(att: Attribute, jaql: any, guid?: string);
329
+ /**
330
+ * gets the element's ID
331
+ */
332
+ get id(): string;
333
+ /**
334
+ * Gets JAQL representing this Filter instance
335
+ *
336
+ */
337
+ filterJaql(): any;
338
+ }
316
339
  /**
317
340
  * @param json - Filter JSON representation
318
341
  * @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
  /**
@@ -108,6 +109,17 @@ class AbstractFilter extends base_js_1.DimensionalElement {
108
109
  this.guid = guid || (0, utils_js_1.guidFast)(13);
109
110
  this.disabled = false;
110
111
  }
112
+ /**
113
+ * Boolean flag whether the filter is disabled
114
+ *
115
+ * @internal
116
+ */
117
+ get disabled() {
118
+ return this._disabled;
119
+ }
120
+ set disabled(value) {
121
+ this._disabled = value;
122
+ }
111
123
  get name() {
112
124
  return (0, object_hash_1.default)(this.jaql());
113
125
  }
@@ -195,9 +207,10 @@ exports.LogicalAttributeFilter = LogicalAttributeFilter;
195
207
  * @internal
196
208
  */
197
209
  class MembersFilter extends AbstractFilter {
198
- constructor(attribute, members, guid) {
210
+ constructor(attribute, members, _deactivatedMembers, guid) {
199
211
  super(attribute, exports.FilterTypes.members, guid);
200
212
  this.members = members !== null && members !== void 0 ? members : [];
213
+ this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
201
214
  if (this.members.filter((m) => m === null || m === undefined).length > 0) {
202
215
  throw new translatable_error_js_1.TranslatableError('errors.filter.membersFilterNullMember', {
203
216
  attributeId: attribute.id,
@@ -242,6 +255,17 @@ class CascadingFilter extends AbstractFilter {
242
255
  get id() {
243
256
  return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
244
257
  }
258
+ get disabled() {
259
+ return super.disabled;
260
+ }
261
+ set disabled(value) {
262
+ super.disabled = value;
263
+ if (this.filters) {
264
+ this.filters.forEach((filter) => {
265
+ filter.disabled = value;
266
+ });
267
+ }
268
+ }
245
269
  /**
246
270
  * Gets a serializable representation of the element
247
271
  */
@@ -573,6 +597,31 @@ class RelativeDateFilter extends AbstractFilter {
573
597
  }
574
598
  }
575
599
  exports.RelativeDateFilter = RelativeDateFilter;
600
+ /**
601
+ * @internal
602
+ */
603
+ class CustomFilter extends AbstractFilter {
604
+ constructor(att, jaql, guid) {
605
+ super(att, exports.FilterTypes.advanced, guid);
606
+ // remove filterType from jaql as it is not needed
607
+ delete jaql.filterType;
608
+ this.jaqlExpression = jaql;
609
+ }
610
+ /**
611
+ * gets the element's ID
612
+ */
613
+ get id() {
614
+ return `custom_${this.attribute.id}_${this.guid}`;
615
+ }
616
+ /**
617
+ * Gets JAQL representing this Filter instance
618
+ *
619
+ */
620
+ filterJaql() {
621
+ return this.jaqlExpression;
622
+ }
623
+ }
624
+ exports.CustomFilter = CustomFilter;
576
625
  /**
577
626
  * @param json - Filter JSON representation
578
627
  * @internal
@@ -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
  }
@@ -31,6 +31,8 @@ const filterFactory = __importStar(require("../factory.js"));
31
31
  const types_js_1 = require("./types.js");
32
32
  const attribute_measure_util_js_1 = require("./attribute-measure-util.js");
33
33
  const condition_filter_util_js_1 = require("./condition-filter-util.js");
34
+ const filter_from_jaql_util_js_2 = require("./filter-from-jaql-util.js");
35
+ const filter_code_util_js_1 = require("./filter-code-util.js");
34
36
  (0, vitest_1.describe)('filter-from-jaql-util', () => {
35
37
  (0, vitest_1.describe)('createFilterFromJaqlInternal', () => {
36
38
  const guid = 'instanceid';
@@ -56,7 +58,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
56
58
  };
57
59
  const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
58
60
  const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
59
- const expectedFilter = filterFactory.members(attribute, [], guid);
61
+ const expectedFilter = filterFactory.members(attribute, [], [], guid);
60
62
  expectEqualFilters(filter, expectedFilter);
61
63
  });
62
64
  it('should handle members text', () => {
@@ -74,7 +76,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
74
76
  };
75
77
  const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
76
78
  const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
77
- const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
79
+ const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
78
80
  expectEqualFilters(filter, expectedFilter);
79
81
  });
80
82
  test('should handle members datetime', () => {
@@ -116,7 +118,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
116
118
  ].forEach((jaql) => {
117
119
  const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
118
120
  const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
119
- const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
121
+ const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
120
122
  expectEqualFilters(filter, expectedFilter);
121
123
  });
122
124
  });
@@ -134,7 +136,39 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
134
136
  };
135
137
  const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
136
138
  const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
137
- const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
139
+ const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
140
+ expectEqualFilters(filter, expectedFilter);
141
+ });
142
+ it('should handle deactivated members', () => {
143
+ const jaql = {
144
+ datasource: {
145
+ title: 'Sample ECommerce',
146
+ fullname: 'LocalHost/Sample ECommerce',
147
+ id: 'localhost_aSampleIAAaECommerce',
148
+ address: 'LocalHost',
149
+ database: 'aSampleIAAaECommerce',
150
+ },
151
+ column: 'Country',
152
+ dim: '[country.Country]',
153
+ datatype: 'text',
154
+ title: 'COUNTRY',
155
+ collapsed: true,
156
+ isDashboardFilter: true,
157
+ filter: {
158
+ explicit: true,
159
+ multiSelection: true,
160
+ members: ['Albania', 'Algeria', 'Angola'],
161
+ filter: {
162
+ turnedOff: true,
163
+ exclude: {
164
+ members: ['Angola'],
165
+ },
166
+ },
167
+ },
168
+ };
169
+ const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
170
+ const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
171
+ const expectedFilter = filterFactory.members(attribute, ['Albania', 'Algeria'], ['Angola'], guid);
138
172
  expectEqualFilters(filter, expectedFilter);
139
173
  });
140
174
  });
@@ -475,19 +509,50 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
475
509
  });
476
510
  });
477
511
  });
512
+ (0, vitest_1.describe)('ExcludeFilter', () => {
513
+ it('should handle exclude members', () => {
514
+ const jaql = {
515
+ table: 'Country',
516
+ column: 'Country',
517
+ datatype: 'text',
518
+ title: 'exclude Turkey from Country',
519
+ dim: '[Country.Country]',
520
+ filter: {
521
+ exclude: {
522
+ members: ['Turkey'],
523
+ },
524
+ },
525
+ };
526
+ const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
527
+ const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
528
+ const expectedFilter = filterFactory.exclude((0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, jaql.filter.exclude.members, undefined, guid), undefined, guid);
529
+ expectEqualFilters(filter, expectedFilter);
530
+ });
531
+ });
532
+ (0, vitest_1.describe)('Advanced filter (pass-through JAQL)', () => {
533
+ test('should handle', () => {
534
+ const jaql = {
535
+ table: 'Commerce',
536
+ column: 'Revenue',
537
+ datatype: 'numeric',
538
+ title: 'sum Revenue',
539
+ filter: {
540
+ custom: true,
541
+ isAdvanced: true,
542
+ },
543
+ };
544
+ const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
545
+ const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
546
+ const expectedFilter = filterFactory.customFilter(attribute, jaql.filter, guid);
547
+ expect(filter.jaql()).toEqual(expectedFilter.jaql());
548
+ expect(filter.jaql(true)).toEqual(expectedFilter.jaql(true));
549
+ expect(filter.serializable()).toBeDefined();
550
+ expect(filter.toJSON()).toBeDefined();
551
+ });
552
+ });
478
553
  (0, vitest_1.describe)('Generic filter (pass-through JAQL)', () => {
479
554
  test('should fall back to generic filter (pass-through JAQL)', () => {
480
555
  [
481
- // ADVANCED FILTER TYPE
482
- {
483
- table: 'Commerce',
484
- column: 'Revenue',
485
- datatype: 'numeric',
486
- title: 'sum Revenue',
487
- filter: {
488
- isAdvanced: true,
489
- },
490
- },
491
556
  // SIMULATE INVALID FILTER TYPE
492
557
  {
493
558
  table: 'Commerce',
@@ -546,7 +611,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
546
611
  ].forEach((item) => {
547
612
  const jaql = item;
548
613
  const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
549
- const expectedFilter = filterFactory.customFilter(jaql, guid);
614
+ const expectedFilter = (0, filter_from_jaql_util_js_2.createGenericFilter)(jaql, guid);
550
615
  expect(filter.jaql()).toEqual(expectedFilter.jaql());
551
616
  expect(filter.jaql(true)).toEqual(expectedFilter.jaql(true));
552
617
  expect(filter.serializable()).toBeDefined();
@@ -35,6 +35,8 @@ const isInvalidFilter = (filter) => filter.filterType === types_js_1.FILTER_TYPE
35
35
  const getFilterType = (filter, dataType = types_js_1.FilterModalType.DATE_TIME, timeData) => {
36
36
  if (timeData && isTimeLevelNotSupported(timeData))
37
37
  return types_js_1.FILTER_TYPES.ADVANCED;
38
+ if (isAdvancedFilter(filter))
39
+ return types_js_1.FILTER_TYPES.ADVANCED;
38
40
  if (isIncludeAllFilter(filter))
39
41
  return types_js_1.FILTER_TYPES.INCLUDE_ALL;
40
42
  if (isPeriodFilter(filter))
@@ -47,11 +49,9 @@ const getFilterType = (filter, dataType = types_js_1.FilterModalType.DATE_TIME,
47
49
  return types_js_1.FILTER_TYPES.NUMERIC_RANGE;
48
50
  if ((0, exports.isConditionFilter)(filter))
49
51
  return types_js_1.FILTER_TYPES.CONDITION;
50
- if (isAdvancedFilter(filter))
51
- return types_js_1.FILTER_TYPES.ADVANCED;
52
52
  if (isInvalidFilter(filter))
53
53
  return types_js_1.FILTER_TYPES.INVALID;
54
- return types_js_1.FILTER_TYPES.ADVANCED;
54
+ return types_js_1.FILTER_TYPES.INVALID;
55
55
  };
56
56
  exports.getFilterType = getFilterType;
57
57
  /**
@@ -70,6 +70,12 @@ export declare type FilterMultiSelectJaql = {
70
70
  multiSelection: boolean;
71
71
  members: string[];
72
72
  isCondition?: boolean;
73
+ filter?: {
74
+ turnedOff?: boolean;
75
+ exclude?: {
76
+ members?: string[];
77
+ };
78
+ };
73
79
  };
74
80
  export declare type FilterMultipleConditionJaql = {
75
81
  or: ConditionFilterJaql[];
@@ -96,8 +96,8 @@ export const boxWhiskerIqrOutliers = (target) => {
96
96
  Attr: target,
97
97
  });
98
98
  outliersAttrWithInnerFilter.name = `${outliersAttrWithInnerFilter.name} (Outliers)`;
99
- outliersAttrWithInnerFilter.jaql = () => {
100
- return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
99
+ outliersAttrWithInnerFilter.jaql = (nested) => {
100
+ const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
101
101
  or: [
102
102
  {
103
103
  fromNotEqual: outliersMax.jaql(true),
@@ -107,6 +107,7 @@ export const boxWhiskerIqrOutliers = (target) => {
107
107
  },
108
108
  ],
109
109
  } });
110
+ return nested ? jaql : { jaql };
110
111
  };
111
112
  return outliersAttrWithInnerFilter;
112
113
  };
@@ -124,8 +125,8 @@ export const boxWhiskerStdDevOutliers = (target) => {
124
125
  const outliersMin = customFormula(BOX_WHISKER.OUTLIER_MIN_VALUE_NAME, '(LOWERWHISKERMAX_STDEVP([Attr]), all([Attr]))', {
125
126
  Attr: target,
126
127
  });
127
- outliersAttrWithInnerFilter.jaql = () => {
128
- return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
128
+ outliersAttrWithInnerFilter.jaql = (nested) => {
129
+ const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
129
130
  or: [
130
131
  {
131
132
  fromNotEqual: outliersMax.jaql(true),
@@ -135,6 +136,7 @@ export const boxWhiskerStdDevOutliers = (target) => {
135
136
  },
136
137
  ],
137
138
  } });
139
+ return nested ? jaql : { jaql };
138
140
  };
139
141
  return outliersAttrWithInnerFilter;
140
142
  };
@@ -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): 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;
@@ -1,5 +1,4 @@
1
- import { TextOperators, NumericOperators, DateOperators, LogicalOperators, RankingOperators, LogicalAttributeFilter, MembersFilter, ExcludeFilter, NumericFilter, MeasureFilter, RankingFilter, TextFilter, DateRangeFilter, RelativeDateFilter, } from './filters.js';
2
- import { createGenericFilter } from './utils/filter-from-jaql-util.js';
1
+ import { TextOperators, NumericOperators, DateOperators, LogicalOperators, RankingOperators, LogicalAttributeFilter, MembersFilter, ExcludeFilter, NumericFilter, MeasureFilter, RankingFilter, TextFilter, DateRangeFilter, RelativeDateFilter, CustomFilter, } from './filters.js';
3
2
  // LOGICAL FILTERS
4
3
  /**
5
4
  * Creates a filter representing the union of multiple filters on the same attribute. The resulting
@@ -424,11 +423,12 @@ export function numeric(attribute, operatorA, valueA, operatorB, valueB, guid) {
424
423
  * ```
425
424
  * @param attribute - Attribute to filter on
426
425
  * @param members - Array of member values to filter by
426
+ * @param _deactivatedMembers - [internal] Array of deactivated member values
427
427
  * @param guid - Optional GUID for the filter
428
428
  * @returns A filter instance
429
429
  */
430
- export function members(attribute, members, guid) {
431
- return new MembersFilter(attribute, members, guid);
430
+ export function members(attribute, members, _deactivatedMembers, guid) {
431
+ return new MembersFilter(attribute, members, _deactivatedMembers, guid);
432
432
  }
433
433
  // DATE FILTERS
434
434
  /**
@@ -913,6 +913,6 @@ export var logic;
913
913
  * @returns A filter instance
914
914
  * @internal
915
915
  */
916
- export function customFilter(jaql, guid) {
917
- return createGenericFilter(jaql, guid);
916
+ export function customFilter(attribute, jaql, guid) {
917
+ return new CustomFilter(attribute, jaql, guid);
918
918
  }
@@ -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,14 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
93
94
  * Global filter identifier
94
95
  */
95
96
  readonly guid: string;
97
+ private _disabled;
96
98
  /**
97
99
  * Boolean flag whether the filter is disabled
98
100
  *
99
101
  * @internal
100
102
  */
101
- disabled: boolean;
103
+ get disabled(): boolean;
104
+ set disabled(value: boolean);
102
105
  constructor(att: Attribute, filterType: string, guid?: string);
103
106
  get name(): string;
104
107
  /**
@@ -151,7 +154,9 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
151
154
  */
152
155
  export declare class MembersFilter extends AbstractFilter {
153
156
  readonly members: any[];
154
- constructor(attribute: Attribute, members?: any[], guid?: string);
157
+ /** @internal */
158
+ _deactivatedMembers: any[];
159
+ constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string);
155
160
  /**
156
161
  * gets the element's ID
157
162
  */
@@ -175,6 +180,8 @@ export declare class CascadingFilter extends AbstractFilter {
175
180
  * gets the element's ID
176
181
  */
177
182
  get id(): string;
183
+ get disabled(): boolean;
184
+ set disabled(value: boolean);
178
185
  /**
179
186
  * Gets a serializable representation of the element
180
187
  */
@@ -313,6 +320,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
313
320
  */
314
321
  filterJaql(): any;
315
322
  }
323
+ /**
324
+ * @internal
325
+ */
326
+ export declare class CustomFilter extends AbstractFilter {
327
+ readonly jaqlExpression: any;
328
+ constructor(att: Attribute, jaql: any, guid?: string);
329
+ /**
330
+ * gets the element's ID
331
+ */
332
+ get id(): string;
333
+ /**
334
+ * Gets JAQL representing this Filter instance
335
+ *
336
+ */
337
+ filterJaql(): any;
338
+ }
316
339
  /**
317
340
  * @param json - Filter JSON representation
318
341
  * @internal
@@ -86,6 +86,7 @@ export const FilterTypes = {
86
86
  date: 'date',
87
87
  relativeDate: 'relativeDate',
88
88
  cascading: 'cascading',
89
+ advanced: 'advanced',
89
90
  };
90
91
  // CLASSES
91
92
  /**
@@ -102,6 +103,17 @@ class AbstractFilter extends DimensionalElement {
102
103
  this.guid = guid || guidFast(13);
103
104
  this.disabled = false;
104
105
  }
106
+ /**
107
+ * Boolean flag whether the filter is disabled
108
+ *
109
+ * @internal
110
+ */
111
+ get disabled() {
112
+ return this._disabled;
113
+ }
114
+ set disabled(value) {
115
+ this._disabled = value;
116
+ }
105
117
  get name() {
106
118
  return hash(this.jaql());
107
119
  }
@@ -188,9 +200,10 @@ export class LogicalAttributeFilter extends AbstractFilter {
188
200
  * @internal
189
201
  */
190
202
  export class MembersFilter extends AbstractFilter {
191
- constructor(attribute, members, guid) {
203
+ constructor(attribute, members, _deactivatedMembers, guid) {
192
204
  super(attribute, FilterTypes.members, guid);
193
205
  this.members = members !== null && members !== void 0 ? members : [];
206
+ this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
194
207
  if (this.members.filter((m) => m === null || m === undefined).length > 0) {
195
208
  throw new TranslatableError('errors.filter.membersFilterNullMember', {
196
209
  attributeId: attribute.id,
@@ -234,6 +247,17 @@ export class CascadingFilter extends AbstractFilter {
234
247
  get id() {
235
248
  return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
236
249
  }
250
+ get disabled() {
251
+ return super.disabled;
252
+ }
253
+ set disabled(value) {
254
+ super.disabled = value;
255
+ if (this.filters) {
256
+ this.filters.forEach((filter) => {
257
+ filter.disabled = value;
258
+ });
259
+ }
260
+ }
237
261
  /**
238
262
  * Gets a serializable representation of the element
239
263
  */
@@ -556,6 +580,30 @@ export class RelativeDateFilter extends AbstractFilter {
556
580
  return result;
557
581
  }
558
582
  }
583
+ /**
584
+ * @internal
585
+ */
586
+ export class CustomFilter extends AbstractFilter {
587
+ constructor(att, jaql, guid) {
588
+ super(att, FilterTypes.advanced, guid);
589
+ // remove filterType from jaql as it is not needed
590
+ delete jaql.filterType;
591
+ this.jaqlExpression = jaql;
592
+ }
593
+ /**
594
+ * gets the element's ID
595
+ */
596
+ get id() {
597
+ return `custom_${this.attribute.id}_${this.guid}`;
598
+ }
599
+ /**
600
+ * Gets JAQL representing this Filter instance
601
+ *
602
+ */
603
+ filterJaql() {
604
+ return this.jaqlExpression;
605
+ }
606
+ }
559
607
  /**
560
608
  * @param json - Filter JSON representation
561
609
  * @internal
@@ -81,7 +81,7 @@ export const getSelectedConditionOption = (filter) => {
81
81
  * @returns attribute filter
82
82
  */
83
83
  export const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, guid) => {
84
- var _a, _b;
84
+ var _a, _b, _c;
85
85
  const conditionType = getSelectedConditionOption(conditionFilterJaql);
86
86
  switch (conditionType) {
87
87
  case ConditionFilterType.BOTTOM:
@@ -119,7 +119,7 @@ export const createAttributeFilterFromConditionFilterJaql = (attribute, conditio
119
119
  case ConditionFilterType.BETWEEN:
120
120
  return withComposeCode(filterFactory.between)(attribute, conditionFilterJaql.from, conditionFilterJaql.to, guid);
121
121
  case ConditionFilterType.IS_NOT_BETWEEN:
122
- return withComposeCode(filterFactory.exclude)(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));
122
+ return withComposeCode(filterFactory.exclude)(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);
123
123
  case ConditionFilterType.MULTIPLE_CONDITION:
124
124
  if (conditionFilterJaql.and) {
125
125
  return withComposeCode(filterFactory.intersection)(conditionFilterJaql.and.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c, guid)), guid);
@@ -128,6 +128,8 @@ export const createAttributeFilterFromConditionFilterJaql = (attribute, conditio
128
128
  return withComposeCode(filterFactory.union)(conditionFilterJaql.or.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c, guid)), guid);
129
129
  }
130
130
  break;
131
+ case ConditionFilterType.IS_NOT:
132
+ return withComposeCode(filterFactory.exclude)(withComposeCode(filterFactory.members)(attribute, ((_c = conditionFilterJaql.exclude) === null || _c === void 0 ? void 0 : _c.members) || [], undefined, guid), undefined, guid);
131
133
  case ConditionFilterType.AFTER:
132
134
  case ConditionFilterType.BEFORE:
133
135
  case ConditionFilterType.IS_EMPTY:
@@ -40,7 +40,11 @@ export function stringifyHelper(arg) {
40
40
  */
41
41
  export function withComposeCode(func) {
42
42
  return function (...args) {
43
- const argValues = args.map(stringifyHelper).join(', ').replace(/, $/, '');
43
+ const argValues = args
44
+ .map(stringifyHelper)
45
+ .join(', ')
46
+ // remove any number of trailing commas
47
+ .replace(/(,\s*)+$/, '');
44
48
  const signature = `filterFactory.${func.name}(${argValues})`;
45
49
  const filter = func(...args);
46
50
  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
  *
@@ -44,7 +44,7 @@ export const createGenericFilter = (jaql, guid) => {
44
44
  * @returns The created Filter object.
45
45
  */
46
46
  export const createFilterIncludeAll = (attribute, guid) => {
47
- return withComposeCode(filterFactory.members)(attribute, [], guid);
47
+ return withComposeCode(filterFactory.members)(attribute, [], [], guid);
48
48
  };
49
49
  /**
50
50
  * Creates a filter from a specific items filter JAQL object.
@@ -55,8 +55,20 @@ export const createFilterIncludeAll = (attribute, guid) => {
55
55
  * @returns Filter object
56
56
  */
57
57
  export const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid) => {
58
- return withComposeCode(filterFactory.members)(attribute, specificItemsFilterJaql.members, guid);
58
+ const deactivatedMembers = getDeactivatedMembersFromFilterJaql(specificItemsFilterJaql);
59
+ const activeMembers = getActiveMembersFromFilterJaql(specificItemsFilterJaql, deactivatedMembers);
60
+ return withComposeCode(filterFactory.members)(attribute, activeMembers, deactivatedMembers, guid);
59
61
  };
62
+ function getDeactivatedMembersFromFilterJaql(filterJaql) {
63
+ var _a, _b, _c;
64
+ 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;
65
+ }
66
+ function getActiveMembersFromFilterJaql(filterJaql, deactivatedMembers) {
67
+ const allMembers = filterJaql.members;
68
+ return deactivatedMembers
69
+ ? allMembers.filter((member) => !deactivatedMembers.includes(member))
70
+ : allMembers;
71
+ }
60
72
  /**
61
73
  * Creates a filter from a date range filter JAQL object.
62
74
  *
@@ -112,6 +124,17 @@ export const createFilterFromConditionFilterJaql = (attribute, conditionFilterJa
112
124
  return createAttributeFilterFromConditionFilterJaql(attribute, conditionFilterJaql, guid);
113
125
  }
114
126
  };
127
+ /**
128
+ * Creates a filter from a custom filter JAQL object.
129
+ *
130
+ * @param attribute - attribute
131
+ * @param customFilterJaql - Custom Filter Jaql
132
+ * @param guid - Optional GUID for the filter
133
+ * @returns Filter object
134
+ */
135
+ export const createFilterFromCustomFilterJaql = (attribute, customFilterJaql, guid) => {
136
+ return withComposeCode(filterFactory.customFilter)(attribute, customFilterJaql, guid);
137
+ };
115
138
  /**
116
139
  * Creates a filter from a filter JAQL object.
117
140
  *
@@ -144,6 +167,7 @@ export const createFilterFromJaqlInternal = (jaql, guid) => {
144
167
  case FILTER_TYPES.NUMERIC_RANGE:
145
168
  return createFilterFromNumericRangeJaql(attribute, filterJaqlWithType, guid);
146
169
  case FILTER_TYPES.ADVANCED:
170
+ return createFilterFromCustomFilterJaql(attribute, filterJaqlWithType, guid);
147
171
  case FILTER_TYPES.INVALID:
148
172
  return createGenericFilter(jaql, guid);
149
173
  }
@@ -29,6 +29,8 @@ const isInvalidFilter = (filter) => filter.filterType === FILTER_TYPES.INVALID;
29
29
  export const getFilterType = (filter, dataType = FilterModalType.DATE_TIME, timeData) => {
30
30
  if (timeData && isTimeLevelNotSupported(timeData))
31
31
  return FILTER_TYPES.ADVANCED;
32
+ if (isAdvancedFilter(filter))
33
+ return FILTER_TYPES.ADVANCED;
32
34
  if (isIncludeAllFilter(filter))
33
35
  return FILTER_TYPES.INCLUDE_ALL;
34
36
  if (isPeriodFilter(filter))
@@ -41,11 +43,9 @@ export const getFilterType = (filter, dataType = FilterModalType.DATE_TIME, time
41
43
  return FILTER_TYPES.NUMERIC_RANGE;
42
44
  if (isConditionFilter(filter))
43
45
  return FILTER_TYPES.CONDITION;
44
- if (isAdvancedFilter(filter))
45
- return FILTER_TYPES.ADVANCED;
46
46
  if (isInvalidFilter(filter))
47
47
  return FILTER_TYPES.INVALID;
48
- return FILTER_TYPES.ADVANCED;
48
+ return FILTER_TYPES.INVALID;
49
49
  };
50
50
  /**
51
51
  * Extracts Filter Type from Filter Jaql
@@ -70,6 +70,12 @@ export declare type FilterMultiSelectJaql = {
70
70
  multiSelection: boolean;
71
71
  members: string[];
72
72
  isCondition?: boolean;
73
+ filter?: {
74
+ turnedOff?: boolean;
75
+ exclude?: {
76
+ members?: string[];
77
+ };
78
+ };
73
79
  };
74
80
  export declare type FilterMultipleConditionJaql = {
75
81
  or: ConditionFilterJaql[];
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "Sisense",
12
12
  "Compose SDK"
13
13
  ],
14
- "version": "1.12.0",
14
+ "version": "1.13.0",
15
15
  "type": "module",
16
16
  "main": "./dist/cjs/index.js",
17
17
  "module": "./dist/index.js",
@@ -32,8 +32,8 @@
32
32
  "author": "Sisense",
33
33
  "license": "SEE LICENSE IN LICENSE.md",
34
34
  "dependencies": {
35
- "@sisense/sdk-common": "^1.12.0",
36
- "@sisense/sdk-rest-client": "^1.12.0",
35
+ "@sisense/sdk-common": "^1.13.0",
36
+ "@sisense/sdk-rest-client": "^1.13.0",
37
37
  "guid-typescript": "^1.0.9",
38
38
  "lodash": "^4.17.21",
39
39
  "numeral": "^2.0.6",