@outliant/sunrise-utils 1.1.12 → 1.1.14

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/CHANGELOG.md CHANGED
@@ -4,10 +4,26 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [1.1.14](https://github.com/outliant/sunrise-utils/compare/1.1.13...1.1.14)
8
+
9
+ - chore: add Is None Of field condition #85ztm47dj [`#20`](https://github.com/outliant/sunrise-utils/pull/20)
10
+ - chore: add Is None Of field condition (WIP) #85ztm47dj [`8005104`](https://github.com/outliant/sunrise-utils/commit/8005104a15eaf5102fe3672f1a9da5d03128ba4b)
11
+
12
+ #### [1.1.13](https://github.com/outliant/sunrise-utils/compare/1.1.12...1.1.13)
13
+
14
+ > 8 November 2023
15
+
16
+ - chore: change equal condition [`#18`](https://github.com/outliant/sunrise-utils/pull/18)
17
+ - chore: update isPaused filter [`99d882d`](https://github.com/outliant/sunrise-utils/commit/99d882d74cb7fb6d7aba3048a2328343017ca512)
18
+ - chore(release): 1.1.13 [`998c753`](https://github.com/outliant/sunrise-utils/commit/998c753cd70aad1cf9f55e392a812bf40d74a602)
19
+
7
20
  #### [1.1.12](https://github.com/outliant/sunrise-utils/compare/1.1.11...1.1.12)
8
21
 
22
+ > 7 November 2023
23
+
9
24
  - chore: add isPaused [`#17`](https://github.com/outliant/sunrise-utils/pull/17)
10
25
  - chore: add unit test for is_paused [`aa5fada`](https://github.com/outliant/sunrise-utils/commit/aa5fada660f2883004a1a72ddb0603f412dec18e)
26
+ - chore(release): 1.1.12 [`56f3083`](https://github.com/outliant/sunrise-utils/commit/56f30836a6b021e0d57cfabf9541b063ddb92afd)
11
27
 
12
28
  #### [1.1.11](https://github.com/outliant/sunrise-utils/compare/1.1.10...1.1.11)
13
29
 
@@ -0,0 +1,36 @@
1
+ const splitString = require('./splitString');
2
+
3
+ /**
4
+ * Creates a filter condition for "is_none_of" based on the provided filter and filterBuilder function.
5
+ *
6
+ * @param {Object} filter - The filter object.
7
+ * @param {Function} filterBuilder - The function to build filters.
8
+ * @returns {Object|null} The constructed filter condition or null if input is invalid.
9
+ */
10
+ module.exports.isNoneOf = (filter, filterBuilder) => {
11
+ if (
12
+ !filter ||
13
+ !filter.value ||
14
+ !filterBuilder ||
15
+ typeof filterBuilder !== 'function'
16
+ ) {
17
+ return null;
18
+ }
19
+
20
+ const value = typeof filter.value === 'string'
21
+ ? splitString(filter.value)
22
+ : filter.value;
23
+
24
+ if (!value || value && value.length === 0) {
25
+ return null;
26
+ }
27
+
28
+ return {
29
+ bool: {
30
+ must_not: value.map(x => filterBuilder({
31
+ ...filter,
32
+ value: x
33
+ }))
34
+ }
35
+ };
36
+ };
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -9,6 +10,11 @@ module.exports = (filter) => {
9
10
  case 'contains_none':
10
11
  case 'not_equal':
11
12
  return module.exports.containsNone(filter);
13
+ case 'is_none_of':
14
+ return isNoneOf(
15
+ filter,
16
+ module.exports.isEqual
17
+ );
12
18
  case 'greater_than_or_equal':
13
19
  return module.exports.greaterThanOrEqual(filter);
14
20
  case 'less_than_or_equal':
@@ -1,7 +1,7 @@
1
1
  const buildRegionFilter = require('./regionFilter');
2
2
  const buildCriticalPathFilter = require('./criticalPathFilter');
3
3
  const buildOnHoldFilter = require('./onHoldFilter');
4
- const buildIsPausedFilter = require('../taskFilter/isPausedFilter');
4
+ const buildIsPausedFilter = require('./isPausedFilter');
5
5
  const buildIsGeneratedFilter = require('./isGeneratedFilter');
6
6
  const buildTagFilter = require('./tagFilter');
7
7
  const buildProjectFieldFilter = require('./projectFieldFilter');
@@ -0,0 +1,41 @@
1
+ module.exports = (filter) => {
2
+ switch (filter.condition) {
3
+ case 'is_equal':
4
+ return module.exports.isEqual();
5
+ case 'not_equal':
6
+ return module.exports.isNotEqual();
7
+ default:
8
+ return null;
9
+ }
10
+ };
11
+
12
+ module.exports.isEqual = () => {
13
+ return {
14
+ match: {
15
+ is_paused: true
16
+ }
17
+ };
18
+ };
19
+
20
+ module.exports.isNotEqual = () => {
21
+ return {
22
+ bool: {
23
+ should: [
24
+ {
25
+ match: {
26
+ is_paused: false
27
+ }
28
+ },
29
+ {
30
+ bool: {
31
+ must_not: {
32
+ exists: {
33
+ field: 'is_paused'
34
+ }
35
+ }
36
+ }
37
+ }
38
+ ]
39
+ }
40
+ };
41
+ };
@@ -1,6 +1,7 @@
1
1
  const moment = require('moment');
2
2
  const { escapeElasticQuery } = require('../es');
3
3
  const splitString = require('../splitString');
4
+ const { isNoneOf } = require('../common');
4
5
 
5
6
  function getContainsMappingValue(filter) {
6
7
  if (['text', 'textarea'].includes(filter.field_type)) {
@@ -44,6 +45,11 @@ module.exports = (filter) => {
44
45
  return module.exports.isEqual(filter);
45
46
  case 'not_equal':
46
47
  return module.exports.isNotEqual(filter);
48
+ case 'is_none_of':
49
+ return isNoneOf(
50
+ filter,
51
+ module.exports.isEqual
52
+ );
47
53
  case 'before':
48
54
  case 'less_than':
49
55
  return module.exports.isBefore(filter);
@@ -1,6 +1,7 @@
1
1
  const moment = require('moment');
2
2
  const { escapeElasticQuery } = require('../es');
3
3
  const splitString = require('../splitString');
4
+ const { isNoneOf } = require('../common');
4
5
 
5
6
  module.exports = (filter) => {
6
7
  switch (filter.condition) {
@@ -8,6 +9,11 @@ module.exports = (filter) => {
8
9
  return module.exports.isEqual(filter);
9
10
  case 'not_equal':
10
11
  return module.exports.isNotEqual(filter);
12
+ case 'is_none_of':
13
+ return isNoneOf(
14
+ filter,
15
+ module.exports.isEqual
16
+ );
11
17
  case 'before':
12
18
  case 'less_than':
13
19
  return module.exports.isBefore(filter);
@@ -429,4 +435,4 @@ module.exports.isNotEqual = (filter) => {
429
435
  must_not: [mappingValue]
430
436
  }
431
437
  };
432
- };
438
+ };
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -8,6 +9,11 @@ module.exports = (filter) => {
8
9
  case 'contains_none':
9
10
  case 'not_equal':
10
11
  return module.exports.containsNone(filter);
12
+ case 'is_none_of':
13
+ return isNoneOf(
14
+ filter,
15
+ module.exports.containsAny
16
+ );
11
17
  default:
12
18
  return null;
13
19
  }
@@ -55,4 +61,4 @@ module.exports.containsNone = (filter) => {
55
61
  })
56
62
  }
57
63
  };
58
- };
64
+ };
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -11,6 +12,11 @@ module.exports = (filter) => {
11
12
  case 'is_equal':
12
13
  case 'contains':
13
14
  return module.exports.containsAll(filter);
15
+ case 'is_none_of':
16
+ return isNoneOf(
17
+ filter,
18
+ module.exports.containsAll
19
+ );
14
20
  default:
15
21
  return null;
16
22
  }
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -12,6 +13,11 @@ module.exports = (filter) => {
12
13
  return module.exports.isNotEqual(filter);
13
14
  case 'is_any_of':
14
15
  return module.exports.isAnyOf(filter);
16
+ case 'is_none_of':
17
+ return isNoneOf(
18
+ filter,
19
+ module.exports.isEqual
20
+ );
15
21
  default:
16
22
  return null;
17
23
  }
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -12,6 +13,11 @@ module.exports = (filter) => {
12
13
  return module.exports.isNotEqual(filter);
13
14
  case 'is_any_of':
14
15
  return module.exports.isAnyOf(filter); // if is any, means all tasks that have value
16
+ case 'is_none_of':
17
+ return isNoneOf(
18
+ filter,
19
+ module.exports.isEqual
20
+ );
15
21
  default:
16
22
  return null;
17
23
  }
@@ -46,13 +52,38 @@ module.exports.isNotEmpty = () => {
46
52
  };
47
53
 
48
54
  module.exports.isEqual = (filter) => {
55
+ const isYes = filter.value === 'Yes';
56
+
57
+ if (isYes) {
58
+ return {
59
+ bool: {
60
+ must: [
61
+ {
62
+ term: {
63
+ is_paused: {
64
+ value: true
65
+ }
66
+ }
67
+ }
68
+ ]
69
+ }
70
+ };
71
+ }
72
+
49
73
  return {
50
74
  bool: {
51
- must: [
75
+ should: [
52
76
  {
53
- term: {
54
- is_paused: {
55
- value: filter.value === 'Yes'
77
+ match: {
78
+ is_paused: false
79
+ }
80
+ },
81
+ {
82
+ bool: {
83
+ must_not: {
84
+ exists: {
85
+ field: 'is_paused'
86
+ }
56
87
  }
57
88
  }
58
89
  }
@@ -65,13 +96,7 @@ module.exports.isNotEqual = (filter) => {
65
96
  return {
66
97
  bool: {
67
98
  must_not: [
68
- {
69
- term: {
70
- is_paused: {
71
- value: filter.value === 'Yes'
72
- }
73
- }
74
- }
99
+ module.exports.isEqual(filter)
75
100
  ]
76
101
  }
77
102
  };
@@ -100,4 +125,4 @@ module.exports.isAnyOf = (filter) => {
100
125
  should
101
126
  }
102
127
  };
103
- };
128
+ };
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -12,6 +13,11 @@ module.exports = (filter) => {
12
13
  return module.exports.isNotEqual(filter);
13
14
  case 'is_any_of':
14
15
  return module.exports.isAnyOf(filter); // if is any, means all tasks that have value
16
+ case 'is_none_of':
17
+ return isNoneOf(
18
+ filter,
19
+ module.exports.isEqual
20
+ );
15
21
  default:
16
22
  return null;
17
23
  }
@@ -100,4 +106,4 @@ module.exports.isAnyOf = (filter) => {
100
106
  should
101
107
  }
102
108
  };
103
- };
109
+ };
@@ -1,6 +1,7 @@
1
1
  const { validate: isUuid } = require('uuid');
2
2
 
3
3
  const splitString = require('../splitString');
4
+ const { isNoneOf } = require('../common');
4
5
 
5
6
  module.exports = (filter) => {
6
7
  switch (filter.condition) {
@@ -14,6 +15,11 @@ module.exports = (filter) => {
14
15
  return module.exports.isNotEqual(filter);
15
16
  case 'is_any_of':
16
17
  return module.exports.isAnyOf(filter);
18
+ case 'is_none_of':
19
+ return isNoneOf(
20
+ filter,
21
+ module.exports.isEqual
22
+ );
17
23
  default:
18
24
  return null;
19
25
  }
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -8,6 +9,11 @@ module.exports = (filter) => {
8
9
  return module.exports.isNotEmpty();
9
10
  case 'is_equal':
10
11
  return module.exports.isEqual(filter);
12
+ case 'is_none_of':
13
+ return isNoneOf(
14
+ filter,
15
+ module.exports.isEqual
16
+ );
11
17
  case 'not_equal':
12
18
  return module.exports.isNotEqual(filter);
13
19
  default:
@@ -81,4 +87,4 @@ module.exports.isNotEqual = (filter) => {
81
87
  }
82
88
 
83
89
  return null;
84
- };
90
+ };
@@ -1,4 +1,5 @@
1
1
  const splitString = require('../splitString');
2
+ const { isNoneOf } = require('../common');
2
3
 
3
4
  module.exports = (filter) => {
4
5
  switch (filter.condition) {
@@ -12,6 +13,11 @@ module.exports = (filter) => {
12
13
  return module.exports.isNotEqual(filter);
13
14
  case 'is_any_of':
14
15
  return module.exports.isAnyOf(filter);
16
+ case 'is_none_of':
17
+ return isNoneOf(
18
+ filter,
19
+ module.exports.isEqual
20
+ );
15
21
  default:
16
22
  return null;
17
23
  }
@@ -176,4 +182,4 @@ module.exports.isNotEqual = (filter) => {
176
182
  }
177
183
 
178
184
  return null;
179
- };
185
+ };
@@ -1,6 +1,7 @@
1
1
  const moment = require('moment');
2
2
 
3
3
  const splitString = require('../splitString');
4
+ const { isNoneOf } = require('../common');
4
5
 
5
6
  module.exports = (filter) => {
6
7
  switch (filter.condition) {
@@ -18,6 +19,11 @@ module.exports = (filter) => {
18
19
  return module.exports.isEqual(filter);
19
20
  case 'not_equal':
20
21
  return module.exports.isNotEqual(filter);
22
+ case 'is_none_of':
23
+ return isNoneOf(
24
+ filter,
25
+ module.exports.isEqual
26
+ );
21
27
  case 'before':
22
28
  case 'less_than':
23
29
  return module.exports.isBefore(filter);
@@ -1,9 +1,16 @@
1
+ const { isNoneOf } = require('../common');
2
+
1
3
  module.exports = (filter) => {
2
4
  switch (filter.condition) {
3
5
  case 'is_equal':
4
6
  return module.exports.isEqual(filter);
5
7
  case 'not_equal':
6
8
  return module.exports.isNotEqual(filter);
9
+ case 'is_none_of':
10
+ return isNoneOf(
11
+ filter,
12
+ module.exports.isEqual
13
+ );
7
14
  default:
8
15
  return null;
9
16
  }
@@ -74,4 +81,4 @@ module.exports.isNotEqual = (filter) => {
74
81
  }
75
82
 
76
83
  return null;
77
- };
84
+ };
@@ -27,6 +27,10 @@ module.exports.conditions = {
27
27
  {
28
28
  label: 'Contains None',
29
29
  value: 'contains_none'
30
+ },
31
+ {
32
+ label: 'Is None Of',
33
+ value: 'is_none_of'
30
34
  }
31
35
  ],
32
36
  textarea: [
@@ -57,6 +61,10 @@ module.exports.conditions = {
57
61
  {
58
62
  label: 'Contains None',
59
63
  value: 'contains_none'
64
+ },
65
+ {
66
+ label: 'Is None Of',
67
+ value: 'is_none_of'
60
68
  }
61
69
  ],
62
70
  number: [
@@ -113,6 +121,10 @@ module.exports.conditions = {
113
121
  {
114
122
  label: 'Is Not Empty',
115
123
  value: 'is_not_empty'
124
+ },
125
+ {
126
+ label: 'Is None Of',
127
+ value: 'is_none_of'
116
128
  }
117
129
  ],
118
130
  select: [
@@ -135,6 +147,10 @@ module.exports.conditions = {
135
147
  {
136
148
  label: 'Is any of',
137
149
  value: 'is_any_of'
150
+ },
151
+ {
152
+ label: 'Is None Of',
153
+ value: 'is_none_of'
138
154
  }
139
155
  ],
140
156
  date: [
@@ -191,6 +207,10 @@ module.exports.conditions = {
191
207
  {
192
208
  label: 'Is Not Empty',
193
209
  value: 'is_not_empty'
210
+ },
211
+ {
212
+ label: 'Is None Of',
213
+ value: 'is_none_of'
194
214
  }
195
215
  ]
196
216
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@outliant/sunrise-utils",
3
3
  "description": "Helper functions for project Sunrise",
4
- "version": "1.1.12",
4
+ "version": "1.1.14",
5
5
  "license": "ISC",
6
6
  "author": "Outliant",
7
7
  "main": "index.js",
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ /* eslint-env node, mocha */
4
+ const { expect } = require('chai');
5
+
6
+ // To test
7
+ const { isNoneOf } = require('../../helpers/common');
8
+ const { isEqual } = require('../../helpers/taskFilter/ownerFilter');
9
+
10
+ describe('isNoneOf', function () {
11
+ const filters = [
12
+ {
13
+ input: {
14
+ condition: 'is_none_of',
15
+ field_id: '',
16
+ type: 'critical_path_stage',
17
+ field_type: 'select',
18
+ value: 'meow1;meow2',
19
+ second_value: ''
20
+ },
21
+ callback: isEqual,
22
+ output: {
23
+ bool: {
24
+ must_not: [
25
+ {
26
+ bool: {
27
+ must: [
28
+ { term: { team_id: { value: 'meow1' } } }
29
+ ]
30
+ }
31
+ },
32
+ {
33
+ bool: {
34
+ must: [
35
+ { term: { team_id: { value: 'meow2' } } }
36
+ ]
37
+ }
38
+ }
39
+ ]
40
+ }
41
+ }
42
+ },
43
+ {
44
+ input: {
45
+ condition: 'is_none_of',
46
+ field_id: '',
47
+ type: 'critical_path_stage',
48
+ field_type: 'select',
49
+ value: ['meow1', 'meow2'],
50
+ second_value: ''
51
+ },
52
+ callback: isEqual,
53
+ output: {
54
+ bool: {
55
+ must_not: [
56
+ {
57
+ bool: {
58
+ must: [
59
+ { term: { team_id: { value: 'meow1' } } }
60
+ ]
61
+ }
62
+ },
63
+ {
64
+ bool: {
65
+ must: [
66
+ { term: { team_id: { value: 'meow2' } } }
67
+ ]
68
+ }
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ },
74
+ {
75
+ input: {
76
+ condition: 'is_none_of',
77
+ field_id: '',
78
+ type: 'critical_path_stage',
79
+ field_type: 'select',
80
+ value: 'meow',
81
+ second_value: ''
82
+ },
83
+ callback: isEqual,
84
+ output: {
85
+ bool: {
86
+ must_not: [
87
+ {
88
+ bool: {
89
+ must: [
90
+ { term: { team_id: { value: 'meow' } } }
91
+ ]
92
+ }
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ },
98
+ {
99
+ input: {
100
+ condition: 'is_none_of',
101
+ field_id: '',
102
+ type: 'critical_path_stage',
103
+ field_type: 'select',
104
+ value: [],
105
+ second_value: ''
106
+ },
107
+ callback: isEqual,
108
+ output: null
109
+ },
110
+ {
111
+ input: {
112
+ condition: 'is_none_of',
113
+ value: null
114
+ },
115
+ callback: isEqual,
116
+ output: null
117
+ },
118
+ {
119
+ input: {
120
+ condition: 'is_none_of',
121
+ field_id: '',
122
+ type: 'critical_path_stage',
123
+ field_type: 'select',
124
+ value: 'meow',
125
+ second_value: ''
126
+ },
127
+ callback: undefined,
128
+ output: null
129
+ }
130
+ ];
131
+ filters.forEach((filter) => {
132
+ it(`${filter.input.condition}: ${JSON.stringify(
133
+ filter.input.value
134
+ )}`, (done) => {
135
+ expect(isNoneOf(filter.input, filter.callback)).to.deep.equal(filter.output);
136
+ done();
137
+ });
138
+ });
139
+ });