@inseefr/lunatic 0.3.0-experimental → 0.3.4-experimental

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 (63) hide show
  1. package/lib/index.js +218 -260
  2. package/lib/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/src/components/component-wrapper/controls/validators/datepicker.js +25 -14
  5. package/src/components/component-wrapper/missing/component.js +37 -17
  6. package/src/components/datepicker/component.js +8 -12
  7. package/src/components/declarations/wrappers/input-declarations-wrapper.js +31 -9
  8. package/src/components/dropdown/commons/components/dropdown.js +21 -0
  9. package/src/components/dropdown/dropdown-edit/dropdown-edit.js +4 -1
  10. package/src/components/dropdown/dropdown-simple/dropdown.js +3 -1
  11. package/src/components/input/input-number.js +2 -1
  12. package/src/components/loop-constructor/block/index.js +1 -1
  13. package/src/components/loop-constructor/index.js +1 -1
  14. package/src/components/loop-constructor/roster/index.js +1 -1
  15. package/src/components/loop-constructor/wrapper/body-component.js +3 -0
  16. package/src/components/loop-constructor/wrapper/build-components.js +33 -33
  17. package/src/components/loop-constructor/wrapper/index.js +1 -1
  18. package/src/components/suggester/components/panel/option-container.js +1 -1
  19. package/src/components/suggester/components/suggester-content.js +42 -42
  20. package/src/components/suggester/components/suggester.js +43 -3
  21. package/src/components/suggester/idb-suggester.js +7 -1
  22. package/src/components/suggester/lunatic-suggester.js +1 -0
  23. package/src/components/suggester/suggester-wrapper.js +9 -3
  24. package/src/components/table/table.js +3 -1
  25. package/src/stories/loop-constructor/README.md +27 -27
  26. package/src/stories/loop-constructor/data-input-forced.json +64 -64
  27. package/src/stories/loop-constructor/data-input.json +100 -100
  28. package/src/stories/loop-constructor/data-loop-forced.json +66 -66
  29. package/src/stories/loop-constructor/data-loop-static-forced.json +66 -66
  30. package/src/stories/loop-constructor/data-loop-static.json +81 -81
  31. package/src/stories/loop-constructor/data-loop.json +81 -81
  32. package/src/stories/loop-constructor/data-roster-forced.json +68 -68
  33. package/src/stories/loop-constructor/data-roster.json +83 -83
  34. package/src/stories/loop-constructor/loop-constructor.stories.js +180 -180
  35. package/src/stories/questionnaire/arithmetic-management.json +47 -0
  36. package/src/stories/questionnaire/logement-queen.json +23389 -22705
  37. package/src/stories/questionnaire/logement-s2.json +46027 -44536
  38. package/src/stories/questionnaire/questionnaire.stories.js +46 -13
  39. package/src/stories/questionnaire/update-external/data.json +1 -0
  40. package/src/stories/questionnaire/update-external/questionnaire.json +75 -0
  41. package/src/stories/suggester/data.json +4 -1
  42. package/src/stories/suggester/suggester-workers.stories.js +4 -1
  43. package/src/stories/utils/orchestrator-split.js +119 -0
  44. package/src/stories/utils/orchestrator.js +12 -3
  45. package/src/tests/utils/to-expose/handler/results/res-input-edited.json +158 -158
  46. package/src/tests/utils/to-expose/state/state.spec.js +59 -59
  47. package/src/utils/lib/index.js +1 -0
  48. package/src/utils/lib/pagination/navigation/shared.js +5 -5
  49. package/src/utils/lib/splitting.js +142 -0
  50. package/src/utils/suggester-workers/commons-tokenizer/create-entity-tokenizer.js +4 -2
  51. package/src/utils/suggester-workers/commons-tokenizer/filters/{filter-accents-to-lower.js → filter-accents.js} +2 -2
  52. package/src/utils/suggester-workers/commons-tokenizer/filters/{filter-accents-to-lower.spec.js → filter-accents.spec.js} +1 -1
  53. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-synonyms.js +27 -1
  54. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.js +10 -0
  55. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.spec.js +12 -0
  56. package/src/utils/suggester-workers/commons-tokenizer/index.js +1 -1
  57. package/src/utils/to-expose/handler.js +67 -28
  58. package/src/utils/to-expose/hooks/filter-components.js +106 -106
  59. package/src/utils/to-expose/hooks/index.js +2 -1
  60. package/src/utils/to-expose/hooks/lunatic-split.js +421 -0
  61. package/src/utils/to-expose/hooks/lunatic.js +39 -7
  62. package/src/utils/to-expose/index.js +11 -11
  63. package/src/utils/to-expose/state.js +23 -15
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useMemo, useState } from 'react';
1
+ import React, { useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import SuggesterWrapper from './suggester-wrapper';
4
4
  import createSearching from './searching';
@@ -15,6 +15,9 @@ function IDBSuggester({
15
15
  onSelect,
16
16
  disabled,
17
17
  value,
18
+ focused,
19
+ response,
20
+ logFunction,
18
21
  }) {
19
22
  const [store, setStore] = useState(undefined);
20
23
  const searching = useMemo(
@@ -44,6 +47,9 @@ function IDBSuggester({
44
47
  storeName={storeName}
45
48
  disabled={disabled}
46
49
  value={value}
50
+ focused={focused}
51
+ response={response}
52
+ logFunction={logFunction}
47
53
  />
48
54
  </CheckStore>
49
55
  );
@@ -89,6 +89,7 @@ function Suggester({
89
89
  response={response}
90
90
  id={id}
91
91
  value={value}
92
+ logFunction={logFunction}
92
93
  />
93
94
  </FieldWrapper>
94
95
  </LabelWrapper>
@@ -30,9 +30,12 @@ function SuggesterWrapper({
30
30
  labelRenderer,
31
31
  disabled,
32
32
  value,
33
+ focused,
34
+ response,
35
+ logFunction,
33
36
  }) {
34
37
  const [state, dispatch] = useReducer(reducer, INITIAL_STATE);
35
- const { search, selectedIndex, options } = state;
38
+ const { search, selectedIndex, options, expended } = state;
36
39
 
37
40
  useEffect(
38
41
  function () {
@@ -57,11 +60,11 @@ function SuggesterWrapper({
57
60
 
58
61
  useEffect(
59
62
  function () {
60
- if (selectedIndex !== undefined) {
63
+ if (selectedIndex !== undefined && !expended) {
61
64
  onSelect(options[selectedIndex], selectedIndex);
62
65
  }
63
66
  },
64
- [selectedIndex, onSelect, options]
67
+ [selectedIndex, onSelect, options, expended]
65
68
  );
66
69
 
67
70
  useEffect(
@@ -82,6 +85,9 @@ function SuggesterWrapper({
82
85
  labelRenderer={labelRenderer}
83
86
  onSelect={onSelect}
84
87
  value={value}
88
+ focused={focused}
89
+ response={response}
90
+ logFunction={logFunction}
85
91
  />
86
92
  </SuggesterContext.Provider>
87
93
  );
@@ -24,6 +24,7 @@ const Table = ({
24
24
  management,
25
25
  numberAsTextfield,
26
26
  logFunction,
27
+ ...rest
27
28
  }) => {
28
29
  const minLines = initLines
29
30
  ? Math.max(initLines.min, U.getRosterInitLines(cells))
@@ -79,6 +80,7 @@ const Table = ({
79
80
  style={{ width }}
80
81
  >
81
82
  <Component
83
+ {...rest}
82
84
  label={label || ' '}
83
85
  handleChange={handleChange}
84
86
  preferences={preferences}
@@ -88,7 +90,7 @@ const Table = ({
88
90
  bindings={bindings}
89
91
  {...componentProps}
90
92
  zIndex={cells.length - i || 0}
91
- numberAsTextfield
93
+ numberAsTextfield={numberAsTextfield}
92
94
  logFunction={logFunction}
93
95
  shortcut={false}
94
96
  />
@@ -1,27 +1,27 @@
1
- # LoopConstructor component
2
-
3
- `RosterForLoop` is a LoopConstructor component.
4
-
5
- ## Props
6
-
7
- | Props | Type | Default value | Required | Description |
8
- | :-------------: | :----: | :-----------: | :------: | ------------------------------------- |
9
- | id | string | - | ✓ | Id of the table |
10
- | label | string | "" | | Label of the table |
11
- | preferences \* | array | ["COLLECTED"] | | Preferences to manage table response |
12
- | cells \* | array | [] | | Table cells |
13
- | handleChange | func | - | ✓ | Handler of the table |
14
- | lines | object | {} | | Min and max lines for evolutive table |
15
- | declarations \* | array | [] | | Declarations of the table |
16
- | features | array | [ ] | | Component features for labels |
17
- | bindings | object | [ ] | | Questionnaire bindings |
18
- | positioning \* | string | "DEFAULT" | | Cell options positioning |
19
- | addBtnLabel | string | "Add a line" | | Label of the button to add lines |
20
- | hideBtn | bool | false | | Hide the add button |
21
- | management | bool | false | | Management mode of the table |
22
- | style | object | {} | | Style of the table |
23
-
24
- - `preferences` props has to be an ordered array of `COLLECTED`, `FORCED` or `EDITED`
25
- - `cells` props has to be an array of array's components
26
- - `positioning` props has to be one of `DEFAULT`, `HORIZONTAL` or `VERTICAL`
27
- - `declarations` are documented in the `Declarations` component
1
+ # LoopConstructor component
2
+
3
+ `RosterForLoop` is a LoopConstructor component.
4
+
5
+ ## Props
6
+
7
+ | Props | Type | Default value | Required | Description |
8
+ | :-------------: | :----: | :-----------: | :------: | ------------------------------------- |
9
+ | id | string | - | ✓ | Id of the table |
10
+ | label | string | "" | | Label of the table |
11
+ | preferences \* | array | ["COLLECTED"] | | Preferences to manage table response |
12
+ | cells \* | array | [] | | Table cells |
13
+ | handleChange | func | - | ✓ | Handler of the table |
14
+ | lines | object | {} | | Min and max lines for evolutive table |
15
+ | declarations \* | array | [] | | Declarations of the table |
16
+ | features | array | [ ] | | Component features for labels |
17
+ | bindings | object | [ ] | | Questionnaire bindings |
18
+ | positioning \* | string | "DEFAULT" | | Cell options positioning |
19
+ | addBtnLabel | string | "Add a line" | | Label of the button to add lines |
20
+ | hideBtn | bool | false | | Hide the add button |
21
+ | management | bool | false | | Management mode of the table |
22
+ | style | object | {} | | Style of the table |
23
+
24
+ - `preferences` props has to be an ordered array of `COLLECTED`, `FORCED` or `EDITED`
25
+ - `cells` props has to be an array of array's components
26
+ - `positioning` props has to be one of `DEFAULT`, `HORIZONTAL` or `VERTICAL`
27
+ - `declarations` are documented in the `Declarations` component
@@ -1,64 +1,64 @@
1
- {
2
- "components": [
3
- {
4
- "id": "nn",
5
- "componentType": "InputNumber",
6
- "mandatory": false,
7
- "min": 1,
8
- "max": 4,
9
- "decimals": 0,
10
- "label": "Loop Num",
11
- "response": {
12
- "name": "NUM"
13
- }
14
- },
15
- {
16
- "id": "idLoop",
17
- "label": "boucle individu",
18
- "componentType": "Loop",
19
- "iterations": "NUM",
20
- "conditionFilter": { "value": "true" },
21
- "loopDependencies": ["NUM"],
22
- "bindingDependencies": ["PRENOM", "NUM"],
23
- "components": [
24
- {
25
- "id": "k3ym6x16",
26
- "label": "Prénom :",
27
- "componentType": "Input",
28
- "conditionFilter": { "value": "true" },
29
- "mandatory": false,
30
- "bindingDependencies": ["PRENOM"],
31
- "response": {
32
- "name": "PRENOM"
33
- }
34
- }
35
- ]
36
- }
37
- ],
38
- "variables": [
39
- {
40
- "variableType": "COLLECTED",
41
- "name": "NUM",
42
- "componentRef": "nn",
43
- "values": {
44
- "PREVIOUS": null,
45
- "COLLECTED": "2",
46
- "FORCED": null,
47
- "EDITED": null,
48
- "INPUTED": null
49
- }
50
- },
51
- {
52
- "variableType": "COLLECTED",
53
- "name": "PRENOM",
54
- "componentRef": "idLoop",
55
- "values": {
56
- "PREVIOUS": [null],
57
- "COLLECTED": ["Mauro", "Marco"],
58
- "FORCED": [null],
59
- "EDITED": [null],
60
- "INPUTED": [null]
61
- }
62
- }
63
- ]
64
- }
1
+ {
2
+ "components": [
3
+ {
4
+ "id": "nn",
5
+ "componentType": "InputNumber",
6
+ "mandatory": false,
7
+ "min": 1,
8
+ "max": 4,
9
+ "decimals": 0,
10
+ "label": "Loop Num",
11
+ "response": {
12
+ "name": "NUM"
13
+ }
14
+ },
15
+ {
16
+ "id": "idLoop",
17
+ "label": "boucle individu",
18
+ "componentType": "Loop",
19
+ "iterations": "NUM",
20
+ "conditionFilter": { "value": "true" },
21
+ "loopDependencies": ["NUM"],
22
+ "bindingDependencies": ["PRENOM", "NUM"],
23
+ "components": [
24
+ {
25
+ "id": "k3ym6x16",
26
+ "label": "Prénom :",
27
+ "componentType": "Input",
28
+ "conditionFilter": { "value": "true" },
29
+ "mandatory": false,
30
+ "bindingDependencies": ["PRENOM"],
31
+ "response": {
32
+ "name": "PRENOM"
33
+ }
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "variables": [
39
+ {
40
+ "variableType": "COLLECTED",
41
+ "name": "NUM",
42
+ "componentRef": "nn",
43
+ "values": {
44
+ "PREVIOUS": null,
45
+ "COLLECTED": "2",
46
+ "FORCED": null,
47
+ "EDITED": null,
48
+ "INPUTED": null
49
+ }
50
+ },
51
+ {
52
+ "variableType": "COLLECTED",
53
+ "name": "PRENOM",
54
+ "componentRef": "idLoop",
55
+ "values": {
56
+ "PREVIOUS": [null],
57
+ "COLLECTED": ["Mauro", "Marco"],
58
+ "FORCED": [null],
59
+ "EDITED": [null],
60
+ "INPUTED": [null]
61
+ }
62
+ }
63
+ ]
64
+ }
@@ -1,100 +1,100 @@
1
- {
2
- "components": [
3
- {
4
- "id": "nn",
5
- "componentType": "InputNumber",
6
- "mandatory": false,
7
- "min": 1,
8
- "max": 4,
9
- "decimals": 0,
10
- "label": "Loop Num (affichera le nombre saisi + 1)",
11
- "response": {
12
- "name": "NUM"
13
- },
14
- "missingResponse": {
15
- "name": "NUM_MISSING"
16
- }
17
- },
18
- {
19
- "id": "idLoop",
20
- "label": "boucle individu",
21
- "componentType": "Loop",
22
- "iterations": "NUM_ONE",
23
- "conditionFilter": { "value": "true" },
24
- "loopDependencies": ["NUM_ONE"],
25
- "bindingDependencies": ["PRENOM", "NUM_ONE"],
26
- "missingResponse": {
27
- "name": "ROSTER_MISSING"
28
- },
29
- "components": [
30
- {
31
- "id": "k3ym6x16",
32
- "label": "Prénom :",
33
- "componentType": "Input",
34
- "conditionFilter": { "value": "true" },
35
- "mandatory": false,
36
- "bindingDependencies": ["PRENOM"],
37
- "response": {
38
- "name": "PRENOM"
39
- }
40
- }
41
- ]
42
- }
43
- ],
44
- "variables": [
45
- {
46
- "variableType": "COLLECTED",
47
- "name": "NUM",
48
- "componentRef": "nn",
49
- "values": {
50
- "PREVIOUS": null,
51
- "COLLECTED": null,
52
- "FORCED": null,
53
- "EDITED": null,
54
- "INPUTED": null
55
- }
56
- },
57
- {
58
- "variableType": "COLLECTED",
59
- "name": "NUM_MISSING",
60
- "componentRef": "nn",
61
- "values": {
62
- "PREVIOUS": null,
63
- "COLLECTED": null,
64
- "FORCED": null,
65
- "EDITED": null,
66
- "INPUTED": null
67
- }
68
- },
69
- {
70
- "variableType": "COLLECTED",
71
- "name": "PRENOM",
72
- "componentRef": "idLoop",
73
- "values": {
74
- "PREVIOUS": [null],
75
- "COLLECTED": [null],
76
- "FORCED": [null],
77
- "EDITED": [null],
78
- "INPUTED": [null]
79
- }
80
- },
81
- {
82
- "variableType": "COLLECTED",
83
- "name": "ROSTER_MISSING",
84
- "componentRef": "idLoop",
85
- "values": {
86
- "PREVIOUS": [null],
87
- "COLLECTED": [null],
88
- "FORCED": [null],
89
- "EDITED": [null],
90
- "INPUTED": [null]
91
- }
92
- },
93
- {
94
- "variableType": "CALCULATED",
95
- "expression": "cast(NUM, integer) + 1",
96
- "name": "NUM_ONE",
97
- "bindingDependencies": ["NUM"]
98
- }
99
- ]
100
- }
1
+ {
2
+ "components": [
3
+ {
4
+ "id": "nn",
5
+ "componentType": "InputNumber",
6
+ "mandatory": false,
7
+ "min": 1,
8
+ "max": 4,
9
+ "decimals": 0,
10
+ "label": "Loop Num (affichera le nombre saisi + 1)",
11
+ "response": {
12
+ "name": "NUM"
13
+ },
14
+ "missingResponse": {
15
+ "name": "NUM_MISSING"
16
+ }
17
+ },
18
+ {
19
+ "id": "idLoop",
20
+ "label": "boucle individu",
21
+ "componentType": "Loop",
22
+ "iterations": "NUM_ONE",
23
+ "conditionFilter": { "value": "true" },
24
+ "loopDependencies": ["NUM_ONE"],
25
+ "bindingDependencies": ["PRENOM", "NUM_ONE"],
26
+ "missingResponse": {
27
+ "name": "ROSTER_MISSING"
28
+ },
29
+ "components": [
30
+ {
31
+ "id": "k3ym6x16",
32
+ "label": "Prénom :",
33
+ "componentType": "Input",
34
+ "conditionFilter": { "value": "true" },
35
+ "mandatory": false,
36
+ "bindingDependencies": ["PRENOM"],
37
+ "response": {
38
+ "name": "PRENOM"
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ "variables": [
45
+ {
46
+ "variableType": "COLLECTED",
47
+ "name": "NUM",
48
+ "componentRef": "nn",
49
+ "values": {
50
+ "PREVIOUS": null,
51
+ "COLLECTED": null,
52
+ "FORCED": null,
53
+ "EDITED": null,
54
+ "INPUTED": null
55
+ }
56
+ },
57
+ {
58
+ "variableType": "COLLECTED",
59
+ "name": "NUM_MISSING",
60
+ "componentRef": "nn",
61
+ "values": {
62
+ "PREVIOUS": null,
63
+ "COLLECTED": null,
64
+ "FORCED": null,
65
+ "EDITED": null,
66
+ "INPUTED": null
67
+ }
68
+ },
69
+ {
70
+ "variableType": "COLLECTED",
71
+ "name": "PRENOM",
72
+ "componentRef": "idLoop",
73
+ "values": {
74
+ "PREVIOUS": [null],
75
+ "COLLECTED": [null],
76
+ "FORCED": [null],
77
+ "EDITED": [null],
78
+ "INPUTED": [null]
79
+ }
80
+ },
81
+ {
82
+ "variableType": "COLLECTED",
83
+ "name": "ROSTER_MISSING",
84
+ "componentRef": "idLoop",
85
+ "values": {
86
+ "PREVIOUS": [null],
87
+ "COLLECTED": [null],
88
+ "FORCED": [null],
89
+ "EDITED": [null],
90
+ "INPUTED": [null]
91
+ }
92
+ },
93
+ {
94
+ "variableType": "CALCULATED",
95
+ "expression": "cast(NUM, integer) + 1",
96
+ "name": "NUM_ONE",
97
+ "bindingDependencies": ["NUM"]
98
+ }
99
+ ]
100
+ }
@@ -1,66 +1,66 @@
1
- {
2
- "components": [
3
- {
4
- "id": "k3ylzyo4",
5
- "componentType": "Loop",
6
- "mandatory": true,
7
- "positioning": "HORIZONTAL",
8
- "label": "\"Ajouter un individu\"",
9
- "conditionFilter": { "value": "true" },
10
- "bindingDependencies": ["PRENOM", "AGE"],
11
- "lines": { "min": 1, "max": 3 },
12
- "components": [
13
- {
14
- "componentType": "Input",
15
- "label": "Prénom",
16
- "conditionFilter": { "value": "true" },
17
- "maxLength": 30,
18
- "bindingDependencies": ["PRENOM"],
19
- "id": "k3yn2qmr",
20
- "response": {
21
- "name": "PRENOM"
22
- }
23
- },
24
- {
25
- "componentType": "InputNumber",
26
- "label": "Age",
27
- "conditionFilter": { "value": "true" },
28
- "min": 0,
29
- "max": 120,
30
- "decimals": 0,
31
- "bindingDependencies": ["AGE"],
32
- "id": "k3ymundt",
33
- "response": {
34
- "name": "AGE"
35
- }
36
- }
37
- ]
38
- }
39
- ],
40
- "variables": [
41
- {
42
- "variableType": "COLLECTED",
43
- "name": "PRENOM",
44
- "componentRef": "k3ylzyo4",
45
- "values": {
46
- "PREVIOUS": [null],
47
- "COLLECTED": ["Mauro", "Marco"],
48
- "FORCED": [null],
49
- "EDITED": [null],
50
- "INPUTED": [null]
51
- }
52
- },
53
- {
54
- "variableType": "COLLECTED",
55
- "name": "AGE",
56
- "componentRef": "k3ylzyo4",
57
- "values": {
58
- "PREVIOUS": [null],
59
- "COLLECTED": [null],
60
- "FORCED": [null],
61
- "EDITED": [null],
62
- "INPUTED": [null]
63
- }
64
- }
65
- ]
66
- }
1
+ {
2
+ "components": [
3
+ {
4
+ "id": "k3ylzyo4",
5
+ "componentType": "Loop",
6
+ "mandatory": true,
7
+ "positioning": "HORIZONTAL",
8
+ "label": "\"Ajouter un individu\"",
9
+ "conditionFilter": { "value": "true" },
10
+ "bindingDependencies": ["PRENOM", "AGE"],
11
+ "lines": { "min": 1, "max": 3 },
12
+ "components": [
13
+ {
14
+ "componentType": "Input",
15
+ "label": "Prénom",
16
+ "conditionFilter": { "value": "true" },
17
+ "maxLength": 30,
18
+ "bindingDependencies": ["PRENOM"],
19
+ "id": "k3yn2qmr",
20
+ "response": {
21
+ "name": "PRENOM"
22
+ }
23
+ },
24
+ {
25
+ "componentType": "InputNumber",
26
+ "label": "Age",
27
+ "conditionFilter": { "value": "true" },
28
+ "min": 0,
29
+ "max": 120,
30
+ "decimals": 0,
31
+ "bindingDependencies": ["AGE"],
32
+ "id": "k3ymundt",
33
+ "response": {
34
+ "name": "AGE"
35
+ }
36
+ }
37
+ ]
38
+ }
39
+ ],
40
+ "variables": [
41
+ {
42
+ "variableType": "COLLECTED",
43
+ "name": "PRENOM",
44
+ "componentRef": "k3ylzyo4",
45
+ "values": {
46
+ "PREVIOUS": [null],
47
+ "COLLECTED": ["Mauro", "Marco"],
48
+ "FORCED": [null],
49
+ "EDITED": [null],
50
+ "INPUTED": [null]
51
+ }
52
+ },
53
+ {
54
+ "variableType": "COLLECTED",
55
+ "name": "AGE",
56
+ "componentRef": "k3ylzyo4",
57
+ "values": {
58
+ "PREVIOUS": [null],
59
+ "COLLECTED": [null],
60
+ "FORCED": [null],
61
+ "EDITED": [null],
62
+ "INPUTED": [null]
63
+ }
64
+ }
65
+ ]
66
+ }