@inseefr/lunatic 3.4.19 → 3.4.21

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.
Files changed (57) hide show
  1. package/components/Duration/Duration.js +3 -2
  2. package/components/Duration/Duration.js.map +1 -1
  3. package/components/Loop/Loop.js +1 -1
  4. package/components/Loop/Loop.js.map +1 -1
  5. package/components/Loop/Loop.spec.d.ts +1 -0
  6. package/components/Loop/Loop.spec.js +39 -0
  7. package/components/Loop/Loop.spec.js.map +1 -0
  8. package/esm/components/Duration/Duration.js +3 -2
  9. package/esm/components/Duration/Duration.js.map +1 -1
  10. package/esm/components/Loop/Loop.js +1 -1
  11. package/esm/components/Loop/Loop.js.map +1 -1
  12. package/esm/components/Loop/Loop.spec.d.ts +1 -0
  13. package/esm/components/Loop/Loop.spec.js +37 -0
  14. package/esm/components/Loop/Loop.spec.js.map +1 -0
  15. package/esm/type.source.js +0 -1
  16. package/esm/type.source.js.map +1 -1
  17. package/esm/use-lunatic/commons/variables/lunatic-variables-store.d.ts +1 -1
  18. package/esm/use-lunatic/commons/variables/lunatic-variables-store.js +4 -2
  19. package/esm/use-lunatic/commons/variables/lunatic-variables-store.js.map +1 -1
  20. package/esm/use-lunatic/commons/variables/lunatic-variables-store.spec.js +71 -0
  21. package/esm/use-lunatic/commons/variables/lunatic-variables-store.spec.js.map +1 -1
  22. package/esm/use-lunatic/hooks/use-page-has-response.js +2 -1
  23. package/esm/use-lunatic/hooks/use-page-has-response.js.map +1 -1
  24. package/esm/use-lunatic/props/propValue.js +3 -2
  25. package/esm/use-lunatic/props/propValue.js.map +1 -1
  26. package/esm/use-lunatic/props/propValue.spec.js +48 -0
  27. package/esm/use-lunatic/props/propValue.spec.js.map +1 -1
  28. package/esm/use-lunatic/reducer/reducerInitializer.js +1 -1
  29. package/esm/use-lunatic/reducer/reducerInitializer.js.map +1 -1
  30. package/package.json +9 -1
  31. package/src/components/Duration/Duration.test.tsx +52 -0
  32. package/src/components/Duration/Duration.tsx +17 -4
  33. package/src/components/Loop/Loop.spec.tsx +77 -0
  34. package/src/components/Loop/Loop.tsx +1 -1
  35. package/src/type.source.ts +0 -1
  36. package/src/use-lunatic/commons/variables/lunatic-variables-store.spec.ts +79 -0
  37. package/src/use-lunatic/commons/variables/lunatic-variables-store.ts +5 -2
  38. package/src/use-lunatic/hooks/use-page-has-response.ts +1 -0
  39. package/src/use-lunatic/props/propValue.spec.ts +52 -0
  40. package/src/use-lunatic/props/propValue.ts +5 -2
  41. package/src/use-lunatic/reducer/reducerInitializer.tsx +2 -1
  42. package/tsconfig.build.tsbuildinfo +1 -1
  43. package/type.source.js +0 -1
  44. package/type.source.js.map +1 -1
  45. package/use-lunatic/commons/variables/lunatic-variables-store.d.ts +1 -1
  46. package/use-lunatic/commons/variables/lunatic-variables-store.js +4 -2
  47. package/use-lunatic/commons/variables/lunatic-variables-store.js.map +1 -1
  48. package/use-lunatic/commons/variables/lunatic-variables-store.spec.js +94 -0
  49. package/use-lunatic/commons/variables/lunatic-variables-store.spec.js.map +1 -1
  50. package/use-lunatic/hooks/use-page-has-response.js +2 -1
  51. package/use-lunatic/hooks/use-page-has-response.js.map +1 -1
  52. package/use-lunatic/props/propValue.js +3 -2
  53. package/use-lunatic/props/propValue.js.map +1 -1
  54. package/use-lunatic/props/propValue.spec.js +48 -0
  55. package/use-lunatic/props/propValue.spec.js.map +1 -1
  56. package/use-lunatic/reducer/reducerInitializer.js +1 -1
  57. package/use-lunatic/reducer/reducerInitializer.js.map +1 -1
@@ -97,5 +97,53 @@ describe('fillComponentValue', () => {
97
97
  });
98
98
  });
99
99
  });
100
+ describe('RosterForLoop', () => {
101
+ const rosterForLoopComponent = {
102
+ id: 'loop-prenom',
103
+ componentType: 'RosterForLoop',
104
+ bindingDependencies: ['PRENOM'],
105
+ lines: {
106
+ min: {
107
+ value: '1',
108
+ type: 'VTL',
109
+ },
110
+ max: {
111
+ value: '10',
112
+ type: 'VTL',
113
+ },
114
+ },
115
+ page: '1',
116
+ components: [
117
+ {
118
+ componentType: 'Input',
119
+ label: {
120
+ value: '"Prénom"',
121
+ type: 'VTL|MD',
122
+ },
123
+ conditionFilter: {
124
+ value: 'true',
125
+ type: 'VTL',
126
+ },
127
+ maxLength: 30,
128
+ bindingDependencies: ['PRENOM'],
129
+ id: 'prenom',
130
+ response: {
131
+ name: 'PRENOM',
132
+ },
133
+ },
134
+ ],
135
+ };
136
+ it('should correctly extract values from nested responses as arrays', () => {
137
+ const values = {
138
+ PRENOM: ['Alice', 'Bob', 'Charlie'],
139
+ };
140
+ expectFilledComponent(rosterForLoopComponent, values).toEqual(values);
141
+ });
142
+ it('should return null for missing responses', () => {
143
+ expectFilledComponent(rosterForLoopComponent).toEqual({
144
+ PRENOM: null,
145
+ });
146
+ });
147
+ });
100
148
  });
101
149
  //# sourceMappingURL=propValue.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"propValue.spec.js","sourceRoot":"","sources":["../../../src/use-lunatic/props/propValue.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propValue.spec.js","sourceRoot":"","sources":["../../../src/use-lunatic/props/propValue.spec.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,7 @@ const baseState = {
31
31
  };
32
32
  export function reducerInitializer({ source, data, features = ['VTL'], initialPage = '1', lastReachedPage = undefined, withOverview = false, disableFilters = false, getReferentiel, onVariableChange, logger, }) {
33
33
  var _a;
34
- const variables = LunaticVariablesStore.makeFromSource(source, data, onVariableChange);
34
+ const variables = LunaticVariablesStore.makeFromSource(source, data, onVariableChange, disableFilters);
35
35
  const pages = checkLoops(createMapPages(source));
36
36
  if (!source || !data) {
37
37
  return baseState;
@@ -1 +1 @@
1
- {"version":3,"file":"reducerInitializer.js","sourceRoot":"","sources":["../../../src/use-lunatic/reducer/reducerInitializer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reducerInitializer.js","sourceRoot":"","sources":["../../../src/use-lunatic/reducer/reducerInitializer.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inseefr/lunatic",
3
- "version": "3.4.19",
3
+ "version": "3.4.21",
4
4
  "description": "Library of questionnaire components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,6 +51,7 @@
51
51
  "src/components/Dropdown/__snapshots__/Dropdown.spec.tsx.snap",
52
52
  "src/components/Dropdown/renderer/SimpleLabelRenderer.tsx",
53
53
  "src/components/Dropdown/renderer/SimpleOptionRenderer.tsx",
54
+ "src/components/Duration/Duration.test.tsx",
54
55
  "src/components/Duration/Duration.tsx",
55
56
  "src/components/Duration/durationUtils.ts",
56
57
  "src/components/Duration/formatDuration.spec.ts",
@@ -65,6 +66,7 @@
65
66
  "src/components/InputNumber/InputNumber.tsx",
66
67
  "src/components/InputNumber/InputNumberThousand.tsx",
67
68
  "src/components/InputNumber/__snapshots__/InputNumber.spec.tsx.snap",
69
+ "src/components/Loop/Loop.spec.tsx",
68
70
  "src/components/Loop/Loop.tsx",
69
71
  "src/components/Loop/constant.ts",
70
72
  "src/components/LunaticComponents.tsx",
@@ -557,6 +559,9 @@
557
559
  "components/Loop/Loop.d.ts",
558
560
  "components/Loop/Loop.js",
559
561
  "components/Loop/Loop.js.map",
562
+ "components/Loop/Loop.spec.d.ts",
563
+ "components/Loop/Loop.spec.js",
564
+ "components/Loop/Loop.spec.js.map",
560
565
  "components/Loop/constant.d.ts",
561
566
  "components/Loop/constant.js",
562
567
  "components/Loop/constant.js.map",
@@ -974,6 +979,9 @@
974
979
  "esm/components/Loop/Loop.d.ts",
975
980
  "esm/components/Loop/Loop.js",
976
981
  "esm/components/Loop/Loop.js.map",
982
+ "esm/components/Loop/Loop.spec.d.ts",
983
+ "esm/components/Loop/Loop.spec.js",
984
+ "esm/components/Loop/Loop.spec.js.map",
977
985
  "esm/components/Loop/constant.d.ts",
978
986
  "esm/components/Loop/constant.js",
979
987
  "esm/components/Loop/constant.js.map",
@@ -0,0 +1,52 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { Duration } from './Duration';
3
+ import { render } from '@testing-library/react';
4
+ import { Formats } from './durationUtils';
5
+
6
+ describe('Duration', () => {
7
+ const mockOnChange = vi.fn();
8
+
9
+ const baseDeclarations = [
10
+ {
11
+ id: '1',
12
+ label: 'Declaration 1',
13
+ declarationType: 'COMMENT' as const,
14
+ position: 'AFTER_QUESTION_TEXT',
15
+ },
16
+ {
17
+ id: '2',
18
+ label: 'Declaration 2',
19
+ declarationType: 'COMMENT' as const,
20
+ position: 'AFTER_QUESTION_TEXT',
21
+ },
22
+ ];
23
+
24
+ const baseProps = {
25
+ handleChanges: mockOnChange,
26
+ response: { name: 'demo' },
27
+ format: 'PTnHnM' as Formats,
28
+ value: 'PT5H1M',
29
+ id: 'duration',
30
+ label: 'label',
31
+ description: 'description',
32
+ declarations: baseDeclarations,
33
+ };
34
+
35
+ afterEach(() => {
36
+ vi.clearAllMocks();
37
+ });
38
+
39
+ it('renders label, declarations and description', () => {
40
+ const { getByText } = render(<Duration {...baseProps} />);
41
+
42
+ // label is displayed
43
+ expect(getByText(baseProps.label)).toBeInTheDocument();
44
+
45
+ // all declarations are displayed
46
+ expect(getByText('Declaration 1')).toBeInTheDocument();
47
+ expect(getByText('Declaration 2')).toBeInTheDocument();
48
+
49
+ // description is displayed
50
+ expect(getByText(baseProps.description)).toBeInTheDocument();
51
+ });
52
+ });
@@ -12,6 +12,7 @@ import {
12
12
  getComponentErrors,
13
13
  } from '../shared/ComponentErrors/ComponentErrors';
14
14
  import { Declarations } from '../shared/Declarations/Declarations';
15
+ import { Fieldset } from '../shared/Fieldset/Fieldset';
15
16
 
16
17
  export function Duration({
17
18
  handleChanges,
@@ -39,7 +40,16 @@ type CustomProps = Omit<
39
40
  export const CustomDuration = slottableComponent<CustomProps>(
40
41
  'Duration',
41
42
  (props) => {
42
- const { errors, value, label, format, onChange, declarations, id } = props;
43
+ const {
44
+ errors,
45
+ value,
46
+ label,
47
+ format,
48
+ onChange,
49
+ declarations,
50
+ id,
51
+ description,
52
+ } = props;
43
53
  // We need to keep an internal state since one field can be empty (null value in duration)
44
54
  // but we still send "0" and we don't want the field to display "0"
45
55
  const [duration, setDuration] = useState(
@@ -66,8 +76,11 @@ export const CustomDuration = slottableComponent<CustomProps>(
66
76
  };
67
77
 
68
78
  return (
69
- <fieldset className={classnames('lunatic-input')}>
70
- {label && <legend>{label}</legend>}
79
+ <Fieldset
80
+ className={classnames('lunatic-input')}
81
+ legend={label}
82
+ description={description}
83
+ >
71
84
  <Declarations
72
85
  type="AFTER_QUESTION_TEXT"
73
86
  declarations={declarations}
@@ -91,7 +104,7 @@ export const CustomDuration = slottableComponent<CustomProps>(
91
104
  ))}
92
105
  </div>
93
106
  <ComponentErrors errors={errors} />
94
- </fieldset>
107
+ </Fieldset>
95
108
  );
96
109
  }
97
110
  );
@@ -0,0 +1,77 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { Loop } from './Loop';
4
+ import type { LunaticComponentProps } from '../type';
5
+
6
+ describe('Loop', () => {
7
+ const mockOnChange = vi.fn();
8
+
9
+ beforeEach(() => {
10
+ mockOnChange.mockClear();
11
+ });
12
+
13
+ const getComponents = (iteration: number) => [
14
+ {
15
+ componentType: 'Input',
16
+ maxLength: 249,
17
+ id: 'nameId',
18
+ response: {
19
+ name: 'name',
20
+ },
21
+ iteration: iteration,
22
+ value: 'Jonathan Doe',
23
+ } as LunaticComponentProps<'Input'>,
24
+ ];
25
+
26
+ it('render the right number of lines by default', () => {
27
+ render(
28
+ <Loop
29
+ value={{ name: ['John Doe', 'Jane Doe'] }}
30
+ handleChanges={mockOnChange}
31
+ label="Ceci est un test"
32
+ id="table"
33
+ lines={{ min: 4, max: 10 }}
34
+ iterations={2}
35
+ getComponents={getComponents}
36
+ executeExpression={() => null as any}
37
+ />
38
+ );
39
+ expect(screen.getAllByRole('textbox')).toHaveLength(4);
40
+ });
41
+
42
+ it('disables the remove row button when the minimum number of rows is reached', () => {
43
+ render(
44
+ <Loop
45
+ value={{ name: ['John Doe', 'Jane Doe', 'Alice', 'Bob'] }}
46
+ handleChanges={mockOnChange}
47
+ label="Ceci est un test"
48
+ id="table"
49
+ lines={{ min: 4, max: 10 }}
50
+ iterations={4}
51
+ getComponents={getComponents}
52
+ executeExpression={() => null as any}
53
+ />
54
+ );
55
+
56
+ const Button = screen.getByRole('button', { name: /remove/i });
57
+ expect(Button).toBeDisabled();
58
+ });
59
+
60
+ it('enables the add row button when the maximum number of rows is not reached', () => {
61
+ render(
62
+ <Loop
63
+ value={{ name: ['John Doe', 'Jane Doe', 'Alice'] }}
64
+ handleChanges={mockOnChange}
65
+ label="Ceci est un test"
66
+ id="table"
67
+ lines={{ min: 2, max: 10 }}
68
+ iterations={3}
69
+ getComponents={getComponents}
70
+ executeExpression={() => null as any}
71
+ />
72
+ );
73
+
74
+ const Button = screen.getByRole('button', { name: /add/i });
75
+ expect(Button).not.toBeDisabled();
76
+ });
77
+ });
@@ -60,7 +60,7 @@ export function Loop({
60
60
  {...props}
61
61
  errors={getComponentErrors(errors, props.id)}
62
62
  addRow={nbRows === max ? undefined : addRow}
63
- removeRow={nbRows === 1 ? undefined : removeRow}
63
+ removeRow={nbRows === 1 || nbRows === min ? undefined : removeRow}
64
64
  canControlRows={min !== max && Number.isFinite(max)}
65
65
  >
66
66
  {times(nbRows, (n) => (
@@ -1,4 +1,3 @@
1
- /* eslint-disable */
2
1
  /**
3
2
  * This file was automatically generated by json-schema-to-typescript.
4
3
  * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
@@ -1,5 +1,6 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
2
  import { cleaningBehaviour } from './behaviours/cleaning-behaviour';
3
+ import * as cleaningModule from './behaviours/cleaning-behaviour';
3
4
  import { missingBehaviour } from './behaviours/missing-behaviour';
4
5
  import { resizingBehaviour } from './behaviours/resizing-behaviour';
5
6
  import { LunaticVariablesStore } from './lunatic-variables-store';
@@ -480,5 +481,83 @@ describe('lunatic-variables-store', () => {
480
481
  store.set('NOM', 'Doe');
481
482
  expect(store.get('PRENOM')).toEqual('John');
482
483
  });
484
+ it('should enable cleaning when disableCleaning = false', () => {
485
+ const cleaningSpy = vi.spyOn(cleaningModule, 'cleaningBehaviour');
486
+ LunaticVariablesStore.makeFromSource(
487
+ {
488
+ components: [],
489
+ variables: [
490
+ {
491
+ name: 'PRENOM',
492
+ values: {
493
+ COLLECTED: 'John',
494
+ },
495
+ variableType: 'COLLECTED',
496
+ },
497
+ {
498
+ name: 'NOM',
499
+ values: {
500
+ COLLECTED: '',
501
+ },
502
+ variableType: 'COLLECTED',
503
+ },
504
+ ],
505
+ cleaning: {
506
+ NOM: {
507
+ PRENOM: 'false',
508
+ },
509
+ },
510
+ },
511
+ {
512
+ COLLECTED: {
513
+ PRENOM: {
514
+ COLLECTED: 'Jane',
515
+ },
516
+ },
517
+ },
518
+ { current: () => {} },
519
+ false // enable cleaning
520
+ );
521
+ expect(cleaningSpy).toHaveBeenCalled();
522
+ });
523
+ it('should disable cleaning when disableCleaning = true', () => {
524
+ const cleaningSpy = vi.spyOn(cleaningModule, 'cleaningBehaviour');
525
+ LunaticVariablesStore.makeFromSource(
526
+ {
527
+ components: [],
528
+ variables: [
529
+ {
530
+ name: 'PRENOM',
531
+ values: {
532
+ COLLECTED: 'John',
533
+ },
534
+ variableType: 'COLLECTED',
535
+ },
536
+ {
537
+ name: 'NOM',
538
+ values: {
539
+ COLLECTED: '',
540
+ },
541
+ variableType: 'COLLECTED',
542
+ },
543
+ ],
544
+ cleaning: {
545
+ NOM: {
546
+ PRENOM: 'false',
547
+ },
548
+ },
549
+ },
550
+ {
551
+ COLLECTED: {
552
+ PRENOM: {
553
+ COLLECTED: 'Jane',
554
+ },
555
+ },
556
+ },
557
+ { current: () => {} },
558
+ true // disable cleaning
559
+ );
560
+ expect(cleaningSpy).not.toHaveBeenCalled();
561
+ });
483
562
  });
484
563
  });
@@ -54,7 +54,8 @@ export class LunaticVariablesStore {
54
54
  public static makeFromSource(
55
55
  source: LunaticSource,
56
56
  data: LunaticData,
57
- changeHandler: RefObject<LunaticOptions['onVariableChange']>
57
+ changeHandler: RefObject<LunaticOptions['onVariableChange']>,
58
+ disableCleaning?: boolean
58
59
  ) {
59
60
  const store = new LunaticVariablesStore();
60
61
  if (!source.variables) {
@@ -90,7 +91,9 @@ export class LunaticVariablesStore {
90
91
  }
91
92
  }
92
93
  store.on('change', (e) => changeHandler?.current?.(e.detail));
93
- cleaningBehaviour(store, source.cleaning, sourceValues);
94
+ if (!disableCleaning) {
95
+ cleaningBehaviour(store, source.cleaning, sourceValues);
96
+ }
94
97
  resizingBehaviour(store, source.resizing);
95
98
  missingBehaviour(store, source.missingBlock);
96
99
  return store;
@@ -77,6 +77,7 @@ function hasOneResponse(
77
77
 
78
78
  // For rosterForLoop we need to inspect child components
79
79
  if (
80
+ component.componentType === 'RosterForLoop' &&
80
81
  'components' in component &&
81
82
  Array.isArray(component.components) &&
82
83
  !isSubComponentsEmpty(component.components, executeExpression)
@@ -115,4 +115,56 @@ describe('fillComponentValue', () => {
115
115
  });
116
116
  });
117
117
  });
118
+
119
+ describe('RosterForLoop', () => {
120
+ const rosterForLoopComponent = {
121
+ id: 'loop-prenom',
122
+ componentType: 'RosterForLoop',
123
+ bindingDependencies: ['PRENOM'],
124
+ lines: {
125
+ min: {
126
+ value: '1',
127
+ type: 'VTL',
128
+ },
129
+ max: {
130
+ value: '10',
131
+ type: 'VTL',
132
+ },
133
+ },
134
+ page: '1',
135
+ components: [
136
+ {
137
+ componentType: 'Input',
138
+ label: {
139
+ value: '"Prénom"',
140
+ type: 'VTL|MD',
141
+ },
142
+ conditionFilter: {
143
+ value: 'true',
144
+ type: 'VTL',
145
+ },
146
+ maxLength: 30,
147
+ bindingDependencies: ['PRENOM'],
148
+ id: 'prenom',
149
+ response: {
150
+ name: 'PRENOM',
151
+ },
152
+ },
153
+ ],
154
+ } as any as LunaticComponentDefinition<'RosterForLoop'>;
155
+
156
+ it('should correctly extract values from nested responses as arrays', () => {
157
+ const values = {
158
+ PRENOM: ['Alice', 'Bob', 'Charlie'],
159
+ };
160
+
161
+ expectFilledComponent(rosterForLoopComponent, values).toEqual(values);
162
+ });
163
+
164
+ it('should return null for missing responses', () => {
165
+ expectFilledComponent(rosterForLoopComponent).toEqual({
166
+ PRENOM: null,
167
+ });
168
+ });
169
+ });
118
170
  });
@@ -27,8 +27,11 @@ export function getValueProp(
27
27
  if (hasResponse(component)) {
28
28
  return args.variables.get(component.response.name, iteration);
29
29
  }
30
- // For loop, value will be a map of child component values
31
- if ('components' in component) {
30
+ // For Loop and RosterForLoop, value will be a map of child component values
31
+ if (
32
+ component.componentType === 'Loop' ||
33
+ component.componentType === 'RosterForLoop'
34
+ ) {
32
35
  return getChildResponseValues(component.components, args.variables);
33
36
  }
34
37
  return null;
@@ -64,7 +64,8 @@ export function reducerInitializer({
64
64
  const variables = LunaticVariablesStore.makeFromSource(
65
65
  source,
66
66
  data,
67
- onVariableChange
67
+ onVariableChange,
68
+ disableFilters
68
69
  );
69
70
  const pages = checkLoops(createMapPages(source));
70
71