Skip to content

Commit c299b84

Browse files
committed
feat(renderer): add function to filter invisible fields in the schema
1 parent 79d5fb5 commit c299b84

File tree

5 files changed

+99
-0
lines changed

5 files changed

+99
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Schema, AnyObject } from "../common-types";
2+
3+
declare function getVisibleFields(schema: Schema, values: AnyObject ): Schema;
4+
5+
export default getVisibleFields;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import parseCondition from '../parse-condition';
2+
3+
const getVisibleFields = (schema, values) => {
4+
if (Array.isArray(schema)) {
5+
return schema.map((field) => getVisibleFields(field, values)).filter(Boolean);
6+
}
7+
8+
if (schema.condition) {
9+
const result = parseCondition(schema.condition, values, schema);
10+
11+
if (result.visible) {
12+
return {
13+
...schema,
14+
...(schema.fields && { fields: getVisibleFields(schema.fields, values).filter(Boolean) })
15+
};
16+
} else {
17+
return null;
18+
}
19+
}
20+
21+
return {
22+
...schema,
23+
...(schema.fields && { fields: getVisibleFields(schema.fields, values).filter(Boolean) })
24+
};
25+
};
26+
27+
export default getVisibleFields;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './get-visible-fields';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './get-visible-fields';
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import getVisibleFields from '../../get-visible-fields';
2+
3+
describe('getVisibleFields', () => {
4+
it('parses conditions', () => {
5+
let schema = {
6+
fields: [
7+
{
8+
name: 'visible-1',
9+
component: 'text'
10+
},
11+
{
12+
name: 'visible-2',
13+
condition: { when: 'x', is: 1 }
14+
},
15+
{
16+
name: 'invisible-1',
17+
condition: { not: { when: 'x', is: 1 } }
18+
},
19+
{
20+
name: 'visible-nested',
21+
fields: [
22+
{
23+
name: 'visible-nested-1',
24+
condition: { when: 'y.nested.x', is: 1 }
25+
},
26+
{
27+
name: 'invisible-nested-1',
28+
condition: { not: { when: 'y.nested.x', is: 1 } }
29+
}
30+
]
31+
},
32+
{
33+
name: 'visible-nested-2',
34+
condition: { when: 'y.nested.x', is: 1 },
35+
fields: [{ name: 'visible-nested-2-1' }]
36+
},
37+
{
38+
name: 'invisible-nested',
39+
condition: { when: 'x', is: 2 },
40+
fields: [
41+
{
42+
name: 'invisible-nested-1',
43+
condition: { when: 'x', is: 1 }
44+
},
45+
{
46+
name: 'invisible-nested-2',
47+
condition: { not: { when: 'x', is: 1 } }
48+
}
49+
]
50+
}
51+
]
52+
};
53+
54+
const values = { x: 1, y: { nested: { x: 1 } } };
55+
56+
expect(getVisibleFields(schema, values)).toEqual({
57+
fields: [
58+
{ name: 'visible-1', component: 'text' },
59+
{ name: 'visible-2', condition: { is: 1, when: 'x' } },
60+
{ name: 'visible-nested', fields: [{ condition: { is: 1, when: 'y.nested.x' }, name: 'visible-nested-1' }] },
61+
{ name: 'visible-nested-2', condition: { is: 1, when: 'y.nested.x' }, fields: [{ name: 'visible-nested-2-1' }] }
62+
]
63+
});
64+
});
65+
});

0 commit comments

Comments
 (0)