@inseefr/lunatic 3.5.0-rc.2 → 3.5.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.
Files changed (398) hide show
  1. package/components/Datepicker/Datepicker.js +1 -1
  2. package/components/Datepicker/Datepicker.js.map +1 -1
  3. package/components/Duration/Duration.js +3 -2
  4. package/components/Duration/Duration.js.map +1 -1
  5. package/components/Input/Input.js +6 -3
  6. package/components/Input/Input.js.map +1 -1
  7. package/components/Input/Input.spec.js +25 -0
  8. package/components/Input/Input.spec.js.map +1 -1
  9. package/components/InputNumber/InputNumber.js +1 -1
  10. package/components/InputNumber/InputNumber.js.map +1 -1
  11. package/components/InputNumber/InputNumber.spec.js +9 -1
  12. package/components/InputNumber/InputNumber.spec.js.map +1 -1
  13. package/components/InputNumber/InputNumberThousand.d.ts +2 -1
  14. package/components/InputNumber/InputNumberThousand.js +8 -2
  15. package/components/InputNumber/InputNumberThousand.js.map +1 -1
  16. package/components/Loop/Loop.js +1 -1
  17. package/components/Loop/Loop.js.map +1 -1
  18. package/components/Loop/Loop.spec.d.ts +1 -0
  19. package/components/Loop/Loop.spec.js +39 -0
  20. package/components/Loop/Loop.spec.js.map +1 -0
  21. package/components/Roundabout/CustomRoundabout.d.ts +1 -1
  22. package/components/Roundabout/CustomRoundabout.js +4 -3
  23. package/components/Roundabout/CustomRoundabout.js.map +1 -1
  24. package/components/Roundabout/roundabout.spec.js +3 -1
  25. package/components/Roundabout/roundabout.spec.js.map +1 -1
  26. package/components/Textarea/Textarea.js +4 -1
  27. package/components/Textarea/Textarea.js.map +1 -1
  28. package/components/Textarea/Textarea.spec.js +13 -0
  29. package/components/Textarea/Textarea.spec.js.map +1 -1
  30. package/components/shared/CharactersCount/CharactersCount.d.ts +7 -0
  31. package/components/shared/CharactersCount/CharactersCount.js +20 -0
  32. package/components/shared/CharactersCount/CharactersCount.js.map +1 -0
  33. package/components/shared/CharactersCount/CharactersCount.spec.d.ts +1 -0
  34. package/components/shared/CharactersCount/CharactersCount.spec.js +28 -0
  35. package/components/shared/CharactersCount/CharactersCount.spec.js.map +1 -0
  36. package/components/shared/Label/Label.js +1 -1
  37. package/components/shared/Label/Label.js.map +1 -1
  38. package/components/shared/Label/Label.spec.js +11 -3
  39. package/components/shared/Label/Label.spec.js.map +1 -1
  40. package/components/shared/utils/getCharactersCountId.d.ts +4 -0
  41. package/components/shared/utils/getCharactersCountId.js +10 -0
  42. package/components/shared/utils/getCharactersCountId.js.map +1 -0
  43. package/components/type.d.ts +1 -0
  44. package/esm/components/Datepicker/Datepicker.js +1 -1
  45. package/esm/components/Datepicker/Datepicker.js.map +1 -1
  46. package/esm/components/Duration/Duration.js +3 -2
  47. package/esm/components/Duration/Duration.js.map +1 -1
  48. package/esm/components/Input/Input.js +6 -3
  49. package/esm/components/Input/Input.js.map +1 -1
  50. package/esm/components/Input/Input.spec.js +25 -0
  51. package/esm/components/Input/Input.spec.js.map +1 -1
  52. package/esm/components/InputNumber/InputNumber.js +1 -1
  53. package/esm/components/InputNumber/InputNumber.js.map +1 -1
  54. package/esm/components/InputNumber/InputNumber.spec.js +9 -1
  55. package/esm/components/InputNumber/InputNumber.spec.js.map +1 -1
  56. package/esm/components/InputNumber/InputNumberThousand.d.ts +2 -1
  57. package/esm/components/InputNumber/InputNumberThousand.js +8 -2
  58. package/esm/components/InputNumber/InputNumberThousand.js.map +1 -1
  59. package/esm/components/Loop/Loop.js +1 -1
  60. package/esm/components/Loop/Loop.js.map +1 -1
  61. package/esm/components/Loop/Loop.spec.d.ts +1 -0
  62. package/esm/components/Loop/Loop.spec.js +37 -0
  63. package/esm/components/Loop/Loop.spec.js.map +1 -0
  64. package/esm/components/Roundabout/CustomRoundabout.d.ts +1 -1
  65. package/esm/components/Roundabout/CustomRoundabout.js +4 -3
  66. package/esm/components/Roundabout/CustomRoundabout.js.map +1 -1
  67. package/esm/components/Roundabout/roundabout.spec.js +3 -1
  68. package/esm/components/Roundabout/roundabout.spec.js.map +1 -1
  69. package/esm/components/Textarea/Textarea.js +4 -1
  70. package/esm/components/Textarea/Textarea.js.map +1 -1
  71. package/esm/components/Textarea/Textarea.spec.js +13 -0
  72. package/esm/components/Textarea/Textarea.spec.js.map +1 -1
  73. package/esm/components/shared/CharactersCount/CharactersCount.d.ts +7 -0
  74. package/esm/components/shared/CharactersCount/CharactersCount.js +15 -0
  75. package/esm/components/shared/CharactersCount/CharactersCount.js.map +1 -0
  76. package/esm/components/shared/CharactersCount/CharactersCount.spec.d.ts +1 -0
  77. package/esm/components/shared/CharactersCount/CharactersCount.spec.js +26 -0
  78. package/esm/components/shared/CharactersCount/CharactersCount.spec.js.map +1 -0
  79. package/esm/components/shared/Label/Label.js +1 -1
  80. package/esm/components/shared/Label/Label.js.map +1 -1
  81. package/esm/components/shared/Label/Label.spec.js +11 -3
  82. package/esm/components/shared/Label/Label.spec.js.map +1 -1
  83. package/esm/components/shared/utils/getCharactersCountId.d.ts +4 -0
  84. package/esm/components/shared/utils/getCharactersCountId.js +7 -0
  85. package/esm/components/shared/utils/getCharactersCountId.js.map +1 -0
  86. package/esm/components/type.d.ts +1 -0
  87. package/esm/index.d.ts +0 -1
  88. package/esm/index.js +0 -1
  89. package/esm/index.js.map +1 -1
  90. package/esm/main.css +20 -0
  91. package/esm/main.css.map +1 -1
  92. package/esm/stories/overview/sourceWithHierarchy.json +5151 -0
  93. package/esm/tests/utils/lunatic.d.ts +0 -4
  94. package/esm/tests/utils/lunatic.js +0 -4
  95. package/esm/tests/utils/lunatic.js.map +1 -1
  96. package/esm/type.source.d.ts +6 -6
  97. package/esm/type.source.js +0 -1
  98. package/esm/type.source.js.map +1 -1
  99. package/esm/use-lunatic/commons/page.js +8 -0
  100. package/esm/use-lunatic/commons/page.js.map +1 -1
  101. package/esm/use-lunatic/commons/variables/behaviours/cleaning-behaviour.d.ts +1 -1
  102. package/esm/use-lunatic/commons/variables/behaviours/cleaning-behaviour.js +111 -14
  103. package/esm/use-lunatic/commons/variables/behaviours/cleaning-behaviour.js.map +1 -1
  104. package/esm/use-lunatic/commons/variables/get-questionnaire-data.js +0 -8
  105. package/esm/use-lunatic/commons/variables/get-questionnaire-data.js.map +1 -1
  106. package/esm/use-lunatic/commons/variables/lunatic-variables-store.d.ts +2 -2
  107. package/esm/use-lunatic/commons/variables/lunatic-variables-store.js +5 -3
  108. package/esm/use-lunatic/commons/variables/lunatic-variables-store.js.map +1 -1
  109. package/esm/use-lunatic/commons/variables/lunatic-variables-store.spec.js +164 -8
  110. package/esm/use-lunatic/commons/variables/lunatic-variables-store.spec.js.map +1 -1
  111. package/esm/use-lunatic/hooks/use-page-has-response.js +50 -35
  112. package/esm/use-lunatic/hooks/use-page-has-response.js.map +1 -1
  113. package/esm/use-lunatic/hooks/useOverview.d.ts +1 -1
  114. package/esm/use-lunatic/hooks/useOverview.js +19 -14
  115. package/esm/use-lunatic/hooks/useOverview.js.map +1 -1
  116. package/esm/use-lunatic/hooks/useOverview.spec.d.ts +1 -0
  117. package/esm/use-lunatic/hooks/useOverview.spec.js +38 -0
  118. package/esm/use-lunatic/hooks/useOverview.spec.js.map +1 -0
  119. package/esm/use-lunatic/props/getComponentTypeProps.d.ts +1 -0
  120. package/esm/use-lunatic/props/propValue.js +18 -6
  121. package/esm/use-lunatic/props/propValue.js.map +1 -1
  122. package/esm/use-lunatic/props/propValue.spec.js +97 -2
  123. package/esm/use-lunatic/props/propValue.spec.js.map +1 -1
  124. package/esm/use-lunatic/reducer/reducerInitializer.d.ts +2 -2
  125. package/esm/use-lunatic/reducer/reducerInitializer.js +25 -32
  126. package/esm/use-lunatic/reducer/reducerInitializer.js.map +1 -1
  127. package/esm/use-lunatic/test.utils.d.ts +2 -0
  128. package/esm/use-lunatic/test.utils.js +13 -0
  129. package/esm/use-lunatic/test.utils.js.map +1 -0
  130. package/esm/use-lunatic/type.d.ts +0 -4
  131. package/esm/use-lunatic/use-lunatic.d.ts +1 -2
  132. package/esm/use-lunatic/use-lunatic.js.map +1 -1
  133. package/esm/utils/cast.d.ts +19 -0
  134. package/esm/utils/cast.js +63 -0
  135. package/esm/utils/cast.js.map +1 -0
  136. package/esm/utils/constants/variable-status.d.ts +0 -4
  137. package/esm/utils/constants/variable-status.js +0 -4
  138. package/esm/utils/constants/variable-status.js.map +1 -1
  139. package/esm/utils/variables.spec.js +0 -8
  140. package/esm/utils/variables.spec.js.map +1 -1
  141. package/index.d.ts +0 -1
  142. package/index.js +1 -3
  143. package/index.js.map +1 -1
  144. package/main.css +20 -0
  145. package/main.css.map +1 -1
  146. package/package.json +60 -69
  147. package/src/components/Datepicker/Datepicker.tsx +1 -1
  148. package/src/components/Datepicker/__snapshots__/Datepicker.spec.tsx.snap +2 -2
  149. package/src/components/Duration/Duration.test.tsx +52 -0
  150. package/src/components/Duration/Duration.tsx +17 -4
  151. package/src/components/Input/Input.spec.tsx +34 -0
  152. package/src/components/Input/Input.tsx +26 -18
  153. package/src/components/Input/__snapshots__/Input.spec.tsx.snap +38 -19
  154. package/src/components/InputNumber/InputNumber.spec.tsx +15 -1
  155. package/src/components/InputNumber/InputNumber.tsx +1 -0
  156. package/src/components/InputNumber/InputNumberThousand.tsx +11 -1
  157. package/src/components/Loop/Loop.spec.tsx +77 -0
  158. package/src/components/Loop/Loop.tsx +1 -1
  159. package/src/components/RosterForLoop/__snapshots__/RosterForLoop.spec.tsx.snap +42 -20
  160. package/src/components/Roundabout/CustomRoundabout.tsx +13 -4
  161. package/src/components/Roundabout/roundabout.spec.tsx +3 -0
  162. package/src/components/Textarea/Textarea.spec.tsx +18 -0
  163. package/src/components/Textarea/Textarea.tsx +21 -13
  164. package/src/components/Textarea/__snapshots__/Textarea.spec.tsx.snap +21 -11
  165. package/src/components/shared/CharactersCount/CharactersCount.spec.tsx +31 -0
  166. package/src/components/shared/CharactersCount/CharactersCount.tsx +27 -0
  167. package/src/components/shared/Label/Label.spec.tsx +15 -3
  168. package/src/components/shared/Label/Label.tsx +1 -1
  169. package/src/components/shared/utils/getCharactersCountId.test.ts +14 -0
  170. package/src/components/shared/utils/getCharactersCountId.ts +6 -0
  171. package/src/components/type.ts +1 -0
  172. package/src/css/components/Input.scss +10 -0
  173. package/src/css/components/Roundabout.scss +10 -0
  174. package/src/index.ts +0 -1
  175. package/src/stories/accordion/source.json +1 -5
  176. package/src/stories/behaviour/cleaning/cleaning.stories.jsx +11 -0
  177. package/src/stories/behaviour/cleaning/loop.json +246 -0
  178. package/src/stories/behaviour/cleaning/source-loop.json +3 -15
  179. package/src/stories/behaviour/cleaning/source.json +2 -10
  180. package/src/stories/behaviour/controls/boucles-n.json +2 -10
  181. package/src/stories/behaviour/controls/loop.json +2 -10
  182. package/src/stories/behaviour/controls/roundabout.json +3 -15
  183. package/src/stories/behaviour/controls/simple-numeric.json +19 -95
  184. package/src/stories/behaviour/controls/simple.json +7 -35
  185. package/src/stories/behaviour/filter/dataLoop.json +0 -8
  186. package/src/stories/behaviour/filter/source.json +0 -12
  187. package/src/stories/behaviour/filter/sourceLoop.json +0 -12
  188. package/src/stories/behaviour/missing/source.json +12 -60
  189. package/src/stories/behaviour/others/V2_DeclarationsSimples.json +14 -70
  190. package/src/stories/behaviour/others/V2_MinMaxSum_Boucles.json +5 -25
  191. package/src/stories/behaviour/others/V2_QuestSimple_Boucles.json +107 -535
  192. package/src/stories/behaviour/others/V2_TCMRallyeGames.json +33 -165
  193. package/src/stories/behaviour/others/test-dylan.json +5 -25
  194. package/src/stories/behaviour/paste/source.json +1 -5
  195. package/src/stories/behaviour/performance/performance.stories.jsx +2 -2
  196. package/src/stories/behaviour/performance/source.json +4 -20
  197. package/src/stories/behaviour/resizing/source-resizing-cleaning.json +2 -10
  198. package/src/stories/behaviour/resizing/source.json +5 -25
  199. package/src/stories/checkbox-boolean/source.json +1 -5
  200. package/src/stories/checkbox-group/source.json +16 -80
  201. package/src/stories/checkbox-group/sourceCondition.json +3 -15
  202. package/src/stories/checkbox-group/sourceDetail.json +18 -90
  203. package/src/stories/checkbox-group/sourceLoop.json +2 -10
  204. package/src/stories/checkbox-one/source.json +1 -5
  205. package/src/stories/checkbox-one/sourceDetail.json +2 -10
  206. package/src/stories/date-picker/source.json +1 -5
  207. package/src/stories/declaration/source.json +2 -10
  208. package/src/stories/disabled/data.json +0 -16
  209. package/src/stories/disabled/source.json +7 -35
  210. package/src/stories/dropdown/data.json +2 -10
  211. package/src/stories/dropdown/source.json +2 -10
  212. package/src/stories/duration/mois.json +1 -5
  213. package/src/stories/duration/time.json +1 -5
  214. package/src/stories/filter-description/source-options.json +3 -15
  215. package/src/stories/input/source.json +1 -5
  216. package/src/stories/input-number/input-number.stories.jsx +5 -0
  217. package/src/stories/input-number/source-big-number.json +27 -0
  218. package/src/stories/input-number/source-euro.json +2 -6
  219. package/src/stories/input-number/source.json +1 -5
  220. package/src/stories/loop/source-bloc.json +2 -10
  221. package/src/stories/loop/source-paginated.json +2 -10
  222. package/src/stories/loop/source-roster.json +2 -10
  223. package/src/stories/loop/source-with-header.json +2 -10
  224. package/src/stories/overview/dataLoop.json +24 -120
  225. package/src/stories/overview/overview.stories.jsx +9 -0
  226. package/src/stories/overview/source.json +1 -5
  227. package/src/stories/overview/sourceLoop.json +24 -120
  228. package/src/stories/overview/sourceWithHierarchy.json +164 -820
  229. package/src/stories/pairwise/source.json +5 -25
  230. package/src/stories/question/source.json +2 -10
  231. package/src/stories/questionnaires/logement/data.json +0 -1288
  232. package/src/stories/questionnaires/logement/source-sequence.json +564 -2820
  233. package/src/stories/questionnaires/logement/source-sum.json +280 -1400
  234. package/src/stories/questionnaires/logement/source.json +564 -2820
  235. package/src/stories/questionnaires/recensement/source.json +106 -530
  236. package/src/stories/questionnaires/rp/source.json +8 -40
  237. package/src/stories/questionnaires/simpsons/source.json +104 -520
  238. package/src/stories/radio/source.json +1 -5
  239. package/src/stories/radio/sourceCondition.json +2 -10
  240. package/src/stories/radio/sourceDetail.json +2 -10
  241. package/src/stories/radio/sourceHorizontal.json +1 -5
  242. package/src/stories/roundabout/data1.json +0 -12
  243. package/src/stories/roundabout/data2.json +0 -16
  244. package/src/stories/roundabout/source.json +11 -35
  245. package/src/stories/suggester/source-arbitrary-response.json +6 -30
  246. package/src/stories/suggester/source-error.json +6 -30
  247. package/src/stories/suggester/source-multiline.json +0 -16
  248. package/src/stories/suggester/source-option-responses.json +5 -25
  249. package/src/stories/suggester/source.json +7 -35
  250. package/src/stories/summary/data.json +0 -16
  251. package/src/stories/summary/source.json +7 -35
  252. package/src/stories/switch/data-forced.json +2 -10
  253. package/src/stories/switch/source.json +4 -20
  254. package/src/stories/table/source-colspan.json +8 -40
  255. package/src/stories/table/table-dynamique.json +1 -5
  256. package/src/stories/text/source-roster.json +3 -15
  257. package/src/stories/text/source-table.json +9 -45
  258. package/src/stories/textarea/source.json +1 -5
  259. package/src/stories/utils/{SchemaValidator.tsx → SchemaValidator.jsx} +1 -1
  260. package/src/stories/utils/{orchestrator.tsx → orchestrator.jsx} +9 -13
  261. package/src/stories/utils/{overview.tsx → overview.jsx} +0 -2
  262. package/src/tests/utils/lunatic.ts +0 -4
  263. package/src/type.source.ts +8 -7
  264. package/src/use-lunatic/__snapshots__/use-lunatic.test.ts.snap +0 -1159
  265. package/src/use-lunatic/commons/page.ts +10 -0
  266. package/src/use-lunatic/commons/variables/behaviours/cleaning-behaviour.ts +182 -24
  267. package/src/use-lunatic/commons/variables/get-questionnaire-data.ts +0 -12
  268. package/src/use-lunatic/commons/variables/lunatic-variables-store.spec.ts +190 -8
  269. package/src/use-lunatic/commons/variables/lunatic-variables-store.ts +7 -4
  270. package/src/use-lunatic/hooks/use-page-has-response.test.ts +200 -0
  271. package/src/use-lunatic/hooks/use-page-has-response.ts +67 -44
  272. package/src/use-lunatic/hooks/useOverview.spec.ts +42 -0
  273. package/src/use-lunatic/hooks/useOverview.ts +41 -18
  274. package/src/use-lunatic/props/propValue.spec.ts +105 -2
  275. package/src/use-lunatic/props/propValue.ts +26 -8
  276. package/src/use-lunatic/reducer/reducerInitializer.tsx +31 -41
  277. package/src/use-lunatic/test.utils.ts +17 -0
  278. package/src/use-lunatic/type.ts +0 -4
  279. package/src/use-lunatic/use-lunatic.test.ts +2 -21
  280. package/src/use-lunatic/use-lunatic.ts +5 -4
  281. package/src/utils/cast.ts +67 -0
  282. package/src/utils/constants/variable-status.ts +0 -4
  283. package/src/utils/variables.spec.ts +0 -8
  284. package/stories/overview/sourceWithHierarchy.json +5151 -0
  285. package/tests/utils/lunatic.d.ts +0 -4
  286. package/tests/utils/lunatic.js +0 -4
  287. package/tests/utils/lunatic.js.map +1 -1
  288. package/tsconfig.build.tsbuildinfo +1 -1
  289. package/type.source.d.ts +6 -6
  290. package/type.source.js +0 -1
  291. package/type.source.js.map +1 -1
  292. package/use-lunatic/commons/page.js +8 -0
  293. package/use-lunatic/commons/page.js.map +1 -1
  294. package/use-lunatic/commons/variables/behaviours/cleaning-behaviour.d.ts +1 -1
  295. package/use-lunatic/commons/variables/behaviours/cleaning-behaviour.js +111 -14
  296. package/use-lunatic/commons/variables/behaviours/cleaning-behaviour.js.map +1 -1
  297. package/use-lunatic/commons/variables/get-questionnaire-data.js +0 -8
  298. package/use-lunatic/commons/variables/get-questionnaire-data.js.map +1 -1
  299. package/use-lunatic/commons/variables/lunatic-variables-store.d.ts +2 -2
  300. package/use-lunatic/commons/variables/lunatic-variables-store.js +5 -3
  301. package/use-lunatic/commons/variables/lunatic-variables-store.js.map +1 -1
  302. package/use-lunatic/commons/variables/lunatic-variables-store.spec.js +187 -8
  303. package/use-lunatic/commons/variables/lunatic-variables-store.spec.js.map +1 -1
  304. package/use-lunatic/hooks/use-page-has-response.js +49 -34
  305. package/use-lunatic/hooks/use-page-has-response.js.map +1 -1
  306. package/use-lunatic/hooks/useOverview.d.ts +1 -1
  307. package/use-lunatic/hooks/useOverview.js +19 -14
  308. package/use-lunatic/hooks/useOverview.js.map +1 -1
  309. package/use-lunatic/hooks/useOverview.spec.d.ts +1 -0
  310. package/use-lunatic/hooks/useOverview.spec.js +43 -0
  311. package/use-lunatic/hooks/useOverview.spec.js.map +1 -0
  312. package/use-lunatic/props/getComponentTypeProps.d.ts +1 -0
  313. package/use-lunatic/props/propValue.js +18 -6
  314. package/use-lunatic/props/propValue.js.map +1 -1
  315. package/use-lunatic/props/propValue.spec.js +97 -2
  316. package/use-lunatic/props/propValue.spec.js.map +1 -1
  317. package/use-lunatic/reducer/reducerInitializer.d.ts +2 -2
  318. package/use-lunatic/reducer/reducerInitializer.js +25 -32
  319. package/use-lunatic/reducer/reducerInitializer.js.map +1 -1
  320. package/use-lunatic/test.utils.d.ts +2 -0
  321. package/use-lunatic/test.utils.js +17 -0
  322. package/use-lunatic/test.utils.js.map +1 -0
  323. package/use-lunatic/type.d.ts +0 -4
  324. package/use-lunatic/use-lunatic.d.ts +1 -2
  325. package/use-lunatic/use-lunatic.js.map +1 -1
  326. package/utils/cast.d.ts +19 -0
  327. package/utils/cast.js +70 -0
  328. package/utils/cast.js.map +1 -0
  329. package/utils/constants/variable-status.d.ts +0 -4
  330. package/utils/constants/variable-status.js +1 -5
  331. package/utils/constants/variable-status.js.map +1 -1
  332. package/utils/variables.spec.js +0 -8
  333. package/utils/variables.spec.js.map +1 -1
  334. package/constants/component-types.d.ts +0 -1
  335. package/constants/component-types.js +0 -5
  336. package/constants/component-types.js.map +0 -1
  337. package/constants/declarations.d.ts +0 -9
  338. package/constants/declarations.js +0 -15
  339. package/constants/declarations.js.map +0 -1
  340. package/constants/event-types.d.ts +0 -10
  341. package/constants/event-types.js +0 -16
  342. package/constants/event-types.js.map +0 -1
  343. package/constants/index.d.ts +0 -5
  344. package/constants/index.js +0 -22
  345. package/constants/index.js.map +0 -1
  346. package/constants/indexedDBStore.d.ts +0 -21
  347. package/constants/indexedDBStore.js +0 -22
  348. package/constants/indexedDBStore.js.map +0 -1
  349. package/constants/supported-preferences.d.ts +0 -1
  350. package/constants/supported-preferences.js +0 -36
  351. package/constants/supported-preferences.js.map +0 -1
  352. package/constants/value-types.d.ts +0 -5
  353. package/constants/value-types.js +0 -9
  354. package/constants/value-types.js.map +0 -1
  355. package/constants/variable-types.d.ts +0 -2
  356. package/constants/variable-types.js +0 -8
  357. package/constants/variable-types.js.map +0 -1
  358. package/esm/constants/component-types.d.ts +0 -1
  359. package/esm/constants/component-types.js +0 -2
  360. package/esm/constants/component-types.js.map +0 -1
  361. package/esm/constants/declarations.d.ts +0 -9
  362. package/esm/constants/declarations.js +0 -12
  363. package/esm/constants/declarations.js.map +0 -1
  364. package/esm/constants/event-types.d.ts +0 -10
  365. package/esm/constants/event-types.js +0 -13
  366. package/esm/constants/event-types.js.map +0 -1
  367. package/esm/constants/index.d.ts +0 -5
  368. package/esm/constants/index.js +0 -6
  369. package/esm/constants/index.js.map +0 -1
  370. package/esm/constants/indexedDBStore.d.ts +0 -21
  371. package/esm/constants/indexedDBStore.js +0 -19
  372. package/esm/constants/indexedDBStore.js.map +0 -1
  373. package/esm/constants/supported-preferences.d.ts +0 -1
  374. package/esm/constants/supported-preferences.js +0 -10
  375. package/esm/constants/supported-preferences.js.map +0 -1
  376. package/esm/constants/value-types.d.ts +0 -5
  377. package/esm/constants/value-types.js +0 -6
  378. package/esm/constants/value-types.js.map +0 -1
  379. package/esm/constants/variable-types.d.ts +0 -2
  380. package/esm/constants/variable-types.js +0 -5
  381. package/esm/constants/variable-types.js.map +0 -1
  382. package/esm/hooks/useArticulation.d.ts +0 -58
  383. package/esm/hooks/useArticulation.js +0 -81
  384. package/esm/hooks/useArticulation.js.map +0 -1
  385. package/hooks/useArticulation.d.ts +0 -58
  386. package/hooks/useArticulation.js +0 -81
  387. package/hooks/useArticulation.js.map +0 -1
  388. package/src/constants/component-types.ts +0 -1
  389. package/src/constants/declarations.ts +0 -14
  390. package/src/constants/event-types.ts +0 -13
  391. package/src/constants/index.ts +0 -5
  392. package/src/constants/indexedDBStore.ts +0 -20
  393. package/src/constants/supported-preferences.ts +0 -10
  394. package/src/constants/value-types.ts +0 -5
  395. package/src/constants/variable-types.ts +0 -4
  396. package/src/hooks/useArticulation.ts +0 -124
  397. package/src/stories/behaviour/articulation/articulation.stories.tsx +0 -105
  398. package/src/stories/behaviour/articulation/roundabout.json +0 -348
@@ -31,6 +31,16 @@ export function isPageEmpty(state: LunaticReducerState): boolean {
31
31
  if (options.disableFilters) {
32
32
  return true;
33
33
  }
34
+
35
+ // The component is a paginated loop, consider it invisible if iteration size is 0
36
+ if ('paginatedLoop' in component && component.paginatedLoop) {
37
+ const iterations = state.executeExpression<number>(component.iterations);
38
+ if (!iterations) {
39
+ return false;
40
+ }
41
+ }
42
+
43
+ // Use condition filter if present
34
44
  if ('conditionFilter' in component && component.conditionFilter) {
35
45
  return executeConditionFilter(
36
46
  component.conditionFilter,
@@ -1,6 +1,10 @@
1
- import type { LunaticVariablesStore } from '../lunatic-variables-store';
1
+ import type {
2
+ IterationLevel,
3
+ LunaticVariablesStore,
4
+ } from '../lunatic-variables-store';
2
5
  import type { LunaticSource } from '../../../type';
3
6
  import { depth } from '../../../../utils/array';
7
+ import { castBool } from '../../../../utils/cast';
4
8
 
5
9
  /**
6
10
  * Cleaning behaviour for the store
@@ -9,13 +13,30 @@ import { depth } from '../../../../utils/array';
9
13
  export function cleaningBehaviour(
10
14
  store: LunaticVariablesStore,
11
15
  cleaning: LunaticSource['cleaning'],
12
- // Value used as default when cleaning a variable
13
- initialValues: Record<string, unknown> = {}
16
+ // Value used as default when cleaning a variable, correspoding to value of variable in source.json (not data)
17
+ sourceValues: Record<string, unknown> = {}
14
18
  ) {
15
19
  if (!cleaning) {
16
20
  return;
17
21
  }
18
22
 
23
+ // Create calculated variables from cleaning expressions
24
+ for (const source in cleaning) {
25
+ for (const target in cleaning[source]) {
26
+ if (Array.isArray(cleaning[source][target])) {
27
+ for (const cleaningInfo of cleaning[source][target]) {
28
+ store.setCalculated(
29
+ cleaningInfo.expression,
30
+ cleaningInfo.expression,
31
+ {
32
+ shapeFrom: cleaningInfo.shapeFrom,
33
+ }
34
+ );
35
+ }
36
+ }
37
+ }
38
+ }
39
+
19
40
  // Create a map to improve performance
20
41
  const cleaningMap = new Map(Object.entries(cleaning));
21
42
 
@@ -30,28 +51,28 @@ export function cleaningBehaviour(
30
51
 
31
52
  for (const variableName in cleaningInfo) {
32
53
  try {
33
- const skipCleaning = store.run(cleaningInfo[variableName], {
34
- iteration,
54
+ // First: check if variable is already cleaned i.e, value is `null`, empty or list of `null`
55
+ if (isAlreadyCleaned(store, variableName)) continue;
56
+ // Second: check if variable should be clean i.e one of expressions is true
57
+
58
+ // shouldClean is simple boolean or array of boolean if there have a shapeFrom
59
+ const shouldCleanResult = shouldClean(store, {
60
+ expressions: cleaningInfo[variableName],
61
+ iteration: iteration,
62
+ isResizing: e.detail.cause === 'resizing',
35
63
  });
36
- if (skipCleaning) {
64
+
65
+ if (Array.isArray(shouldCleanResult)) {
66
+ cleanArrayVariableAccordingCondition(
67
+ store,
68
+ sourceValues,
69
+ variableName,
70
+ shouldCleanResult
71
+ );
37
72
  continue;
38
73
  }
39
-
40
- // Variable may be top level, so we need to deduce expected iteration
41
- const variableDepth = depth(initialValues[variableName]);
42
- const variableIteration =
43
- variableDepth === 0
44
- ? undefined
45
- : iteration?.slice(0, depth(initialValues[variableName]));
46
-
47
- store.set(
48
- variableName,
49
- getValueAtIteration(initialValues[variableName], variableIteration),
50
- {
51
- iteration: variableIteration,
52
- cause: 'cleaning',
53
- }
54
- );
74
+ if (shouldCleanResult)
75
+ cleanVariable(store, sourceValues, variableName, iteration);
55
76
  } catch (e) {
56
77
  // If we have an error, skip this cleaning
57
78
  console.error(e);
@@ -60,14 +81,151 @@ export function cleaningBehaviour(
60
81
  });
61
82
  }
62
83
 
84
+ function isAlreadyCleaned(store: LunaticVariablesStore, variableName: string) {
85
+ const value = store.get(variableName);
86
+ if (Array.isArray(value)) return value.every((v) => v === null);
87
+ if (value === null) return true;
88
+ }
89
+
90
+ /**
91
+ * Check if a variable need to be cleaned
92
+ */
93
+ function shouldClean(
94
+ store: LunaticVariablesStore,
95
+ {
96
+ // The expressions are a list of condition filter to display the variable, so we should clean if the filter is evaluated to false (false = variable is not visible)
97
+ expressions,
98
+ iteration,
99
+ isResizing,
100
+ }: {
101
+ expressions:
102
+ | string
103
+ | {
104
+ expression: string;
105
+ shapeFrom?: string;
106
+ isAggregatorUsed: boolean;
107
+ }[];
108
+ iteration?: number[];
109
+ isResizing: boolean;
110
+ }
111
+ ) {
112
+ // Legacy cleaning used a simple string
113
+ if (typeof expressions === 'string') {
114
+ return !castBool(
115
+ store.run(expressions, {
116
+ iteration,
117
+ })
118
+ );
119
+ }
120
+
121
+ // New format use tuples { expression, shapeFrom, isAggregatorUsed }
122
+ if (isResizing) {
123
+ // If we are resizing a variable, only run expression containing aggregators (count(), sum()...)
124
+ expressions = expressions.filter((expr) => expr.isAggregatorUsed);
125
+ }
126
+
127
+ // here, value has change in root scope, but we have to to check for each iteration of variable
128
+ if (hasShapeFrom(expressions) && !iteration) {
129
+ const shapeFromVariable = store.get(
130
+ expressions[0].shapeFrom as string
131
+ ) as Array<unknown>;
132
+
133
+ const shouldCleanArray = new Array(shapeFromVariable.length).fill(
134
+ false
135
+ ) as Array<boolean>;
136
+
137
+ for (const [iterationIndex] of shouldCleanArray.entries()) {
138
+ shouldCleanArray[iterationIndex] = shouldClean(store, {
139
+ expressions,
140
+ iteration: [iterationIndex],
141
+ isResizing,
142
+ }) as boolean;
143
+ }
144
+ return shouldCleanArray;
145
+ } else {
146
+ // if only one expression is false, we have to clean (condition is display condition)
147
+ for (const expression of expressions) {
148
+ // Run the expression to check if cleaning should happen
149
+ if (
150
+ !store.run(expression.expression, {
151
+ iteration,
152
+ })
153
+ )
154
+ return true;
155
+ }
156
+
157
+ return false;
158
+ }
159
+ }
160
+
63
161
  function getValueAtIteration(value: unknown, iteration?: number[]) {
64
162
  if (!iteration || iteration.length === 0) {
65
163
  return value ?? null;
66
164
  }
67
-
68
165
  if (!Array.isArray(value)) {
69
166
  return null;
70
167
  }
71
-
72
168
  return getValueAtIteration(value[iteration[0]], iteration.slice(1));
73
169
  }
170
+
171
+ /**
172
+ * hasShapeFrom
173
+ * actually, in cleaning modelisation,
174
+ * all expressions have no shapeFrom or have the **same** shapeFrom
175
+ * @param expressions
176
+ * @returns boolean if all expression has shapeFrom
177
+ *
178
+ */
179
+ function hasShapeFrom(
180
+ expressions: {
181
+ expression: string;
182
+ shapeFrom?: string;
183
+ isAggregatorUsed: boolean;
184
+ }[]
185
+ ) {
186
+ return expressions.every(
187
+ (expression) =>
188
+ expression.shapeFrom !== null && expression.shapeFrom !== undefined
189
+ );
190
+ }
191
+
192
+ function cleanArrayVariableAccordingCondition(
193
+ store: LunaticVariablesStore,
194
+ sourceValues: Record<string, unknown>,
195
+ variableName: string,
196
+ shouldClean: boolean[]
197
+ ) {
198
+ for (const [iteration, shouldCleanByIteration] of shouldClean.entries()) {
199
+ if (shouldCleanByIteration)
200
+ cleanVariable(store, sourceValues, variableName, [iteration]);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * cleanVariable: this function set to null (and not initalValue) the variable at iteration
206
+ * @param store
207
+ * @param variableName
208
+ * @param iteration
209
+ */
210
+ function cleanVariable(
211
+ store: LunaticVariablesStore,
212
+ sourceValues: Record<string, unknown>,
213
+ variableName: string,
214
+ iteration: IterationLevel | undefined
215
+ ) {
216
+ // Variable may be top level, so we need to deduce expected iteration
217
+ const variableDepth = depth(sourceValues[variableName]);
218
+ const variableIteration =
219
+ variableDepth === 0
220
+ ? undefined
221
+ : iteration?.slice(0, depth(sourceValues[variableName]));
222
+
223
+ store.set(
224
+ variableName,
225
+ getValueAtIteration(sourceValues[variableName], variableIteration),
226
+ {
227
+ iteration: variableIteration,
228
+ cause: 'cleaning',
229
+ }
230
+ );
231
+ }
@@ -13,10 +13,6 @@ export function getQuestionnaireData(
13
13
  COLLECTED: {} as Record<
14
14
  string,
15
15
  {
16
- EDITED: unknown;
17
- FORCED: unknown;
18
- INPUTTED: unknown;
19
- PREVIOUS: unknown;
20
16
  COLLECTED: unknown;
21
17
  }
22
18
  >,
@@ -34,10 +30,6 @@ export function getQuestionnaireData(
34
30
  variableNames.map((name) => [
35
31
  name,
36
32
  {
37
- EDITED: null,
38
- FORCED: null,
39
- INPUTTED: null,
40
- PREVIOUS: null,
41
33
  COLLECTED: store.get(name),
42
34
  },
43
35
  ])
@@ -53,10 +45,6 @@ export function getQuestionnaireData(
53
45
 
54
46
  if (variable.variableType === 'COLLECTED') {
55
47
  result.COLLECTED[variable.name] = {
56
- PREVIOUS: null,
57
- FORCED: null,
58
- EDITED: null,
59
- INPUTTED: null,
60
48
  ...variable.values,
61
49
  COLLECTED: store.get(variable.name),
62
50
  };
@@ -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';
@@ -103,6 +104,17 @@ describe('lunatic-variables-store', () => {
103
104
  expect(() => variables.run('Hello world')).toThrowError();
104
105
  });
105
106
 
107
+ it('should handle calculated with aggregates', () => {
108
+ variables.set('AGES', [1, 2, 3]);
109
+ variables.setCalculated('NB_HAB', 'count(AGES)');
110
+ variables.setCalculated('AGES_PLUS_NBHAB', 'NB_HAB + AGES', {
111
+ shapeFrom: 'AGES',
112
+ });
113
+ expect(variables.get('NB_HAB')).toBe(3);
114
+ expect(variables.get('AGES_PLUS_NBHAB', [0])).toBe(4);
115
+ expect(variables.get('AGES_PLUS_NBHAB')).toEqual([4, 5, 6]);
116
+ });
117
+
106
118
  describe('event listener', () => {
107
119
  it('should trigger onChange', () => {
108
120
  variables.set('FIRSTNAME', 'John');
@@ -414,6 +426,106 @@ describe('lunatic-variables-store', () => {
414
426
  variables.set('READY', false, { iteration: [1] });
415
427
  expect(variables.get('PRENOM')).toEqual(null);
416
428
  });
429
+ it('should handle the new array format', () => {
430
+ variables.set('PRENOM', ['John', 'Jane', 'Marc']);
431
+ variables.set('READY', [true, true, true]);
432
+ cleaningBehaviour(
433
+ variables,
434
+ {
435
+ READY: {
436
+ PRENOM: [
437
+ {
438
+ expression: 'READY',
439
+ shapeFrom: 'READY',
440
+ isAggregatorUsed: false,
441
+ },
442
+ ],
443
+ },
444
+ },
445
+ { PRENOM: [null] }
446
+ );
447
+ variables.set('READY', false, { iteration: [1] });
448
+ expect(variables.get('PRENOM')).toEqual(['John', null, 'Marc']);
449
+ });
450
+ it('should handle cleaning on aggregations', () => {
451
+ variables.set('PRENOM', ['John', 'Jane', 'Marc']);
452
+ variables.set('READY', [true, true, true]);
453
+ variables.setCalculated('NB_HAB', 'count(PRENOM)');
454
+ cleaningBehaviour(
455
+ variables,
456
+ {
457
+ READY: {
458
+ PRENOM: [
459
+ {
460
+ expression: 'READY',
461
+ shapeFrom: 'READY',
462
+ isAggregatorUsed: false,
463
+ },
464
+ {
465
+ expression: 'NB_HAB > 1',
466
+ isAggregatorUsed: true,
467
+ },
468
+ ],
469
+ },
470
+ },
471
+ { PRENOM: [null] }
472
+ );
473
+ variables.set('READY', false, { iteration: [1], cause: 'resizing' });
474
+ expect(variables.get('PRENOM')).toEqual(['John', 'Jane', 'Marc']);
475
+ variables.set('PRENOM', ['John'], { cause: 'resizing' });
476
+ variables.set('READY', [true], { cause: 'resizing' });
477
+ expect(variables.get('PRENOM')).toEqual([null]);
478
+ });
479
+
480
+ it('should evaluate cleaning for each iteration', () => {
481
+ variables.set('PRENOM', ['John', 'Jane', 'Marc']);
482
+ variables.set('READY', [true, true, true]);
483
+ cleaningBehaviour(
484
+ variables,
485
+ {
486
+ READY: {
487
+ PRENOM: [
488
+ {
489
+ expression: 'READY',
490
+ shapeFrom: 'READY',
491
+ isAggregatorUsed: false,
492
+ },
493
+ ],
494
+ },
495
+ },
496
+ { PRENOM: [null] }
497
+ );
498
+ variables.set('READY', [true, true, false]);
499
+ expect(variables.get('PRENOM')).toEqual(['John', 'Jane', null]);
500
+ });
501
+ it('should evaluate cleaning for each iteration at root levl', () => {
502
+ variables.set('PRENOM', ['John', 'Jane', 'Marc']);
503
+ variables.set('AGE', [18, 21, 23]);
504
+ variables.setCalculated('NB_HAB', 'count(PRENOM)');
505
+ resizingBehaviour(variables, {
506
+ PRENOM: {
507
+ size: 'count(PRENOM)',
508
+ variables: ['AGE'],
509
+ },
510
+ });
511
+ cleaningBehaviour(
512
+ variables,
513
+ {
514
+ PRENOM: {
515
+ AGE: [
516
+ {
517
+ expression: 'NB_HAB >= 3',
518
+ shapeFrom: 'PRENOM',
519
+ isAggregatorUsed: true,
520
+ },
521
+ ],
522
+ },
523
+ },
524
+ { PRENOM: [], AGE: [] }
525
+ );
526
+ variables.set('PRENOM', ['John', 'Jane']);
527
+ expect(variables.get('AGE')).toEqual([null, null]);
528
+ });
417
529
  });
418
530
 
419
531
  describe('missing', () => {
@@ -449,10 +561,6 @@ describe('lunatic-variables-store', () => {
449
561
  {
450
562
  name: 'PRENOM',
451
563
  values: {
452
- EDITED: null,
453
- FORCED: null,
454
- INPUTTED: null,
455
- PREVIOUS: null,
456
564
  COLLECTED: 'John',
457
565
  },
458
566
  variableType: 'COLLECTED',
@@ -460,10 +568,6 @@ describe('lunatic-variables-store', () => {
460
568
  {
461
569
  name: 'NOM',
462
570
  values: {
463
- EDITED: null,
464
- FORCED: null,
465
- INPUTTED: null,
466
- PREVIOUS: null,
467
571
  COLLECTED: '',
468
572
  },
469
573
  variableType: 'COLLECTED',
@@ -488,5 +592,83 @@ describe('lunatic-variables-store', () => {
488
592
  store.set('NOM', 'Doe');
489
593
  expect(store.get('PRENOM')).toEqual('John');
490
594
  });
595
+ it('should enable cleaning when disableCleaning = false', () => {
596
+ const cleaningSpy = vi.spyOn(cleaningModule, 'cleaningBehaviour');
597
+ LunaticVariablesStore.makeFromSource(
598
+ {
599
+ components: [],
600
+ variables: [
601
+ {
602
+ name: 'PRENOM',
603
+ values: {
604
+ COLLECTED: 'John',
605
+ },
606
+ variableType: 'COLLECTED',
607
+ },
608
+ {
609
+ name: 'NOM',
610
+ values: {
611
+ COLLECTED: '',
612
+ },
613
+ variableType: 'COLLECTED',
614
+ },
615
+ ],
616
+ cleaning: {
617
+ NOM: {
618
+ PRENOM: 'false',
619
+ },
620
+ },
621
+ },
622
+ {
623
+ COLLECTED: {
624
+ PRENOM: {
625
+ COLLECTED: 'Jane',
626
+ },
627
+ },
628
+ },
629
+ { current: () => {} },
630
+ false // enable cleaning
631
+ );
632
+ expect(cleaningSpy).toHaveBeenCalled();
633
+ });
634
+ it('should disable cleaning when disableCleaning = true', () => {
635
+ const cleaningSpy = vi.spyOn(cleaningModule, 'cleaningBehaviour');
636
+ LunaticVariablesStore.makeFromSource(
637
+ {
638
+ components: [],
639
+ variables: [
640
+ {
641
+ name: 'PRENOM',
642
+ values: {
643
+ COLLECTED: 'John',
644
+ },
645
+ variableType: 'COLLECTED',
646
+ },
647
+ {
648
+ name: 'NOM',
649
+ values: {
650
+ COLLECTED: '',
651
+ },
652
+ variableType: 'COLLECTED',
653
+ },
654
+ ],
655
+ cleaning: {
656
+ NOM: {
657
+ PRENOM: 'false',
658
+ },
659
+ },
660
+ },
661
+ {
662
+ COLLECTED: {
663
+ PRENOM: {
664
+ COLLECTED: 'Jane',
665
+ },
666
+ },
667
+ },
668
+ { current: () => {} },
669
+ true // disable cleaning
670
+ );
671
+ expect(cleaningSpy).not.toHaveBeenCalled();
672
+ });
491
673
  });
492
674
  });
@@ -24,7 +24,7 @@ let interpretCount = 0;
24
24
  /** Special variable that will take the current iteration value. */
25
25
  const iterationVariableName = 'GLOBAL_ITERATION_INDEX';
26
26
 
27
- type IterationLevel = number[];
27
+ export type IterationLevel = number[];
28
28
  export type EventArgs = {
29
29
  change: {
30
30
  /** Name of the changed variable. */
@@ -54,13 +54,14 @@ 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) {
61
62
  return store;
62
63
  }
63
- // Source data (picked from "variables" in the source.json)
64
+ // Source data (picked from "variables" in the source.json)s
64
65
  const sourceValues: Record<string, unknown> = {};
65
66
  // Starting data for the form (merged with data.json or injected data)
66
67
  const initialValues: Record<string, unknown> = {};
@@ -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;