Skip to content

Commit 640293d

Browse files
committed
chore(renderer): add tests for name condition trigger extractor
1 parent 3dfc22e commit 640293d

File tree

6 files changed

+97
-52
lines changed

6 files changed

+97
-52
lines changed

packages/react-form-renderer/src/form-renderer/render-form.js

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,8 @@ import React, { useContext } from 'react';
22
import PropTypes from 'prop-types';
33
import RendererContext from '../renderer-context';
44
import Condition from '../condition';
5-
import { memoize } from '../common/helpers';
65
import { Field } from 'react-final-form';
7-
8-
const mergeFunctionTrigger = (fn, field) => {
9-
let internalTriggers = [];
10-
const internalWhen = fn(field);
11-
if (Array.isArray(internalWhen)) {
12-
internalTriggers = [...internalWhen];
13-
} else {
14-
internalTriggers.push(internalWhen);
15-
}
16-
17-
return internalTriggers;
18-
};
19-
20-
const getConditionTriggers = memoize((condition, field) => {
21-
let triggers = [];
22-
if (Array.isArray(condition)) {
23-
return condition.reduce((acc, item) => [...acc, ...getConditionTriggers(item, field)], []);
24-
}
25-
26-
const {when, ...rest} = condition;
27-
const nestedKeys = ['and', 'or', 'sequence'];
28-
if (typeof when === 'string') {
29-
triggers = [...triggers, when];
30-
}
31-
32-
if (typeof when === 'function') {
33-
triggers = [...triggers, ...mergeFunctionTrigger(when, field)];
34-
}
35-
36-
if (Array.isArray(when)) {
37-
when.forEach(item => {
38-
if (typeof item === 'string') {
39-
triggers = [...triggers, item];
40-
}
41-
42-
if (typeof item === 'function') {
43-
triggers = [...triggers, ...mergeFunctionTrigger(item, field)];
44-
}
45-
});
46-
}
47-
48-
nestedKeys.forEach(key => {
49-
if (typeof rest[key] !== 'undefined') {
50-
rest[key].forEach(item => {
51-
triggers = [...triggers, ...getConditionTriggers(item, field)];
52-
});
53-
}
54-
});
55-
56-
return Array.from(new Set(triggers));
57-
});
6+
import getConditionTriggers from '../get-condition-triggers';
587

598
const FormFieldHideWrapper = ({ hideField, children }) => (hideField ? <div hidden>{children}</div> : children);
609

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { ConditionDefinition } from "../../condition";
2+
3+
declare function getConditionTriggers(params:ConditionDefinition | ConditionDefinition[]): string[];
4+
5+
export default getConditionTriggers;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { memoize } from '../common';
2+
3+
const mergeFunctionTrigger = (fn, field) => {
4+
let internalTriggers = [];
5+
const internalWhen = fn(field);
6+
if (Array.isArray(internalWhen)) {
7+
internalTriggers = [...internalWhen];
8+
} else {
9+
internalTriggers.push(internalWhen);
10+
}
11+
12+
return internalTriggers;
13+
};
14+
15+
const getConditionTriggers = memoize((condition, field) => {
16+
let triggers = [];
17+
if (Array.isArray(condition)) {
18+
return condition.reduce((acc, item) => [...acc, ...getConditionTriggers(item, field)], []);
19+
}
20+
21+
const {when, ...rest} = condition;
22+
const nestedKeys = ['and', 'or', 'sequence'];
23+
if (typeof when === 'string') {
24+
triggers = [...triggers, when];
25+
}
26+
27+
if (typeof when === 'function') {
28+
triggers = [...triggers, ...mergeFunctionTrigger(when, field)];
29+
}
30+
31+
if (Array.isArray(when)) {
32+
when.forEach(item => {
33+
if (typeof item === 'string') {
34+
triggers = [...triggers, item];
35+
}
36+
37+
if (typeof item === 'function') {
38+
triggers = [...triggers, ...mergeFunctionTrigger(item, field)];
39+
}
40+
});
41+
}
42+
43+
nestedKeys.forEach(key => {
44+
if (typeof rest[key] !== 'undefined') {
45+
rest[key].forEach(item => {
46+
triggers = [...triggers, ...getConditionTriggers(item, field)];
47+
});
48+
}
49+
});
50+
51+
return Array.from(new Set(triggers));
52+
});
53+
54+
export default getConditionTriggers;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './get-condition-triggers';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './get-condition-triggers';
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import getConditionTriggers from '../../get-condition-triggers';
2+
3+
describe('getConditionTriggers', () => {
4+
test('should extract name from simple when definition', () => {
5+
expect(getConditionTriggers({ when: 'a' })).toEqual(['a']);
6+
});
7+
8+
test('should extract name from simple when array definition', () => {
9+
expect(getConditionTriggers({ when: ['a', 'b'] })).toEqual(['a', 'b']);
10+
});
11+
12+
test('should extract name from simple when function definition', () => {
13+
expect(getConditionTriggers({ when: () => 'a' })).toEqual(['a']);
14+
});
15+
16+
test('should extract name from combined when array definition', () => {
17+
expect(getConditionTriggers({ when: ['a', () => 'b'] })).toEqual(['a', 'b']);
18+
});
19+
20+
test('should extract name from combined when array definition if functions returns an array', () => {
21+
expect(getConditionTriggers({ when: ['a', () => ['b', 'c']] })).toEqual(['a', 'b', 'c']);
22+
});
23+
24+
test('should extract name from and condition definition', () => {
25+
expect(getConditionTriggers({ and: [{ when: 'a' }, {when: ['b', 'c']}, { when: () => 'd' }] })).toEqual(['a', 'b', 'c', 'd']);
26+
});
27+
28+
test('should extract name from or condition definition', () => {
29+
expect(getConditionTriggers({ or: [{ when: 'a' }, {when: ['b', 'c']}, { when: () => 'd' }] })).toEqual(['a', 'b', 'c', 'd']);
30+
});
31+
32+
test('should extract name from array of conditions', () => {
33+
expect(getConditionTriggers([{ when: 'a' }, {when: 'b'}])).toEqual(['a', 'b']);
34+
});
35+
});

0 commit comments

Comments
 (0)