@inseefr/lunatic 0.3.0-experimental → 0.3.0-prisme

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 (225) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +25 -23
  3. package/lib/index.esm.js +3539 -0
  4. package/lib/index.esm.js.map +1 -0
  5. package/lib/index.js +240 -282
  6. package/lib/index.js.map +1 -1
  7. package/package.json +179 -173
  8. package/src/components/breadcrumb/breadcrumb.scss +22 -22
  9. package/src/components/checkbox/boolean.js +172 -172
  10. package/src/components/checkbox/checkbox.scss +73 -73
  11. package/src/components/checkbox/group.js +231 -231
  12. package/src/components/checkbox/one.js +11 -11
  13. package/src/components/component-wrapper/controls/component.js +70 -70
  14. package/src/components/component-wrapper/controls/controls.scss +6 -6
  15. package/src/components/component-wrapper/controls/index.js +1 -1
  16. package/src/components/component-wrapper/controls/validators/datepicker.js +44 -33
  17. package/src/components/component-wrapper/controls/validators/index.js +16 -16
  18. package/src/components/component-wrapper/controls/validators/input-number.js +23 -23
  19. package/src/components/component-wrapper/index.js +1 -1
  20. package/src/components/component-wrapper/missing/component.js +200 -180
  21. package/src/components/component-wrapper/missing/index.js +1 -1
  22. package/src/components/component-wrapper/missing/missing.scss +32 -32
  23. package/src/components/component-wrapper/wrapper.js +23 -23
  24. package/src/components/components.js +19 -19
  25. package/src/components/datepicker/component.js +26 -30
  26. package/src/components/declarations/component.js +46 -46
  27. package/src/components/declarations/declarations.scss +40 -40
  28. package/src/components/declarations/wrappers/input-declarations-wrapper.js +328 -302
  29. package/src/components/declarations/wrappers/simple-declarations-wrapper.js +54 -54
  30. package/src/components/dropdown/commons/actions.js +65 -65
  31. package/src/components/dropdown/commons/children-to-option.js +9 -9
  32. package/src/components/dropdown/commons/cleaner-callbacks.js +58 -58
  33. package/src/components/dropdown/commons/components/dropdown-container.js +29 -29
  34. package/src/components/dropdown/commons/components/dropdown.js +204 -183
  35. package/src/components/dropdown/commons/components/panel.js +78 -78
  36. package/src/components/dropdown/commons/event-callbacks/on-mousedown-callback.js +15 -15
  37. package/src/components/dropdown/commons/reducer.js +152 -152
  38. package/src/components/dropdown/commons/tools/index.js +17 -17
  39. package/src/components/dropdown/component.js +135 -135
  40. package/src/components/dropdown/dropdown-edit/dropdown-edit.js +194 -191
  41. package/src/components/dropdown/dropdown-edit/index.js +11 -11
  42. package/src/components/dropdown/dropdown-simple/dropdown.js +173 -171
  43. package/src/components/dropdown/dropdown-simple/index.js +20 -20
  44. package/src/components/dropdown/dropdown.scss +178 -178
  45. package/src/components/icon/icon.scss +15 -15
  46. package/src/components/index.js +2 -0
  47. package/src/components/index.scss +177 -177
  48. package/src/components/input/input-number.js +30 -28
  49. package/src/components/input/input.js +11 -11
  50. package/src/components/input/input.scss +31 -31
  51. package/src/components/loop/component.js +170 -170
  52. package/src/components/loop/loop.scss +13 -13
  53. package/src/components/loop/wrapper.js +15 -15
  54. package/src/components/loop-constructor/block/block.scss +10 -10
  55. package/src/components/loop-constructor/block/component.js +9 -9
  56. package/src/components/loop-constructor/roster/component.js +8 -8
  57. package/src/components/loop-constructor/wrapper/body-component.js +146 -131
  58. package/src/components/loop-constructor/wrapper/component.js +190 -190
  59. package/src/components/modal/component.js +36 -36
  60. package/src/components/modal/index.js +1 -1
  61. package/src/components/modal/modal.scss +33 -33
  62. package/src/components/progress-bar/progress-bar.scss +54 -54
  63. package/src/components/radio/component.js +9 -9
  64. package/src/components/radio/radio.scss +59 -59
  65. package/src/components/sequence/component.js +50 -50
  66. package/src/components/sequence/sequence.scss +10 -10
  67. package/src/components/subsequence/component.js +49 -49
  68. package/src/components/suggester/check-store.js +2 -4
  69. package/src/components/suggester/components/panel/default-option-renderer.js +27 -27
  70. package/src/components/suggester/components/panel/option-container.js +61 -61
  71. package/src/components/suggester/components/panel/panel.js +47 -47
  72. package/src/components/suggester/components/selection/default-label-renderer.js +31 -31
  73. package/src/components/suggester/components/selection/label.js +35 -35
  74. package/src/components/suggester/components/selection/selection.js +50 -50
  75. package/src/components/suggester/components/suggester-content.js +2 -2
  76. package/src/components/suggester/components/suggester.js +128 -88
  77. package/src/components/suggester/components/suggester.scss +101 -101
  78. package/src/components/suggester/default-style.scss +125 -125
  79. package/src/components/suggester/find-best-label/find-best-label.js +51 -51
  80. package/src/components/suggester/find-best-label/index.js +1 -1
  81. package/src/components/suggester/idb-suggester.js +73 -67
  82. package/src/components/suggester/lunatic-suggester.js +140 -139
  83. package/src/components/suggester/searching/create-searching.js +49 -49
  84. package/src/components/suggester/searching/index.js +1 -1
  85. package/src/components/suggester/state-management/actions.js +38 -38
  86. package/src/components/suggester/state-management/reducer/reduce-on-delete-search.js +11 -11
  87. package/src/components/suggester/state-management/reducer/reduce-on-init.js +29 -29
  88. package/src/components/suggester/state-management/reducer/reducer.js +38 -38
  89. package/src/components/suggester/suggester-wrapper.js +127 -121
  90. package/src/components/suggester-loader-widget/loader.js +67 -67
  91. package/src/components/suggester-loader-widget/widget.js +123 -123
  92. package/src/components/table/table.js +173 -171
  93. package/src/components/table/table.scss +26 -26
  94. package/src/components/textarea/component.js +11 -11
  95. package/src/components/textarea/textarea.scss +8 -8
  96. package/src/components/tooltip/tooltip.scss +30 -30
  97. package/src/stories/breadcrumb/breadcrumb.stories.js +21 -21
  98. package/src/stories/checkbox-boolean/data.json +78 -78
  99. package/src/stories/datepicker/data.json +45 -45
  100. package/src/stories/declarations/declarations.stories.js +116 -116
  101. package/src/stories/dropdown/README.md +44 -44
  102. package/src/stories/dropdown/data.json +98 -98
  103. package/src/stories/dropdown/dropdown.stories.js +89 -89
  104. package/src/stories/progress-bar/progress-bar.stories.js +24 -24
  105. package/src/stories/questionnaire/arithmetic-management.json +47 -0
  106. package/src/stories/questionnaire/arithmetic.json +247 -247
  107. package/src/stories/questionnaire/calc-var.json +187 -187
  108. package/src/stories/questionnaire/data-logement.json +2691 -2691
  109. package/src/stories/questionnaire/kish.json +275 -0
  110. package/src/stories/questionnaire/logement-queen.json +23390 -22706
  111. package/src/stories/questionnaire/logement-s2.json +46028 -44537
  112. package/src/stories/questionnaire/logement-sequence.json +26741 -26741
  113. package/src/stories/questionnaire/logement.json +21072 -21072
  114. package/src/stories/questionnaire/loop-and-controls.json +481 -0
  115. package/src/stories/questionnaire/questionnaire.stories.js +236 -172
  116. package/src/stories/questionnaire/update-external/data.json +1 -0
  117. package/src/stories/questionnaire/update-external/questionnaire.json +75 -0
  118. package/src/stories/sequence/sequence.stories.js +32 -32
  119. package/src/stories/subsequence/subsequence.stories.js +32 -32
  120. package/src/stories/suggester/README.md +46 -46
  121. package/src/stories/suggester/bailleurs-sociaux/fetch-bailleurs.js +15 -15
  122. package/src/stories/suggester/bailleurs-sociaux/index.js +2 -2
  123. package/src/stories/suggester/bailleurs-sociaux/option-bailleur-renderer.js +58 -58
  124. package/src/stories/suggester/bailleurs-sociaux/preloader.svg +51 -51
  125. package/src/stories/suggester/bailleurs-sociaux/theme.scss +22 -22
  126. package/src/stories/suggester/bailleurs-sociaux-2021/fetch-bailleurs.js +12 -0
  127. package/src/stories/suggester/bailleurs-sociaux-2021/index.js +1 -0
  128. package/src/stories/suggester/cog-communes/fetch-cog.js +15 -15
  129. package/src/stories/suggester/data-auto.json +232 -232
  130. package/src/stories/suggester/data-vtl.json +82 -82
  131. package/src/stories/suggester/data.json +169 -136
  132. package/src/stories/suggester/naf-rev2/index.js +2 -2
  133. package/src/stories/suggester/naf-rev2/option-naf-renderer.js +17 -17
  134. package/src/stories/suggester/suggester-workers.stories.js +226 -179
  135. package/src/stories/suggester/suggester.stories.js +138 -133
  136. package/src/stories/utils/orchestrator-split.js +119 -0
  137. package/src/stories/utils/orchestrator.js +119 -110
  138. package/src/tests/components/input-number.spec.js +188 -188
  139. package/src/tests/components/loops/roster-loop.json +71 -71
  140. package/src/tests/components/missing-wrapper.spec.js +32 -32
  141. package/src/tests/utils/lib/table/roster.spec.js +25 -25
  142. package/src/tests/utils/to-expose/handler/results/res-input-edited.json +1 -1
  143. package/src/tests/utils/to-expose/init-questionnaire/questionnaire.json +148 -148
  144. package/src/tests/utils/to-expose/init-questionnaire/result.json +181 -181
  145. package/src/utils/components/dragger/dragger.scss +7 -7
  146. package/src/utils/idb-tools/create-db-opener.js +43 -43
  147. package/src/utils/idb-tools/create-open-db.js +25 -25
  148. package/src/utils/idb-tools/idb-bulk-insert.js +96 -96
  149. package/src/utils/idb-tools/index.js +10 -10
  150. package/src/utils/idb-tools/insert-entity.js +15 -15
  151. package/src/utils/idb-tools/open-db.js +13 -13
  152. package/src/utils/idb-tools/open-or-create-db.js +34 -34
  153. package/src/utils/lib/controls/index.js +1 -1
  154. package/src/utils/lib/controls/utils.js +152 -146
  155. package/src/utils/lib/decorator/title-decorator.js +16 -16
  156. package/src/utils/lib/env.js +2 -2
  157. package/src/utils/lib/index.js +21 -20
  158. package/src/utils/lib/input-number.js +1 -1
  159. package/src/utils/lib/options-positioning.js +9 -9
  160. package/src/utils/lib/pagination/navigation/shared.js +256 -256
  161. package/src/utils/lib/prop-types/lines.js +6 -6
  162. package/src/utils/lib/responses.js +11 -11
  163. package/src/utils/lib/splitting.js +142 -0
  164. package/src/utils/lib/style.js +10 -10
  165. package/src/utils/store-tools/auto-load.js +74 -74
  166. package/src/utils/suggester-workers/append-to-index/append.js +25 -25
  167. package/src/utils/suggester-workers/append-to-index/append.worker.js +16 -16
  168. package/src/utils/suggester-workers/append-to-index/create-append-task.js +45 -45
  169. package/src/utils/suggester-workers/append-to-index/index.js +2 -2
  170. package/src/utils/suggester-workers/append-to-index/prepare-entities.js +61 -61
  171. package/src/utils/suggester-workers/append-to-index/store-messages.js +21 -21
  172. package/src/utils/suggester-workers/commons-tokenizer/create-entity-tokenizer.js +56 -54
  173. package/src/utils/suggester-workers/commons-tokenizer/create-fields-tokenizer.js +56 -52
  174. package/src/utils/suggester-workers/commons-tokenizer/create-filter-stop-words.js +17 -17
  175. package/src/utils/suggester-workers/commons-tokenizer/filters/compose-filters.js +10 -10
  176. package/src/utils/suggester-workers/commons-tokenizer/filters/create-filter-stop-words.js +17 -17
  177. package/src/utils/suggester-workers/commons-tokenizer/filters/create-filter-stop-words.spec.js +14 -14
  178. package/src/utils/suggester-workers/commons-tokenizer/filters/{filter-accents-to-lower.js → filter-accents.js} +12 -12
  179. package/src/utils/suggester-workers/commons-tokenizer/filters/{filter-accents-to-lower.spec.js → filter-accents.spec.js} +12 -12
  180. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-double.js +12 -12
  181. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-double.spec.js +20 -20
  182. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-length.js +7 -7
  183. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-length.spec.js +18 -18
  184. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-stemmer.js +13 -13
  185. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-stemmer.spec.js +12 -12
  186. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-synonyms.js +36 -10
  187. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-synonyms.spec.js +12 -12
  188. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.js +10 -0
  189. package/src/utils/suggester-workers/commons-tokenizer/filters/filter-to-lower.spec.js +12 -0
  190. package/src/utils/suggester-workers/commons-tokenizer/filters/index.js +2 -2
  191. package/src/utils/suggester-workers/commons-tokenizer/filters/stop-words.js +118 -118
  192. package/src/utils/suggester-workers/commons-tokenizer/get-regexp-from-pattern.js +8 -8
  193. package/src/utils/suggester-workers/commons-tokenizer/get-stemmer.js +18 -18
  194. package/src/utils/suggester-workers/commons-tokenizer/index.js +9 -8
  195. package/src/utils/suggester-workers/commons-tokenizer/prepare-string-indexation.js +13 -13
  196. package/src/utils/suggester-workers/commons-tokenizer/soft-tokenizer.js +7 -7
  197. package/src/utils/suggester-workers/create-worker.js +56 -56
  198. package/src/utils/suggester-workers/find-best-label/find-best-label.js +39 -39
  199. package/src/utils/suggester-workers/find-best-label/find-best-label.worker.js +40 -40
  200. package/src/utils/suggester-workers/find-best-label/tokenize.js +30 -30
  201. package/src/utils/suggester-workers/find-best-label/tokenize.spec.js +19 -19
  202. package/src/utils/suggester-workers/searching/compute-score.js +33 -33
  203. package/src/utils/suggester-workers/searching/get-db.js +18 -18
  204. package/src/utils/suggester-workers/searching/index.js +1 -1
  205. package/src/utils/suggester-workers/searching/order/create-alphanumeric-orderer.js +20 -20
  206. package/src/utils/suggester-workers/searching/order/index.js +19 -19
  207. package/src/utils/suggester-workers/searching/query-parser/index.js +2 -2
  208. package/src/utils/suggester-workers/searching/query-parser/query-parser-soft.js +7 -7
  209. package/src/utils/suggester-workers/searching/query-parser/query-parser-soft.spec.js +24 -24
  210. package/src/utils/suggester-workers/searching/query-parser/query-parser-tokenized.js +34 -28
  211. package/src/utils/suggester-workers/searching/resolve-query-parser.js +27 -27
  212. package/src/utils/suggester-workers/searching/search-in-index.js +17 -17
  213. package/src/utils/suggester-workers/searching/searching.js +70 -70
  214. package/src/utils/suggester-workers/searching/searching.worker.js +11 -11
  215. package/src/utils/to-expose/calculated-variables.js +113 -113
  216. package/src/utils/to-expose/handler.js +149 -112
  217. package/src/utils/to-expose/hooks/filter-components.js +27 -12
  218. package/src/utils/to-expose/hooks/index.js +2 -1
  219. package/src/utils/to-expose/hooks/lunatic-split.js +428 -0
  220. package/src/utils/to-expose/hooks/lunatic.js +284 -235
  221. package/src/utils/to-expose/index.js +1 -1
  222. package/src/utils/to-expose/init-questionnaire.js +164 -164
  223. package/src/utils/to-expose/interpret/vtl.js +18 -18
  224. package/src/utils/to-expose/state.js +66 -58
  225. package/src/tests/utils/to-expose/hooks/use-lunatic.spec.js +0 -46
@@ -1,164 +1,164 @@
1
- import * as C from '../../constants';
2
- import { getCalculatedVariables } from './calculated-variables';
3
- import { isDev } from '../lib';
4
-
5
- const INITIAL_DEPTH = 1;
6
-
7
- export const mergeQuestionnaireAndData = (questionnaire) => (data) => {
8
- if (!questionnaire || !questionnaire.components) return {};
9
- if (questionnaire.components.length === 0) return questionnaire;
10
- const { components, variables, ...props } = questionnaire;
11
-
12
- const vars = buildVars(data || {})(variables);
13
- const filledComponents = buildFilledComponents(vars[C.COLLECTED])(components)(
14
- INITIAL_DEPTH
15
- );
16
-
17
- return { ...props, components: filledComponents, variables: vars };
18
- };
19
-
20
- const buildVars = (data) => (variables) => {
21
- if (!Array.isArray(variables)) return {};
22
-
23
- if (isDev) {
24
- console.log('Start init vars');
25
- var start = new Date().getTime();
26
- }
27
-
28
- const { COLLECTED: collectedData } = data;
29
- const collected = variables
30
- .filter(({ variableType }) => variableType === C.COLLECTED)
31
- .reduce((acc, { values, name, componentRef }) => {
32
- const d = (collectedData && collectedData[name]) || {};
33
- return {
34
- ...acc,
35
- [name]: {
36
- componentRef,
37
- values: { ...values, ...d },
38
- },
39
- };
40
- }, {});
41
- const EXTERNAL = variables
42
- .filter(({ variableType }) => variableType === C.EXTERNAL)
43
- .reduce((_, v) => ({ ..._, ...initExternalVariable(v)(data) }), {});
44
- const bindings = Object.entries({ ...collected, ...EXTERNAL }).reduce(
45
- (acc, [k, v]) => {
46
- if (!v?.values)
47
- return {
48
- ...acc,
49
- [k]: v,
50
- };
51
- return {
52
- ...acc,
53
- [k]: v.values[C.COLLECTED],
54
- };
55
- },
56
- {}
57
- );
58
-
59
- const calcVarsAsObj = variables
60
- .filter(({ variableType }) => variableType === C.CALCULATED)
61
- .reduce((accV, { name, ...rest }) => ({ ...accV, [name]: rest }), {});
62
-
63
- const CALCULATED = getCalculatedVariables(calcVarsAsObj)({
64
- bindings,
65
- init: true,
66
- });
67
-
68
- if (isDev) console.log(`End init vars: ${new Date().getTime() - start} ms`);
69
-
70
- return {
71
- EXTERNAL,
72
- COLLECTED: collected,
73
- CALCULATED,
74
- };
75
- };
76
-
77
- const buildFilledComponents = (vars) => (components) => (depth) =>
78
- components.map((c) => {
79
- const component = { depth, ...c };
80
- return buildFilledComponent(vars)(component);
81
- });
82
-
83
- export const buildFilledComponent = (vars) => (component) => {
84
- if (component.response) return buildResponseComponent(vars)(component);
85
- else if (component.responses) return buildResponsesComponent(vars)(component);
86
- else if (component.cells) return buildCellsComponent(vars)(component);
87
- else if (component.components)
88
- return buildComponentsComponent(vars)(component);
89
- return component;
90
- };
91
-
92
- export const buildResponseComponent = (vars) => (c) => {
93
- const { missingResponse } = c;
94
- const response = {
95
- name: c.response.name,
96
- values: vars[c.response.name].values,
97
- };
98
- if (missingResponse)
99
- return {
100
- ...c,
101
- response,
102
- missingResponse: {
103
- name: missingResponse.name,
104
- values: vars[missingResponse.name].values,
105
- },
106
- };
107
- return {
108
- ...c,
109
- response,
110
- };
111
- };
112
-
113
- export const buildResponsesComponent = (vars) => (c) => {
114
- const { responses, missingResponse, ...rest } = c;
115
- const filledResponses = responses.map((r) => buildResponseComponent(vars)(r));
116
- if (missingResponse)
117
- return {
118
- ...rest,
119
- responses: filledResponses,
120
- missingResponse: {
121
- name: missingResponse.name,
122
- values: vars[missingResponse.name].values,
123
- },
124
- };
125
- return { ...rest, responses: filledResponses };
126
- };
127
-
128
- export const buildCellsComponent = (vars) => (c) => {
129
- const { cells, depth, missingResponse, ...rest } = c;
130
- const filledCells = cells.map((row) =>
131
- buildFilledComponents(vars)(row)(depth)
132
- );
133
- if (missingResponse)
134
- return {
135
- ...rest,
136
- cells: filledCells,
137
- missingResponse: {
138
- name: missingResponse.name,
139
- values: vars[missingResponse.name].values,
140
- },
141
- };
142
- return { ...rest, depth, cells: filledCells };
143
- };
144
-
145
- export const buildComponentsComponent = (vars) => (component) => {
146
- const { components, depth, missingResponse, ...rest } = component;
147
- const filledComponents = buildFilledComponents(vars)(components)(depth + 1);
148
- if (missingResponse)
149
- return {
150
- ...rest,
151
- components: filledComponents,
152
- missingResponse: {
153
- name: missingResponse.name,
154
- values: vars[missingResponse.name].values,
155
- },
156
- };
157
- return { ...rest, depth, components: filledComponents };
158
- };
159
-
160
- const initExternalVariable =
161
- ({ name }) =>
162
- (data) => ({
163
- [name]: (data && data.EXTERNAL && data.EXTERNAL[name]) || null,
164
- });
1
+ import * as C from '../../constants';
2
+ import { getCalculatedVariables } from './calculated-variables';
3
+ import { isDev } from '../lib';
4
+
5
+ const INITIAL_DEPTH = 1;
6
+
7
+ export const mergeQuestionnaireAndData = (questionnaire) => (data) => {
8
+ if (!questionnaire || !questionnaire.components) return {};
9
+ if (questionnaire.components.length === 0) return questionnaire;
10
+ const { components, variables, ...props } = questionnaire;
11
+
12
+ const vars = buildVars(data || {})(variables);
13
+ const filledComponents = buildFilledComponents(vars[C.COLLECTED])(components)(
14
+ INITIAL_DEPTH
15
+ );
16
+
17
+ return { ...props, components: filledComponents, variables: vars };
18
+ };
19
+
20
+ const buildVars = (data) => (variables) => {
21
+ if (!Array.isArray(variables)) return {};
22
+
23
+ if (isDev) {
24
+ console.log('Start init vars');
25
+ var start = new Date().getTime();
26
+ }
27
+
28
+ const { COLLECTED: collectedData } = data;
29
+ const collected = variables
30
+ .filter(({ variableType }) => variableType === C.COLLECTED)
31
+ .reduce((acc, { values, name, componentRef }) => {
32
+ const d = (collectedData && collectedData[name]) || {};
33
+ return {
34
+ ...acc,
35
+ [name]: {
36
+ componentRef,
37
+ values: { ...values, ...d },
38
+ },
39
+ };
40
+ }, {});
41
+ const EXTERNAL = variables
42
+ .filter(({ variableType }) => variableType === C.EXTERNAL)
43
+ .reduce((_, v) => ({ ..._, ...initExternalVariable(v)(data) }), {});
44
+ const bindings = Object.entries({ ...collected, ...EXTERNAL }).reduce(
45
+ (acc, [k, v]) => {
46
+ if (!v?.values)
47
+ return {
48
+ ...acc,
49
+ [k]: v,
50
+ };
51
+ return {
52
+ ...acc,
53
+ [k]: v.values[C.COLLECTED],
54
+ };
55
+ },
56
+ {}
57
+ );
58
+
59
+ const calcVarsAsObj = variables
60
+ .filter(({ variableType }) => variableType === C.CALCULATED)
61
+ .reduce((accV, { name, ...rest }) => ({ ...accV, [name]: rest }), {});
62
+
63
+ const CALCULATED = getCalculatedVariables(calcVarsAsObj)({
64
+ bindings,
65
+ init: true,
66
+ });
67
+
68
+ if (isDev) console.log(`End init vars: ${new Date().getTime() - start} ms`);
69
+
70
+ return {
71
+ EXTERNAL,
72
+ COLLECTED: collected,
73
+ CALCULATED,
74
+ };
75
+ };
76
+
77
+ const buildFilledComponents = (vars) => (components) => (depth) =>
78
+ components.map((c) => {
79
+ const component = { depth, ...c };
80
+ return buildFilledComponent(vars)(component);
81
+ });
82
+
83
+ export const buildFilledComponent = (vars) => (component) => {
84
+ if (component.response) return buildResponseComponent(vars)(component);
85
+ else if (component.responses) return buildResponsesComponent(vars)(component);
86
+ else if (component.cells) return buildCellsComponent(vars)(component);
87
+ else if (component.components)
88
+ return buildComponentsComponent(vars)(component);
89
+ return component;
90
+ };
91
+
92
+ export const buildResponseComponent = (vars) => (c) => {
93
+ const { missingResponse } = c;
94
+ const response = {
95
+ name: c.response.name,
96
+ values: vars[c.response.name].values,
97
+ };
98
+ if (missingResponse)
99
+ return {
100
+ ...c,
101
+ response,
102
+ missingResponse: {
103
+ name: missingResponse.name,
104
+ values: vars[missingResponse.name].values,
105
+ },
106
+ };
107
+ return {
108
+ ...c,
109
+ response,
110
+ };
111
+ };
112
+
113
+ export const buildResponsesComponent = (vars) => (c) => {
114
+ const { responses, missingResponse, ...rest } = c;
115
+ const filledResponses = responses.map((r) => buildResponseComponent(vars)(r));
116
+ if (missingResponse)
117
+ return {
118
+ ...rest,
119
+ responses: filledResponses,
120
+ missingResponse: {
121
+ name: missingResponse.name,
122
+ values: vars[missingResponse.name].values,
123
+ },
124
+ };
125
+ return { ...rest, responses: filledResponses };
126
+ };
127
+
128
+ export const buildCellsComponent = (vars) => (c) => {
129
+ const { cells, depth, missingResponse, ...rest } = c;
130
+ const filledCells = cells.map((row) =>
131
+ buildFilledComponents(vars)(row)(depth)
132
+ );
133
+ if (missingResponse)
134
+ return {
135
+ ...rest,
136
+ cells: filledCells,
137
+ missingResponse: {
138
+ name: missingResponse.name,
139
+ values: vars[missingResponse.name].values,
140
+ },
141
+ };
142
+ return { ...rest, depth, cells: filledCells };
143
+ };
144
+
145
+ export const buildComponentsComponent = (vars) => (component) => {
146
+ const { components, depth, missingResponse, ...rest } = component;
147
+ const filledComponents = buildFilledComponents(vars)(components)(depth + 1);
148
+ if (missingResponse)
149
+ return {
150
+ ...rest,
151
+ components: filledComponents,
152
+ missingResponse: {
153
+ name: missingResponse.name,
154
+ values: vars[missingResponse.name].values,
155
+ },
156
+ };
157
+ return { ...rest, depth, components: filledComponents };
158
+ };
159
+
160
+ const initExternalVariable =
161
+ ({ name }) =>
162
+ (data) => ({
163
+ [name]: (data && data.EXTERNAL && data.EXTERNAL[name]) || null,
164
+ });
@@ -1,18 +1,18 @@
1
- import { interpret } from '@inseefr/trevas';
2
-
3
- const extractDSValue = (v) => {
4
- if (v !== null && typeof v === 'object') {
5
- const { dataPoints } = v;
6
- return Object.values(dataPoints)[0];
7
- }
8
- return v;
9
- };
10
-
11
- export const interpretVTL = (bindings) => (expression) => {
12
- try {
13
- const res = interpret(expression, bindings);
14
- return extractDSValue(res);
15
- } catch (e) {
16
- return expression;
17
- }
18
- };
1
+ import { interpret } from '@inseefr/trevas';
2
+
3
+ const extractDSValue = (v) => {
4
+ if (v !== null && typeof v === 'object') {
5
+ const { dataPoints } = v;
6
+ return Object.values(dataPoints)[0];
7
+ }
8
+ return v;
9
+ };
10
+
11
+ export const interpretVTL = (bindings) => (expression) => {
12
+ try {
13
+ const res = interpret(expression, bindings);
14
+ return extractDSValue(res);
15
+ } catch (e) {
16
+ return expression;
17
+ }
18
+ };
@@ -1,58 +1,66 @@
1
- import * as C from '../../constants';
2
-
3
- export const getState = (questionnaire) => {
4
- const { variables } = questionnaire;
5
- return {
6
- [C.CALCULATED]: getCalculatedFromVariables(variables),
7
- [C.COLLECTED]: getCollectedState(questionnaire),
8
- [C.EXTERNAL]: getExternalFromVariables(variables),
9
- };
10
- };
11
-
12
- export const getCollectedState = (questionnaire) => {
13
- const { variables } = questionnaire;
14
- return (
15
- (variables &&
16
- variables[C.COLLECTED] &&
17
- Object.entries(variables[C.COLLECTED]).reduce(
18
- (acc, [name, { values }]) => ({ ...acc, [name]: values }),
19
- {}
20
- )) ||
21
- {}
22
- );
23
- };
24
-
25
- const getCalculatedFromVariables = (variables) =>
26
- variables && variables[C.CALCULATED]
27
- ? Object.entries(variables[C.CALCULATED]).reduce(
28
- (_, [name, { value }]) => ({ ..._, [name]: value }),
29
- {}
30
- )
31
- : {};
32
-
33
- const getExternalFromVariables = (variables) =>
34
- (variables && variables[C.EXTERNAL]) || {};
35
-
36
- export const getCollectedStateByValueType = (questionnaire) => (
37
- valueType,
38
- displayNull
39
- ) =>
40
- ['PREVIOUS', 'COLLECTED', 'FORCED', 'EDITED', 'INPUTED'].includes(valueType)
41
- ? Object.entries(getCollectedState(questionnaire)).reduce((_, v) => {
42
- if (displayNull || v[1][valueType] !== null)
43
- return {
44
- ..._,
45
- [v[0]]: v[1][valueType],
46
- };
47
- return _;
48
- }, {})
49
- : {};
50
-
51
- export const getBindings = (questionnaire) => {
52
- const { variables } = questionnaire;
53
- return {
54
- ...getCollectedStateByValueType(questionnaire)('COLLECTED', true),
55
- ...getCalculatedFromVariables(variables),
56
- ...getExternalFromVariables(variables),
57
- };
58
- };
1
+ import * as C from '../../constants';
2
+ import { isDev } from '../lib';
3
+
4
+ export const getState = (questionnaire) => {
5
+ const { variables } = questionnaire;
6
+ return {
7
+ [C.CALCULATED]: getCalculatedFromVariables(variables),
8
+ [C.COLLECTED]: getCollectedState(questionnaire),
9
+ [C.EXTERNAL]: getExternalFromVariables(variables),
10
+ };
11
+ };
12
+
13
+ export const getCollectedState = (questionnaire) => {
14
+ const { variables } = questionnaire;
15
+ return (
16
+ (variables &&
17
+ variables[C.COLLECTED] &&
18
+ Object.entries(variables[C.COLLECTED]).reduce(
19
+ (acc, [name, { values }]) => ({ ...acc, [name]: values }),
20
+ {}
21
+ )) ||
22
+ {}
23
+ );
24
+ };
25
+
26
+ const getCalculatedFromVariables = (variables) =>
27
+ variables && variables[C.CALCULATED]
28
+ ? Object.entries(variables[C.CALCULATED]).reduce(
29
+ (_, [name, { value }]) => ({ ..._, [name]: value }),
30
+ {}
31
+ )
32
+ : {};
33
+
34
+ const getExternalFromVariables = (variables) =>
35
+ (variables && variables[C.EXTERNAL]) || {};
36
+
37
+ export const getCollectedStateByValueType =
38
+ (questionnaire, collectedState) => (valueType, displayNull) =>
39
+ ['PREVIOUS', 'COLLECTED', 'FORCED', 'EDITED', 'INPUTED'].includes(valueType)
40
+ ? Object.entries(
41
+ collectedState || getCollectedState(questionnaire)
42
+ ).reduce((_, v) => {
43
+ if (displayNull || v[1][valueType] !== null)
44
+ return {
45
+ ..._,
46
+ [v[0]]: v[1][valueType],
47
+ };
48
+ return _;
49
+ }, {})
50
+ : {};
51
+
52
+ export const getBindings = (questionnaire) => {
53
+ if (isDev) {
54
+ console.log('Get bindings');
55
+ var start = new Date().getTime();
56
+ }
57
+ const { variables } = questionnaire;
58
+ const bindings = {
59
+ ...getCollectedStateByValueType(questionnaire)('COLLECTED', true),
60
+ ...getCalculatedFromVariables(variables),
61
+ ...getExternalFromVariables(variables),
62
+ };
63
+ if (isDev)
64
+ console.log(`End get bindings: ${new Date().getTime() - start} ms`);
65
+ return bindings;
66
+ };
@@ -1,46 +0,0 @@
1
- import { renderHook, act } from '@testing-library/react-hooks';
2
- import useLunatic from 'utils/to-expose/hooks/lunatic';
3
- import source from '../init-questionnaire/questionnaire';
4
-
5
- describe('useLunatic', () => {
6
- it('with pagination', () => {
7
- const { result } = renderHook(() =>
8
- useLunatic(source, {}, { features: ['VTL', 'MD'], pagination: true })
9
- );
10
- const {
11
- current: {
12
- components,
13
- pagination: { page, goNext, goPrevious },
14
- },
15
- } = result;
16
- expect(components.length).toEqual(2);
17
- expect(page).toEqual('1');
18
-
19
- act(() => {
20
- goNext();
21
- });
22
-
23
- expect(components.length).toEqual(2);
24
- expect(page).toEqual('1');
25
-
26
- act(() => {
27
- goPrevious();
28
- });
29
-
30
- expect(components.length).toEqual(2);
31
- expect(page).toEqual('1');
32
- });
33
- it('with custom props', () => {
34
- renderHook(() =>
35
- useLunatic(
36
- source,
37
- {},
38
- {
39
- management: true,
40
- savingType: 'EDITED',
41
- preferences: ['COLLECTED', 'EDITED'],
42
- }
43
- )
44
- );
45
- });
46
- });