@memberjunction/ng-filter-builder 4.1.0 → 4.3.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.
- package/dist/__tests__/filter-types.test.d.ts +2 -0
- package/dist/__tests__/filter-types.test.d.ts.map +1 -0
- package/dist/__tests__/filter-types.test.js +131 -0
- package/dist/__tests__/filter-types.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +7 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/operators.test.d.ts +2 -0
- package/dist/__tests__/operators.test.d.ts.map +1 -0
- package/dist/__tests__/operators.test.js +103 -0
- package/dist/__tests__/operators.test.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/filter-types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isCompositeFilter, isSimpleFilter, createEmptyFilter, createFilterRule, getDefaultOperator, getDefaultValue, EMPTY_FILTER } from '../lib/types/filter.types';
|
|
3
|
+
describe('isCompositeFilter', () => {
|
|
4
|
+
it('should return true for composite filters', () => {
|
|
5
|
+
const composite = {
|
|
6
|
+
logic: 'and',
|
|
7
|
+
filters: []
|
|
8
|
+
};
|
|
9
|
+
expect(isCompositeFilter(composite)).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it('should return false for simple filters', () => {
|
|
12
|
+
const simple = {
|
|
13
|
+
field: 'Name',
|
|
14
|
+
operator: 'eq',
|
|
15
|
+
value: 'test'
|
|
16
|
+
};
|
|
17
|
+
expect(isCompositeFilter(simple)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it('should return true for nested composite filters', () => {
|
|
20
|
+
const nested = {
|
|
21
|
+
logic: 'or',
|
|
22
|
+
filters: [
|
|
23
|
+
{ logic: 'and', filters: [] }
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
expect(isCompositeFilter(nested)).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('isSimpleFilter', () => {
|
|
30
|
+
it('should return true for simple filters', () => {
|
|
31
|
+
const simple = {
|
|
32
|
+
field: 'Status',
|
|
33
|
+
operator: 'contains',
|
|
34
|
+
value: 'active'
|
|
35
|
+
};
|
|
36
|
+
expect(isSimpleFilter(simple)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('should return false for composite filters', () => {
|
|
39
|
+
const composite = {
|
|
40
|
+
logic: 'and',
|
|
41
|
+
filters: []
|
|
42
|
+
};
|
|
43
|
+
expect(isSimpleFilter(composite)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('createEmptyFilter', () => {
|
|
47
|
+
it('should create a filter with and logic and empty filters array', () => {
|
|
48
|
+
const filter = createEmptyFilter();
|
|
49
|
+
expect(filter.logic).toBe('and');
|
|
50
|
+
expect(filter.filters).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
it('should create independent instances', () => {
|
|
53
|
+
const f1 = createEmptyFilter();
|
|
54
|
+
const f2 = createEmptyFilter();
|
|
55
|
+
f1.filters.push({ field: 'test', operator: 'eq', value: 1 });
|
|
56
|
+
expect(f2.filters).toHaveLength(0);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('EMPTY_FILTER', () => {
|
|
60
|
+
it('should have and logic and empty filters', () => {
|
|
61
|
+
expect(EMPTY_FILTER.logic).toBe('and');
|
|
62
|
+
expect(EMPTY_FILTER.filters).toEqual([]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('createFilterRule', () => {
|
|
66
|
+
it('should create a string filter rule by default', () => {
|
|
67
|
+
const rule = createFilterRule('Name');
|
|
68
|
+
expect(rule.field).toBe('Name');
|
|
69
|
+
expect(rule.operator).toBe('contains');
|
|
70
|
+
expect(rule.value).toBe('');
|
|
71
|
+
});
|
|
72
|
+
it('should create a number filter rule', () => {
|
|
73
|
+
const rule = createFilterRule('Age', 'number');
|
|
74
|
+
expect(rule.field).toBe('Age');
|
|
75
|
+
expect(rule.operator).toBe('eq');
|
|
76
|
+
expect(rule.value).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
it('should create a boolean filter rule', () => {
|
|
79
|
+
const rule = createFilterRule('IsActive', 'boolean');
|
|
80
|
+
expect(rule.operator).toBe('eq');
|
|
81
|
+
expect(rule.value).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it('should create a date filter rule', () => {
|
|
84
|
+
const rule = createFilterRule('CreatedAt', 'date');
|
|
85
|
+
expect(rule.operator).toBe('gte');
|
|
86
|
+
expect(rule.value).toBeNull();
|
|
87
|
+
});
|
|
88
|
+
it('should create a lookup filter rule', () => {
|
|
89
|
+
const rule = createFilterRule('CategoryID', 'lookup');
|
|
90
|
+
expect(rule.operator).toBe('eq');
|
|
91
|
+
expect(rule.value).toBeNull();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('getDefaultOperator', () => {
|
|
95
|
+
it('should return contains for string', () => {
|
|
96
|
+
expect(getDefaultOperator('string')).toBe('contains');
|
|
97
|
+
});
|
|
98
|
+
it('should return eq for number', () => {
|
|
99
|
+
expect(getDefaultOperator('number')).toBe('eq');
|
|
100
|
+
});
|
|
101
|
+
it('should return eq for boolean', () => {
|
|
102
|
+
expect(getDefaultOperator('boolean')).toBe('eq');
|
|
103
|
+
});
|
|
104
|
+
it('should return gte for date', () => {
|
|
105
|
+
expect(getDefaultOperator('date')).toBe('gte');
|
|
106
|
+
});
|
|
107
|
+
it('should return eq for lookup', () => {
|
|
108
|
+
expect(getDefaultOperator('lookup')).toBe('eq');
|
|
109
|
+
});
|
|
110
|
+
it('should return eq for unknown type', () => {
|
|
111
|
+
expect(getDefaultOperator('unknown')).toBe('eq');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('getDefaultValue', () => {
|
|
115
|
+
it('should return empty string for string', () => {
|
|
116
|
+
expect(getDefaultValue('string')).toBe('');
|
|
117
|
+
});
|
|
118
|
+
it('should return null for number', () => {
|
|
119
|
+
expect(getDefaultValue('number')).toBeNull();
|
|
120
|
+
});
|
|
121
|
+
it('should return true for boolean', () => {
|
|
122
|
+
expect(getDefaultValue('boolean')).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('should return null for date', () => {
|
|
125
|
+
expect(getDefaultValue('date')).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
it('should return null for lookup', () => {
|
|
128
|
+
expect(getDefaultValue('lookup')).toBeNull();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=filter-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-types.test.js","sourceRoot":"","sources":["../../src/__tests__/filter-types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/operators.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getOperatorsForType, getOperatorInfo, operatorRequiresValue, STRING_OPERATORS, NUMBER_OPERATORS, BOOLEAN_OPERATORS, DATE_OPERATORS, LOOKUP_OPERATORS } from '../lib/types/operators';
|
|
3
|
+
describe('operator constants', () => {
|
|
4
|
+
it('STRING_OPERATORS should include contains and equals', () => {
|
|
5
|
+
const ops = STRING_OPERATORS.map(o => o.value);
|
|
6
|
+
expect(ops).toContain('contains');
|
|
7
|
+
expect(ops).toContain('eq');
|
|
8
|
+
expect(ops).toContain('startswith');
|
|
9
|
+
expect(ops).toContain('endswith');
|
|
10
|
+
expect(ops).toContain('isempty');
|
|
11
|
+
expect(ops).toContain('isnotempty');
|
|
12
|
+
});
|
|
13
|
+
it('NUMBER_OPERATORS should include comparison operators', () => {
|
|
14
|
+
const ops = NUMBER_OPERATORS.map(o => o.value);
|
|
15
|
+
expect(ops).toContain('gt');
|
|
16
|
+
expect(ops).toContain('gte');
|
|
17
|
+
expect(ops).toContain('lt');
|
|
18
|
+
expect(ops).toContain('lte');
|
|
19
|
+
expect(ops).toContain('eq');
|
|
20
|
+
expect(ops).toContain('isnull');
|
|
21
|
+
});
|
|
22
|
+
it('BOOLEAN_OPERATORS should be limited to eq, neq, and null checks', () => {
|
|
23
|
+
const ops = BOOLEAN_OPERATORS.map(o => o.value);
|
|
24
|
+
expect(ops).toContain('eq');
|
|
25
|
+
expect(ops).toContain('neq');
|
|
26
|
+
expect(ops).toContain('isnull');
|
|
27
|
+
expect(ops).toContain('isnotnull');
|
|
28
|
+
expect(ops).not.toContain('contains');
|
|
29
|
+
});
|
|
30
|
+
it('DATE_OPERATORS should include date comparison operators', () => {
|
|
31
|
+
const ops = DATE_OPERATORS.map(o => o.value);
|
|
32
|
+
expect(ops).toContain('gt');
|
|
33
|
+
expect(ops).toContain('lt');
|
|
34
|
+
expect(ops).toContain('isnull');
|
|
35
|
+
});
|
|
36
|
+
it('LOOKUP_OPERATORS should include string and equality ops', () => {
|
|
37
|
+
const ops = LOOKUP_OPERATORS.map(o => o.value);
|
|
38
|
+
expect(ops).toContain('eq');
|
|
39
|
+
expect(ops).toContain('contains');
|
|
40
|
+
expect(ops).toContain('isnull');
|
|
41
|
+
});
|
|
42
|
+
it('all operators should have label and requiresValue properties', () => {
|
|
43
|
+
const allOps = [...STRING_OPERATORS, ...NUMBER_OPERATORS, ...BOOLEAN_OPERATORS, ...DATE_OPERATORS, ...LOOKUP_OPERATORS];
|
|
44
|
+
for (const op of allOps) {
|
|
45
|
+
expect(op).toHaveProperty('value');
|
|
46
|
+
expect(op).toHaveProperty('label');
|
|
47
|
+
expect(typeof op.requiresValue).toBe('boolean');
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('getOperatorsForType', () => {
|
|
52
|
+
it('should return STRING_OPERATORS for string type', () => {
|
|
53
|
+
expect(getOperatorsForType('string')).toBe(STRING_OPERATORS);
|
|
54
|
+
});
|
|
55
|
+
it('should return NUMBER_OPERATORS for number type', () => {
|
|
56
|
+
expect(getOperatorsForType('number')).toBe(NUMBER_OPERATORS);
|
|
57
|
+
});
|
|
58
|
+
it('should return BOOLEAN_OPERATORS for boolean type', () => {
|
|
59
|
+
expect(getOperatorsForType('boolean')).toBe(BOOLEAN_OPERATORS);
|
|
60
|
+
});
|
|
61
|
+
it('should return DATE_OPERATORS for date type', () => {
|
|
62
|
+
expect(getOperatorsForType('date')).toBe(DATE_OPERATORS);
|
|
63
|
+
});
|
|
64
|
+
it('should return LOOKUP_OPERATORS for lookup type', () => {
|
|
65
|
+
expect(getOperatorsForType('lookup')).toBe(LOOKUP_OPERATORS);
|
|
66
|
+
});
|
|
67
|
+
it('should default to STRING_OPERATORS for unknown types', () => {
|
|
68
|
+
expect(getOperatorsForType('custom')).toBe(STRING_OPERATORS);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('getOperatorInfo', () => {
|
|
72
|
+
it('should find operator info for a valid operator', () => {
|
|
73
|
+
const info = getOperatorInfo('contains', 'string');
|
|
74
|
+
expect(info).toBeDefined();
|
|
75
|
+
expect(info.value).toBe('contains');
|
|
76
|
+
expect(info.label).toBe('contains');
|
|
77
|
+
expect(info.requiresValue).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('should return undefined for invalid operator/type combo', () => {
|
|
80
|
+
const info = getOperatorInfo('contains', 'boolean');
|
|
81
|
+
expect(info).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
it('should find null-check operators', () => {
|
|
84
|
+
const info = getOperatorInfo('isnull', 'number');
|
|
85
|
+
expect(info).toBeDefined();
|
|
86
|
+
expect(info.requiresValue).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('operatorRequiresValue', () => {
|
|
90
|
+
it('should return true for value operators', () => {
|
|
91
|
+
expect(operatorRequiresValue('eq')).toBe(true);
|
|
92
|
+
expect(operatorRequiresValue('contains')).toBe(true);
|
|
93
|
+
expect(operatorRequiresValue('gt')).toBe(true);
|
|
94
|
+
expect(operatorRequiresValue('startswith')).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('should return false for null-check operators', () => {
|
|
97
|
+
expect(operatorRequiresValue('isnull')).toBe(false);
|
|
98
|
+
expect(operatorRequiresValue('isnotnull')).toBe(false);
|
|
99
|
+
expect(operatorRequiresValue('isempty')).toBe(false);
|
|
100
|
+
expect(operatorRequiresValue('isnotempty')).toBe(false);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=operators.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.test.js","sourceRoot":"","sources":["../../src/__tests__/operators.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-filter-builder",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"description": "MemberJunction: Angular Filter Builder Component - a modern, intuitive filter builder for creating complex boolean filter expressions with portable JSON format.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
|
-
"test": "echo \"
|
|
12
|
-
"build": "ngc"
|
|
11
|
+
"test": "echo \"No tests configured yet\"",
|
|
12
|
+
"build": "ngc",
|
|
13
|
+
"test:watch": "vitest"
|
|
13
14
|
},
|
|
14
15
|
"keywords": [
|
|
15
16
|
"MemberJunction",
|
|
@@ -21,7 +22,8 @@
|
|
|
21
22
|
"license": "ISC",
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"@angular/compiler": "21.1.3",
|
|
24
|
-
"@angular/compiler-cli": "21.1.3"
|
|
25
|
+
"@angular/compiler-cli": "21.1.3",
|
|
26
|
+
"vitest": "^4.0.18"
|
|
25
27
|
},
|
|
26
28
|
"peerDependencies": {
|
|
27
29
|
"@angular/common": "21.1.3",
|
|
@@ -31,7 +33,7 @@
|
|
|
31
33
|
},
|
|
32
34
|
"dependencies": {
|
|
33
35
|
"@angular/platform-browser": "21.1.3",
|
|
34
|
-
"@memberjunction/core": "4.
|
|
36
|
+
"@memberjunction/core": "4.3.0",
|
|
35
37
|
"tslib": "^2.8.1"
|
|
36
38
|
},
|
|
37
39
|
"sideEffects": false,
|