@inseefr/lunatic 3.8.0-rc.0 → 3.8.0-rc.ucq-options-variable.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/esm/type.source.d.ts +9 -3
- package/esm/use-lunatic/commons/fill-components/fill-component-expressions.d.ts +1 -1
- package/esm/use-lunatic/commons/fill-components/fill-component-expressions.js.map +1 -1
- package/esm/use-lunatic/commons/fill-components/fill-components.js +10 -2
- package/esm/use-lunatic/commons/fill-components/fill-components.js.map +1 -1
- package/esm/use-lunatic/props/propOptions.d.ts +9 -1
- package/esm/use-lunatic/props/propOptions.js +56 -1
- package/esm/use-lunatic/props/propOptions.js.map +1 -1
- package/esm/use-lunatic/props/propOptions.spec.js +220 -56
- package/esm/use-lunatic/props/propOptions.spec.js.map +1 -1
- package/package.json +4 -1
- package/src/stories/checkbox/checkbox.stories.tsx +13 -0
- package/src/stories/checkbox/sourceOneDynamicOptions.json +496 -0
- package/src/stories/dropdown/dropdown.stories.tsx +12 -0
- package/src/stories/dropdown/sourceDynamicOptions.json +496 -0
- package/src/stories/radio/radio.stories.tsx +13 -0
- package/src/stories/radio/sourceDynamicOptions.json +496 -0
- package/src/type.source.ts +9 -3
- package/src/use-lunatic/commons/fill-components/fill-component-expressions.ts +2 -1
- package/src/use-lunatic/commons/fill-components/fill-components.ts +9 -10
- package/src/use-lunatic/props/propOptions.spec.ts +217 -147
- package/src/use-lunatic/props/propOptions.ts +97 -8
- package/tsconfig.build.tsbuildinfo +1 -1
- package/type.source.d.ts +9 -3
- package/use-lunatic/commons/fill-components/fill-component-expressions.d.ts +1 -1
- package/use-lunatic/commons/fill-components/fill-component-expressions.js.map +1 -1
- package/use-lunatic/commons/fill-components/fill-components.js +9 -1
- package/use-lunatic/commons/fill-components/fill-components.js.map +1 -1
- package/use-lunatic/props/propOptions.d.ts +9 -1
- package/use-lunatic/props/propOptions.js +57 -2
- package/use-lunatic/props/propOptions.js.map +1 -1
- package/use-lunatic/props/propOptions.spec.js +217 -55
- package/use-lunatic/props/propOptions.spec.js.map +1 -1
package/esm/type.source.d.ts
CHANGED
|
@@ -124,7 +124,9 @@ export type ComponentCheckboxBooleanDefinition = ComponentDefinitionBaseWithResp
|
|
|
124
124
|
export type ComponentRadioDefinition = ComponentDefinitionBaseWithResponse & {
|
|
125
125
|
componentType: 'Radio';
|
|
126
126
|
orientation?: 'horizontal' | 'vertical';
|
|
127
|
-
options
|
|
127
|
+
options?: OptionsWithDetail;
|
|
128
|
+
optionSource?: string;
|
|
129
|
+
optionFilter?: VTLExpression;
|
|
128
130
|
};
|
|
129
131
|
export type OptionsWithDetail = {
|
|
130
132
|
value: string | boolean;
|
|
@@ -140,7 +142,9 @@ export type OptionsWithDetail = {
|
|
|
140
142
|
}[];
|
|
141
143
|
export type ComponentDropdownDefinition = ComponentDefinitionBaseWithResponse & {
|
|
142
144
|
componentType: 'Dropdown';
|
|
143
|
-
options
|
|
145
|
+
options?: Options;
|
|
146
|
+
optionSource?: string;
|
|
147
|
+
optionFilter?: VTLExpression;
|
|
144
148
|
};
|
|
145
149
|
export type ComponentQuestionDefinition = ComponentDefinitionBase & {
|
|
146
150
|
componentType: 'Question';
|
|
@@ -148,7 +152,9 @@ export type ComponentQuestionDefinition = ComponentDefinitionBase & {
|
|
|
148
152
|
};
|
|
149
153
|
export type ComponentCheckboxOneDefinition = ComponentDefinitionBaseWithResponse & {
|
|
150
154
|
componentType: 'CheckboxOne';
|
|
151
|
-
options
|
|
155
|
+
options?: OptionsWithDetail;
|
|
156
|
+
optionSource?: string;
|
|
157
|
+
optionFilter?: VTLExpression;
|
|
152
158
|
};
|
|
153
159
|
export type ComponentSuggesterDefinition = ComponentDefinitionBaseWithResponse & {
|
|
154
160
|
componentType: 'Suggester';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { LunaticComponentDefinition, LunaticExpression, LunaticReducerState } from '../../type';
|
|
3
|
-
type UntranslatedProperties = 'expressions' | 'sections' | 'body' | 'item' | 'controls' | 'conditionFilter' | 'conditionReadOnly' | 'components';
|
|
3
|
+
type UntranslatedProperties = 'expressions' | 'sections' | 'body' | 'item' | 'controls' | 'conditionFilter' | 'conditionReadOnly' | 'components' | 'optionFilter';
|
|
4
4
|
export type DeepTranslateExpression<T> = T extends LunaticExpression ? ReactNode : T extends (infer ElementType)[] ? DeepTranslateExpression<ElementType>[] : T extends {
|
|
5
5
|
[k: string | number]: unknown;
|
|
6
6
|
} ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-component-expressions.js","sourceRoot":"","sources":["../../../../src/use-lunatic/commons/fill-components/fill-component-expressions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fill-component-expressions.js","sourceRoot":"","sources":["../../../../src/use-lunatic/commons/fill-components/fill-component-expressions.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { getComponentTypeProps } from '../../props/getComponentTypeProps';
|
|
|
3
3
|
import { getMissingResponseProp } from '../../props/propMissingResponse';
|
|
4
4
|
import { getValueProp } from '../../props/propValue';
|
|
5
5
|
import { getIterationsProp } from '../../props/propIterations';
|
|
6
|
-
import {
|
|
6
|
+
import { computeOptionsFromComponent } from '../../props/propOptions';
|
|
7
7
|
/**
|
|
8
8
|
* To make this work with TypeScript we need to call function in succession, we prefer expressiveness here over generalized approach
|
|
9
9
|
*/
|
|
@@ -43,7 +43,15 @@ parentReadOnly) => {
|
|
|
43
43
|
missingResponse: getMissingResponseProp(component, state),
|
|
44
44
|
management: state.management,
|
|
45
45
|
iterations: getIterationsProp(component, state),
|
|
46
|
-
options:
|
|
46
|
+
options: computeOptionsFromComponent(interpretedProps, {
|
|
47
|
+
variables: state.variables,
|
|
48
|
+
handleChanges: state.handleChanges,
|
|
49
|
+
pagerIteration: state.pager.iteration,
|
|
50
|
+
value,
|
|
51
|
+
logger: state.logger,
|
|
52
|
+
disableFilters: state.disableFilters,
|
|
53
|
+
shouldParentBeFiltered: shouldBeFiltered,
|
|
54
|
+
}),
|
|
47
55
|
...getComponentTypeProps(interpretedProps, state),
|
|
48
56
|
// This is too dynamic to be typed correctly, so we allow any here
|
|
49
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-components.js","sourceRoot":"","sources":["../../../../src/use-lunatic/commons/fill-components/fill-components.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fill-components.js","sourceRoot":"","sources":["../../../../src/use-lunatic/commons/fill-components/fill-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,15 @@ export type InterpretedOption = {
|
|
|
19
19
|
/**
|
|
20
20
|
* Compute options for checkboxes / radios / dropdown
|
|
21
21
|
*/
|
|
22
|
-
export declare function
|
|
22
|
+
export declare function computeOptionsFromComponent(definition: DeepTranslateExpression<LunaticComponentDefinition>, { variables, handleChanges, pagerIteration, value, logger, disableFilters, shouldParentBeFiltered, }: {
|
|
23
|
+
variables: LunaticVariablesStore;
|
|
24
|
+
handleChanges: LunaticChangesHandler;
|
|
25
|
+
pagerIteration: LunaticState['pager']['iteration'];
|
|
26
|
+
value: unknown;
|
|
27
|
+
logger: LunaticLogger;
|
|
28
|
+
disableFilters?: boolean;
|
|
29
|
+
shouldParentBeFiltered?: boolean;
|
|
30
|
+
}): InterpretedOption[] | {
|
|
23
31
|
label: ReactNode;
|
|
24
32
|
name: string;
|
|
25
33
|
id: string;
|
|
@@ -2,7 +2,7 @@ import { isNumber } from '../../utils/number';
|
|
|
2
2
|
/**
|
|
3
3
|
* Compute options for checkboxes / radios / dropdown
|
|
4
4
|
*/
|
|
5
|
-
export function
|
|
5
|
+
export function computeOptionsFromComponent(definition, { variables, handleChanges, pagerIteration, value, logger, disableFilters, shouldParentBeFiltered, }) {
|
|
6
6
|
const iteration = isNumber(pagerIteration) ? [pagerIteration] : undefined;
|
|
7
7
|
if (definition.componentType === 'CheckboxGroup') {
|
|
8
8
|
return definition.responses
|
|
@@ -40,9 +40,24 @@ export function getOptionsProp(definition, variables, handleChanges, pagerIterat
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
+
// options based on another variable
|
|
44
|
+
if ('optionSource' in definition && definition.optionSource) {
|
|
45
|
+
return computeOptionsFromSource(definition.optionSource, {
|
|
46
|
+
variables,
|
|
47
|
+
value,
|
|
48
|
+
handleChanges,
|
|
49
|
+
responseName: definition.response.name,
|
|
50
|
+
logger,
|
|
51
|
+
shouldParentBeFiltered,
|
|
52
|
+
optionFilter: definition.optionFilter,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
43
55
|
if (!('options' in definition)) {
|
|
44
56
|
return [];
|
|
45
57
|
}
|
|
58
|
+
if (!definition.options) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
46
61
|
return definition.options
|
|
47
62
|
.filter((option) => {
|
|
48
63
|
if (disableFilters ||
|
|
@@ -84,6 +99,46 @@ export function getOptionsProp(definition, variables, handleChanges, pagerIterat
|
|
|
84
99
|
});
|
|
85
100
|
});
|
|
86
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Get all options from a source variable, applying filters.
|
|
104
|
+
*/
|
|
105
|
+
function computeOptionsFromSource(optionSource, { variables, value, handleChanges, responseName, logger, shouldParentBeFiltered, optionFilter, }) {
|
|
106
|
+
// we don't know the type of the optionSource values (string, numbers, boolean)
|
|
107
|
+
const optionValues = variables.get(optionSource);
|
|
108
|
+
if (!optionValues) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const normalizedValues = Array.isArray(optionValues)
|
|
112
|
+
? optionValues
|
|
113
|
+
: [optionValues];
|
|
114
|
+
return normalizedValues
|
|
115
|
+
.filter((option, index) => {
|
|
116
|
+
// option is an empty value, we remove it from the options list
|
|
117
|
+
if (option === null || option === undefined) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
// no filter expression, we keep the option
|
|
121
|
+
if (!optionFilter) {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
// apply filter expression on option (applied to its iteration)
|
|
125
|
+
return !isFilteredOutOption(variables, [index], logger, optionFilter);
|
|
126
|
+
})
|
|
127
|
+
.map((option) => {
|
|
128
|
+
return {
|
|
129
|
+
label: String(option),
|
|
130
|
+
value: option,
|
|
131
|
+
checked: value === option,
|
|
132
|
+
onCheck: () => {
|
|
133
|
+
handleChanges([{ name: responseName, value: option }]);
|
|
134
|
+
},
|
|
135
|
+
onUncheck: () => {
|
|
136
|
+
handleChanges([{ name: responseName, value: null }]);
|
|
137
|
+
},
|
|
138
|
+
shouldBeFiltered: shouldParentBeFiltered,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
87
142
|
/**
|
|
88
143
|
* Check if an option should be filtered, depending on its conditionFilter.
|
|
89
144
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propOptions.js","sourceRoot":"","sources":["../../../src/use-lunatic/props/propOptions.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAoB9C;;GAEG;AACH,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"propOptions.js","sourceRoot":"","sources":["../../../src/use-lunatic/props/propOptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,69 +1,100 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
2
|
import { LunaticVariablesStore } from '../commons/variables/lunatic-variables-store';
|
|
3
|
-
import {
|
|
4
|
-
describe('
|
|
3
|
+
import { computeOptionsFromComponent } from './propOptions';
|
|
4
|
+
describe('computeOptionsFromComponent', () => {
|
|
5
5
|
let variables;
|
|
6
|
-
const checkboxGroupDefinition = {
|
|
7
|
-
id: 'CheckboxGroup',
|
|
8
|
-
componentType: 'CheckboxGroup',
|
|
9
|
-
responses: [
|
|
10
|
-
{
|
|
11
|
-
label: 'Option 1',
|
|
12
|
-
response: { name: 'O1' },
|
|
13
|
-
id: 'id1',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
label: 'Option 2',
|
|
17
|
-
response: { name: 'O2' },
|
|
18
|
-
id: 'id2',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
};
|
|
22
|
-
const radioDefinition = {
|
|
23
|
-
id: 'RadioGroup',
|
|
24
|
-
componentType: 'Radio',
|
|
25
|
-
response: { name: 'RADIO' },
|
|
26
|
-
options: [
|
|
27
|
-
{
|
|
28
|
-
label: 'Option 1',
|
|
29
|
-
value: 'id1',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
label: 'Option 2',
|
|
33
|
-
value: 'id2',
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
};
|
|
37
6
|
let mockChange;
|
|
38
7
|
const mockLogger = vi.fn();
|
|
39
8
|
beforeEach(() => {
|
|
40
9
|
mockChange = vi.fn();
|
|
41
10
|
variables = new LunaticVariablesStore();
|
|
42
11
|
});
|
|
43
|
-
describe('
|
|
12
|
+
describe('Options based on a fixed list', () => {
|
|
13
|
+
const checkboxGroupDefinition = {
|
|
14
|
+
id: 'CheckboxGroup',
|
|
15
|
+
componentType: 'CheckboxGroup',
|
|
16
|
+
responses: [
|
|
17
|
+
{
|
|
18
|
+
label: 'Option 1',
|
|
19
|
+
response: { name: 'O1' },
|
|
20
|
+
id: 'id1',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: 'Option 2',
|
|
24
|
+
response: { name: 'O2' },
|
|
25
|
+
id: 'id2',
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
const radioDefinition = {
|
|
30
|
+
id: 'RadioGroup',
|
|
31
|
+
componentType: 'Radio',
|
|
32
|
+
response: { name: 'RADIO' },
|
|
33
|
+
options: [
|
|
34
|
+
{
|
|
35
|
+
label: 'Option 1',
|
|
36
|
+
value: 'id1',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: 'Option 2',
|
|
40
|
+
value: 'id2',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
44
|
it('should check boxes', () => {
|
|
45
45
|
variables.set('O2', false);
|
|
46
|
-
let options =
|
|
46
|
+
let options = computeOptionsFromComponent(checkboxGroupDefinition, {
|
|
47
|
+
variables,
|
|
48
|
+
handleChanges: mockChange,
|
|
49
|
+
pagerIteration: undefined,
|
|
50
|
+
value: undefined,
|
|
51
|
+
logger: mockLogger,
|
|
52
|
+
});
|
|
47
53
|
expect(options[1].checked).toBe(false);
|
|
48
54
|
variables.set('O2', true);
|
|
49
|
-
options =
|
|
55
|
+
options = computeOptionsFromComponent(checkboxGroupDefinition, {
|
|
56
|
+
variables,
|
|
57
|
+
handleChanges: mockChange,
|
|
58
|
+
pagerIteration: undefined,
|
|
59
|
+
value: undefined,
|
|
60
|
+
logger: mockLogger,
|
|
61
|
+
});
|
|
50
62
|
expect(options[1].checked).toBe(true);
|
|
51
63
|
});
|
|
52
64
|
it('should check boxes correctly within iteration', () => {
|
|
53
65
|
variables.set('O1', []);
|
|
54
66
|
variables.set('O2', []);
|
|
55
|
-
let options =
|
|
67
|
+
let options = computeOptionsFromComponent(checkboxGroupDefinition, {
|
|
68
|
+
variables,
|
|
69
|
+
handleChanges: mockChange,
|
|
70
|
+
pagerIteration: 0,
|
|
71
|
+
value: undefined,
|
|
72
|
+
logger: mockLogger,
|
|
73
|
+
});
|
|
56
74
|
expect(options.filter((o) => o.checked), 'Nothing checked when variable empty').toHaveLength(0);
|
|
57
75
|
variables.set('O1', [true, 0]);
|
|
58
|
-
options =
|
|
76
|
+
options = computeOptionsFromComponent(checkboxGroupDefinition, {
|
|
77
|
+
variables,
|
|
78
|
+
handleChanges: mockChange,
|
|
79
|
+
pagerIteration: 0,
|
|
80
|
+
value: undefined,
|
|
81
|
+
logger: mockLogger,
|
|
82
|
+
});
|
|
59
83
|
expect(options[0].checked).toBe(true);
|
|
60
84
|
expect(options[1].checked).toBe(false);
|
|
61
85
|
});
|
|
62
86
|
it('should create handleChange correctly', () => {
|
|
87
|
+
var _a, _b;
|
|
63
88
|
variables.set('O1', [true, false]);
|
|
64
89
|
variables.set('O2', [false, true]);
|
|
65
|
-
const options =
|
|
66
|
-
|
|
90
|
+
const options = computeOptionsFromComponent(checkboxGroupDefinition, {
|
|
91
|
+
variables,
|
|
92
|
+
handleChanges: mockChange,
|
|
93
|
+
pagerIteration: 1,
|
|
94
|
+
value: undefined,
|
|
95
|
+
logger: mockLogger,
|
|
96
|
+
});
|
|
97
|
+
(_b = (_a = options[1]).onCheck) === null || _b === void 0 ? void 0 : _b.call(_a, false);
|
|
67
98
|
expect(mockChange).toHaveBeenLastCalledWith([
|
|
68
99
|
{ name: 'O2', value: false },
|
|
69
100
|
]);
|
|
@@ -94,7 +125,13 @@ describe('getOptionsProp()', () => {
|
|
|
94
125
|
],
|
|
95
126
|
};
|
|
96
127
|
variables.set('DETAIL', true);
|
|
97
|
-
const options =
|
|
128
|
+
const options = computeOptionsFromComponent(definition, {
|
|
129
|
+
variables,
|
|
130
|
+
handleChanges: mockChange,
|
|
131
|
+
pagerIteration: undefined,
|
|
132
|
+
value: undefined,
|
|
133
|
+
logger: mockLogger,
|
|
134
|
+
});
|
|
98
135
|
expect(options).toHaveLength(2);
|
|
99
136
|
expect(options[0].detailLabel).toBe('Precize:');
|
|
100
137
|
expect(options[1].detailLabel).toBe('Precize:');
|
|
@@ -127,7 +164,13 @@ describe('getOptionsProp()', () => {
|
|
|
127
164
|
],
|
|
128
165
|
};
|
|
129
166
|
variables.set('DETAIL', true);
|
|
130
|
-
const options =
|
|
167
|
+
const options = computeOptionsFromComponent(definition, {
|
|
168
|
+
variables,
|
|
169
|
+
handleChanges: mockChange,
|
|
170
|
+
pagerIteration: undefined,
|
|
171
|
+
value: undefined,
|
|
172
|
+
logger: mockLogger,
|
|
173
|
+
});
|
|
131
174
|
expect(options).toHaveLength(2);
|
|
132
175
|
expect(options[0].detailLabel).toBe('Precize:');
|
|
133
176
|
expect(options[1].detailLabel).toBe('Precize:');
|
|
@@ -154,7 +197,13 @@ describe('getOptionsProp()', () => {
|
|
|
154
197
|
},
|
|
155
198
|
],
|
|
156
199
|
};
|
|
157
|
-
const options =
|
|
200
|
+
const options = computeOptionsFromComponent(definition, {
|
|
201
|
+
variables,
|
|
202
|
+
handleChanges: mockChange,
|
|
203
|
+
pagerIteration: undefined,
|
|
204
|
+
value: undefined,
|
|
205
|
+
logger: mockLogger,
|
|
206
|
+
});
|
|
158
207
|
// First option should be filtered out since its conditionFilter is evaluated to false
|
|
159
208
|
expect(options).toHaveLength(1);
|
|
160
209
|
expect(options[0].label).toBe('Option 2');
|
|
@@ -175,7 +224,13 @@ describe('getOptionsProp()', () => {
|
|
|
175
224
|
},
|
|
176
225
|
],
|
|
177
226
|
};
|
|
178
|
-
const options =
|
|
227
|
+
const options = computeOptionsFromComponent(definition, {
|
|
228
|
+
variables,
|
|
229
|
+
handleChanges: mockChange,
|
|
230
|
+
pagerIteration: undefined,
|
|
231
|
+
value: undefined,
|
|
232
|
+
logger: mockLogger,
|
|
233
|
+
});
|
|
179
234
|
// First option should be filtered out since its conditionFilter is evaluated to false
|
|
180
235
|
expect(options).toHaveLength(1);
|
|
181
236
|
expect(options[0].label).toBe('Option 2');
|
|
@@ -196,7 +251,13 @@ describe('getOptionsProp()', () => {
|
|
|
196
251
|
vi.spyOn(variables, 'run').mockImplementation(() => {
|
|
197
252
|
throw new Error('Test error');
|
|
198
253
|
});
|
|
199
|
-
const options =
|
|
254
|
+
const options = computeOptionsFromComponent(definition, {
|
|
255
|
+
variables,
|
|
256
|
+
handleChanges: mockChange,
|
|
257
|
+
pagerIteration: undefined,
|
|
258
|
+
value: undefined,
|
|
259
|
+
logger: mockLogger,
|
|
260
|
+
});
|
|
200
261
|
// Ensure the option is not filtered
|
|
201
262
|
expect(options).toHaveLength(1);
|
|
202
263
|
expect(options[0].shouldBeFiltered).toBe(false);
|
|
@@ -216,7 +277,13 @@ describe('getOptionsProp()', () => {
|
|
|
216
277
|
vi.spyOn(variables, 'run').mockImplementation(() => {
|
|
217
278
|
throw new Error('Test error');
|
|
218
279
|
});
|
|
219
|
-
const options =
|
|
280
|
+
const options = computeOptionsFromComponent(definition, {
|
|
281
|
+
variables,
|
|
282
|
+
handleChanges: mockChange,
|
|
283
|
+
pagerIteration: undefined,
|
|
284
|
+
value: undefined,
|
|
285
|
+
logger: mockLogger,
|
|
286
|
+
});
|
|
220
287
|
// Ensure the option is not filtered
|
|
221
288
|
expect(options).toHaveLength(1);
|
|
222
289
|
expect(options[0].shouldBeFiltered).toBe(false);
|
|
@@ -237,8 +304,14 @@ describe('getOptionsProp()', () => {
|
|
|
237
304
|
vi.spyOn(variables, 'run').mockImplementation(() => {
|
|
238
305
|
return false;
|
|
239
306
|
});
|
|
240
|
-
const options =
|
|
241
|
-
|
|
307
|
+
const options = computeOptionsFromComponent(definition, {
|
|
308
|
+
variables,
|
|
309
|
+
handleChanges: mockChange,
|
|
310
|
+
pagerIteration: undefined,
|
|
311
|
+
value: undefined,
|
|
312
|
+
logger: mockLogger,
|
|
313
|
+
disableFilters: true,
|
|
314
|
+
});
|
|
242
315
|
// Ensure the option is not filtered
|
|
243
316
|
expect(options).toHaveLength(1);
|
|
244
317
|
// the option should would have been filtered if we did not disable filters
|
|
@@ -259,8 +332,14 @@ describe('getOptionsProp()', () => {
|
|
|
259
332
|
vi.spyOn(variables, 'run').mockImplementation(() => {
|
|
260
333
|
return false;
|
|
261
334
|
});
|
|
262
|
-
const options =
|
|
263
|
-
|
|
335
|
+
const options = computeOptionsFromComponent(definition, {
|
|
336
|
+
variables,
|
|
337
|
+
handleChanges: mockChange,
|
|
338
|
+
pagerIteration: undefined,
|
|
339
|
+
value: undefined,
|
|
340
|
+
logger: mockLogger,
|
|
341
|
+
disableFilters: true,
|
|
342
|
+
});
|
|
264
343
|
// Ensure the option is not filtered
|
|
265
344
|
expect(options).toHaveLength(1);
|
|
266
345
|
// the option should would have been filtered if we did not disable filters
|
|
@@ -278,9 +357,15 @@ describe('getOptionsProp()', () => {
|
|
|
278
357
|
},
|
|
279
358
|
],
|
|
280
359
|
};
|
|
281
|
-
const options =
|
|
282
|
-
|
|
283
|
-
|
|
360
|
+
const options = computeOptionsFromComponent(definition, {
|
|
361
|
+
variables,
|
|
362
|
+
handleChanges: mockChange,
|
|
363
|
+
pagerIteration: undefined,
|
|
364
|
+
value: undefined,
|
|
365
|
+
logger: mockLogger,
|
|
366
|
+
disableFilters: true,
|
|
367
|
+
shouldParentBeFiltered: true,
|
|
368
|
+
});
|
|
284
369
|
// Ensure the option is not filtered
|
|
285
370
|
expect(options).toHaveLength(1);
|
|
286
371
|
// the option would have been filtered if we did not disable filters because its parent would
|
|
@@ -297,14 +382,93 @@ describe('getOptionsProp()', () => {
|
|
|
297
382
|
},
|
|
298
383
|
],
|
|
299
384
|
};
|
|
300
|
-
const options =
|
|
301
|
-
|
|
302
|
-
|
|
385
|
+
const options = computeOptionsFromComponent(definition, {
|
|
386
|
+
variables,
|
|
387
|
+
handleChanges: mockChange,
|
|
388
|
+
pagerIteration: undefined,
|
|
389
|
+
value: undefined,
|
|
390
|
+
logger: mockLogger,
|
|
391
|
+
disableFilters: true,
|
|
392
|
+
shouldParentBeFiltered: true,
|
|
393
|
+
});
|
|
303
394
|
// Ensure the option is not filtered
|
|
304
395
|
expect(options).toHaveLength(1);
|
|
305
396
|
// the option would have been filtered if we did not disable filters because its parent would
|
|
306
397
|
expect(options[0].shouldBeFiltered).toBe(true);
|
|
307
398
|
});
|
|
308
399
|
});
|
|
400
|
+
describe('Options based on a source variable', () => {
|
|
401
|
+
const radioOptionSourceDefinition = {
|
|
402
|
+
id: 'RadioGroupDynamic',
|
|
403
|
+
componentType: 'Radio',
|
|
404
|
+
response: { name: 'RADIO' },
|
|
405
|
+
optionSource: 'NAME',
|
|
406
|
+
};
|
|
407
|
+
it('should build options when the source variable is an array of strings', () => {
|
|
408
|
+
variables.set('NAME', ['Maëlle', 'Verso']);
|
|
409
|
+
const options = computeOptionsFromComponent(radioOptionSourceDefinition, {
|
|
410
|
+
variables,
|
|
411
|
+
handleChanges: mockChange,
|
|
412
|
+
pagerIteration: undefined,
|
|
413
|
+
value: undefined,
|
|
414
|
+
logger: mockLogger,
|
|
415
|
+
}); // force type but it should infer type correctly
|
|
416
|
+
expect(options).toHaveLength(2);
|
|
417
|
+
expect(options[0].value).toBe('Maëlle');
|
|
418
|
+
expect(options[0].label).toBe('Maëlle');
|
|
419
|
+
expect(options[1].value).toBe('Verso');
|
|
420
|
+
expect(options[1].label).toBe('Verso');
|
|
421
|
+
});
|
|
422
|
+
it('should build options when the source variable is an array of numbers', () => {
|
|
423
|
+
variables.set('NAME', [10, 20]);
|
|
424
|
+
const options = computeOptionsFromComponent(radioOptionSourceDefinition, {
|
|
425
|
+
variables,
|
|
426
|
+
handleChanges: mockChange,
|
|
427
|
+
pagerIteration: undefined,
|
|
428
|
+
value: undefined,
|
|
429
|
+
logger: mockLogger,
|
|
430
|
+
}); // force type but it should infer type correctly
|
|
431
|
+
expect(options).toHaveLength(2);
|
|
432
|
+
expect(options[0].value).toBe(10);
|
|
433
|
+
expect(options[0].label).toBe('10');
|
|
434
|
+
expect(options[1].value).toBe(20);
|
|
435
|
+
expect(options[1].label).toBe('20');
|
|
436
|
+
});
|
|
437
|
+
it('should set the response when selecting a dynamic option', () => {
|
|
438
|
+
var _a, _b, _c, _d;
|
|
439
|
+
variables.set('NAME', ['Maëlle', 'Verso']);
|
|
440
|
+
const options = computeOptionsFromComponent(radioOptionSourceDefinition, {
|
|
441
|
+
variables,
|
|
442
|
+
handleChanges: mockChange,
|
|
443
|
+
pagerIteration: undefined,
|
|
444
|
+
value: undefined,
|
|
445
|
+
logger: mockLogger,
|
|
446
|
+
}); // force type but it should infer type correctly
|
|
447
|
+
(_b = (_a = options[0]).onCheck) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
448
|
+
expect(mockChange).toHaveBeenLastCalledWith([
|
|
449
|
+
{ name: 'RADIO', value: 'Maëlle' },
|
|
450
|
+
]);
|
|
451
|
+
(_d = (_c = options[1]).onCheck) === null || _d === void 0 ? void 0 : _d.call(_c);
|
|
452
|
+
expect(mockChange).toHaveBeenLastCalledWith([
|
|
453
|
+
{ name: 'RADIO', value: 'Verso' },
|
|
454
|
+
]);
|
|
455
|
+
});
|
|
456
|
+
it('should filter options based on the optionFilter expression', () => {
|
|
457
|
+
const definition = {
|
|
458
|
+
...radioOptionSourceDefinition,
|
|
459
|
+
optionFilter: { type: 'VTL', value: 'AGE >= 18' },
|
|
460
|
+
};
|
|
461
|
+
variables.set('NAME', ['Maëlle', 'Verso', 'Aline']);
|
|
462
|
+
variables.set('AGE', [16, 30, 50]);
|
|
463
|
+
const options = computeOptionsFromComponent(definition, {
|
|
464
|
+
variables,
|
|
465
|
+
handleChanges: mockChange,
|
|
466
|
+
pagerIteration: undefined,
|
|
467
|
+
value: undefined,
|
|
468
|
+
logger: mockLogger,
|
|
469
|
+
}); // force type but it should infer type correctly
|
|
470
|
+
expect(options.map((option) => option.value)).toEqual(['Verso', 'Aline']);
|
|
471
|
+
});
|
|
472
|
+
});
|
|
309
473
|
});
|
|
310
474
|
//# sourceMappingURL=propOptions.spec.js.map
|