@coorpacademy/app-review 0.1.15 → 0.1.16

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 (212) hide show
  1. package/es/actions/api/fetch-skills.d.ts +4 -6
  2. package/es/actions/api/fetch-skills.js +7 -4
  3. package/es/actions/api/fetch-slide.d.ts +14 -7
  4. package/es/actions/api/fetch-slide.js +22 -19
  5. package/es/actions/api/post-progression.d.ts +4 -6
  6. package/es/actions/api/post-progression.js +13 -8
  7. package/es/actions/api/test/create-test-store.d.ts +5 -0
  8. package/es/actions/api/test/create-test-store.js +16 -0
  9. package/es/actions/api/test/fetch-skills.test.js +54 -0
  10. package/es/actions/api/test/fetch-slide.test.js +61 -0
  11. package/es/actions/api/test/post-progression.test.d.ts +1 -0
  12. package/es/actions/api/test/post-progression.test.js +102 -0
  13. package/es/actions/ui/answers.d.ts +7 -0
  14. package/es/actions/ui/answers.js +7 -0
  15. package/es/fixtures/temp-fixture.d.ts +1 -1
  16. package/es/index.js +10 -16
  17. package/es/reducers/data/index.d.ts +1 -1
  18. package/es/reducers/data/slides.d.ts +2 -2
  19. package/es/reducers/data/slides.js +5 -1
  20. package/es/reducers/data/test/progression.test.d.ts +1 -0
  21. package/es/reducers/data/test/progression.test.js +38 -0
  22. package/es/reducers/data/test/skills.test.d.ts +1 -0
  23. package/es/reducers/data/test/skills.test.js +12 -0
  24. package/es/reducers/data/test/slides.test.d.ts +1 -0
  25. package/es/reducers/data/test/slides.test.js +20 -0
  26. package/es/reducers/data/test/token.test.d.ts +1 -0
  27. package/es/reducers/data/test/token.test.js +11 -0
  28. package/es/reducers/index.d.ts +2 -2
  29. package/es/reducers/ui/answers.d.ts +4 -0
  30. package/es/reducers/ui/answers.js +13 -0
  31. package/es/reducers/ui/index.d.ts +4 -4
  32. package/es/reducers/ui/index.js +2 -2
  33. package/es/reducers/ui/test/answers.test.d.ts +1 -0
  34. package/es/reducers/ui/test/answers.test.js +11 -0
  35. package/es/reducers/ui/test/current-slide-ref.test.d.ts +1 -0
  36. package/es/reducers/ui/test/current-slide-ref.test.js +12 -0
  37. package/es/reducers/ui/test/navigation.test.d.ts +1 -0
  38. package/es/reducers/ui/test/navigation.test.js +15 -0
  39. package/es/services/fetch-slide.js +1 -1
  40. package/es/services/index.js +3 -1
  41. package/es/services/post-answer.d.ts +2 -0
  42. package/es/services/post-answer.js +18 -0
  43. package/es/services/test/fetch-slide.test.d.ts +1 -0
  44. package/es/services/test/fetch-slide.test.js +22 -0
  45. package/es/services/test/post-answer.test.d.ts +1 -0
  46. package/es/services/test/post-answer.test.js +57 -0
  47. package/es/services/test/post-progression.test.js +9 -1
  48. package/es/test/util/services.mock.js +37 -7
  49. package/es/types/common.d.ts +22 -8
  50. package/es/views/slides/index.d.ts +78 -2
  51. package/es/views/slides/index.js +70 -4
  52. package/es/views/slides/map-api-slide-to-ui.d.ts +8 -0
  53. package/es/views/slides/map-api-slide-to-ui.js +172 -0
  54. package/{lib/helpers → es/views/slides}/test/fixtures/free-text.d.ts +1 -1
  55. package/es/views/slides/test/fixtures/free-text.js +38 -0
  56. package/es/{helpers → views/slides}/test/fixtures/qcm-drag.d.ts +1 -1
  57. package/es/views/slides/test/fixtures/qcm-drag.js +108 -0
  58. package/es/{helpers → views/slides}/test/fixtures/qcm-graphic.d.ts +1 -1
  59. package/es/views/slides/test/fixtures/qcm-graphic.js +88 -0
  60. package/es/{helpers → views/slides}/test/fixtures/qcm.d.ts +1 -1
  61. package/es/{helpers → views/slides}/test/fixtures/qcm.js +5 -1
  62. package/es/{helpers → views/slides}/test/fixtures/select-template.d.ts +1 -1
  63. package/es/views/slides/test/fixtures/select-template.js +92 -0
  64. package/es/{helpers → views/slides}/test/fixtures/slider.d.ts +1 -1
  65. package/es/views/slides/test/fixtures/slider.js +36 -0
  66. package/es/{helpers → views/slides}/test/fixtures/text-template.d.ts +1 -1
  67. package/es/{helpers → views/slides}/test/fixtures/text-template.js +5 -1
  68. package/es/views/slides/test/map-api-slide-to-ui.test.d.ts +1 -0
  69. package/es/{helpers → views/slides}/test/map-api-slide-to-ui.test.js +19 -9
  70. package/lib/actions/api/fetch-skills.d.ts +4 -6
  71. package/lib/actions/api/fetch-skills.js +55 -7
  72. package/lib/actions/api/fetch-slide.d.ts +14 -7
  73. package/lib/actions/api/fetch-slide.js +70 -20
  74. package/lib/actions/api/post-progression.d.ts +4 -6
  75. package/lib/actions/api/post-progression.js +63 -9
  76. package/lib/actions/api/test/create-test-store.d.ts +5 -0
  77. package/lib/actions/api/test/create-test-store.js +18 -0
  78. package/lib/actions/api/test/fetch-skills.test.d.ts +1 -0
  79. package/lib/actions/api/test/fetch-skills.test.js +113 -0
  80. package/lib/actions/api/test/fetch-slide.test.d.ts +1 -0
  81. package/lib/actions/api/test/fetch-slide.test.js +120 -0
  82. package/lib/actions/api/test/post-progression.test.d.ts +1 -0
  83. package/lib/actions/api/test/post-progression.test.js +160 -0
  84. package/lib/actions/ui/answers.d.ts +7 -0
  85. package/lib/actions/ui/answers.js +9 -0
  86. package/lib/fixtures/temp-fixture.d.ts +1 -1
  87. package/lib/index.js +21 -18
  88. package/lib/reducers/data/index.d.ts +1 -1
  89. package/lib/reducers/data/slides.d.ts +2 -2
  90. package/lib/reducers/data/slides.js +5 -1
  91. package/lib/reducers/data/test/progression.test.d.ts +1 -0
  92. package/lib/reducers/data/test/progression.test.js +38 -0
  93. package/lib/reducers/data/test/skills.test.d.ts +1 -0
  94. package/lib/reducers/data/test/skills.test.js +12 -0
  95. package/lib/reducers/data/test/slides.test.d.ts +1 -0
  96. package/lib/reducers/data/test/slides.test.js +20 -0
  97. package/lib/reducers/data/test/token.test.d.ts +1 -0
  98. package/lib/reducers/data/test/token.test.js +11 -0
  99. package/lib/reducers/index.d.ts +2 -2
  100. package/lib/reducers/ui/answers.d.ts +4 -0
  101. package/lib/reducers/ui/answers.js +14 -0
  102. package/lib/reducers/ui/index.d.ts +4 -4
  103. package/lib/reducers/ui/index.js +2 -2
  104. package/lib/reducers/ui/test/answers.test.d.ts +1 -0
  105. package/lib/reducers/ui/test/answers.test.js +11 -0
  106. package/lib/reducers/ui/test/current-slide-ref.test.d.ts +1 -0
  107. package/lib/reducers/ui/test/current-slide-ref.test.js +12 -0
  108. package/lib/reducers/ui/test/navigation.test.d.ts +1 -0
  109. package/lib/reducers/ui/test/navigation.test.js +15 -0
  110. package/lib/services/fetch-slide.js +1 -1
  111. package/lib/services/index.js +3 -1
  112. package/lib/services/post-answer.d.ts +2 -0
  113. package/lib/services/post-answer.js +62 -0
  114. package/lib/services/test/fetch-slide.test.d.ts +1 -0
  115. package/lib/services/test/fetch-slide.test.js +76 -0
  116. package/lib/services/test/post-answer.test.d.ts +1 -0
  117. package/lib/services/test/post-answer.test.js +111 -0
  118. package/lib/services/test/post-progression.test.js +9 -1
  119. package/lib/test/util/services.mock.js +37 -7
  120. package/lib/types/common.d.ts +22 -8
  121. package/lib/views/slides/index.d.ts +78 -2
  122. package/lib/views/slides/index.js +70 -4
  123. package/lib/views/slides/map-api-slide-to-ui.d.ts +8 -0
  124. package/lib/views/slides/map-api-slide-to-ui.js +178 -0
  125. package/{es/helpers → lib/views/slides}/test/fixtures/free-text.d.ts +1 -1
  126. package/lib/views/slides/test/fixtures/free-text.js +38 -0
  127. package/lib/{helpers → views/slides}/test/fixtures/qcm-drag.d.ts +1 -1
  128. package/lib/views/slides/test/fixtures/qcm-drag.js +108 -0
  129. package/lib/{helpers → views/slides}/test/fixtures/qcm-graphic.d.ts +1 -1
  130. package/lib/views/slides/test/fixtures/qcm-graphic.js +88 -0
  131. package/lib/{helpers → views/slides}/test/fixtures/qcm.d.ts +1 -1
  132. package/lib/{helpers → views/slides}/test/fixtures/qcm.js +5 -1
  133. package/lib/{helpers → views/slides}/test/fixtures/select-template.d.ts +1 -1
  134. package/lib/views/slides/test/fixtures/select-template.js +92 -0
  135. package/lib/{helpers → views/slides}/test/fixtures/slider.d.ts +1 -1
  136. package/lib/views/slides/test/fixtures/slider.js +36 -0
  137. package/lib/{helpers → views/slides}/test/fixtures/text-template.d.ts +1 -1
  138. package/lib/{helpers → views/slides}/test/fixtures/text-template.js +5 -1
  139. package/lib/views/slides/test/map-api-slide-to-ui.test.d.ts +1 -0
  140. package/lib/{helpers → views/slides}/test/map-api-slide-to-ui.test.js +19 -9
  141. package/package.json +3 -3
  142. package/src/actions/api/fetch-skills.ts +12 -12
  143. package/src/actions/api/fetch-slide.ts +33 -29
  144. package/src/actions/api/post-progression.ts +18 -21
  145. package/src/actions/api/test/create-test-store.ts +25 -0
  146. package/src/actions/api/test/fetch-skills.test.ts +70 -0
  147. package/src/actions/api/test/fetch-slide.test.ts +77 -0
  148. package/src/actions/api/test/post-progression.test.ts +119 -0
  149. package/src/actions/ui/answers.ts +16 -0
  150. package/src/fixtures/temp-fixture.ts +1 -1
  151. package/src/index.tsx +14 -29
  152. package/src/reducers/data/index.ts +1 -1
  153. package/src/reducers/data/slides.ts +11 -2
  154. package/src/reducers/data/test/progression.test.ts +42 -0
  155. package/src/reducers/data/test/skills.test.ts +14 -0
  156. package/src/reducers/data/test/slides.test.ts +26 -0
  157. package/src/reducers/data/test/token.test.ts +13 -0
  158. package/src/reducers/ui/answers.ts +19 -0
  159. package/src/reducers/ui/index.ts +3 -3
  160. package/src/reducers/ui/test/answers.test.ts +13 -0
  161. package/src/reducers/ui/test/current-slide-ref.test.ts +14 -0
  162. package/src/reducers/ui/test/navigation.test.ts +19 -0
  163. package/src/services/fetch-slide.ts +1 -1
  164. package/src/services/index.ts +3 -1
  165. package/src/services/post-answer.ts +27 -0
  166. package/src/services/test/fetch-slide.test.ts +30 -0
  167. package/src/services/test/post-answer.test.ts +68 -0
  168. package/src/services/test/post-progression.test.ts +9 -1
  169. package/src/test/util/services.mock.ts +37 -7
  170. package/src/types/common.ts +34 -14
  171. package/src/views/slides/index.ts +164 -5
  172. package/src/views/slides/map-api-slide-to-ui.ts +251 -0
  173. package/src/views/slides/test/fixtures/free-text.ts +43 -0
  174. package/src/views/slides/test/fixtures/qcm-drag.ts +111 -0
  175. package/src/views/slides/test/fixtures/qcm-graphic.ts +94 -0
  176. package/src/{helpers → views/slides}/test/fixtures/qcm.ts +6 -2
  177. package/src/views/slides/test/fixtures/select-template.ts +98 -0
  178. package/src/views/slides/test/fixtures/slider.ts +41 -0
  179. package/src/{helpers → views/slides}/test/fixtures/text-template.ts +6 -2
  180. package/src/{helpers → views/slides}/test/map-api-slide-to-ui.test.ts +21 -10
  181. package/es/helpers/map-api-slide-to-ui.d.ts +0 -11
  182. package/es/helpers/map-api-slide-to-ui.js +0 -193
  183. package/es/helpers/test/fixtures/free-text.js +0 -30
  184. package/es/helpers/test/fixtures/qcm-drag.js +0 -112
  185. package/es/helpers/test/fixtures/qcm-graphic.js +0 -76
  186. package/es/helpers/test/fixtures/select-template.js +0 -94
  187. package/es/helpers/test/fixtures/slider.js +0 -33
  188. package/es/reducers/ui/slides.d.ts +0 -9
  189. package/es/reducers/ui/slides.js +0 -42
  190. package/es/types/views/slides.d.ts +0 -74
  191. package/es/types/views/slides.js +0 -6
  192. package/lib/helpers/map-api-slide-to-ui.d.ts +0 -11
  193. package/lib/helpers/map-api-slide-to-ui.js +0 -201
  194. package/lib/helpers/test/fixtures/free-text.js +0 -30
  195. package/lib/helpers/test/fixtures/qcm-drag.js +0 -112
  196. package/lib/helpers/test/fixtures/qcm-graphic.js +0 -76
  197. package/lib/helpers/test/fixtures/select-template.js +0 -94
  198. package/lib/helpers/test/fixtures/slider.js +0 -33
  199. package/lib/reducers/ui/slides.d.ts +0 -9
  200. package/lib/reducers/ui/slides.js +0 -43
  201. package/lib/types/views/slides.d.ts +0 -74
  202. package/lib/types/views/slides.js +0 -6
  203. package/src/helpers/map-api-slide-to-ui.ts +0 -279
  204. package/src/helpers/test/fixtures/free-text.ts +0 -33
  205. package/src/helpers/test/fixtures/qcm-drag.ts +0 -115
  206. package/src/helpers/test/fixtures/qcm-graphic.ts +0 -79
  207. package/src/helpers/test/fixtures/select-template.ts +0 -97
  208. package/src/helpers/test/fixtures/slider.ts +0 -36
  209. package/src/reducers/ui/slides.ts +0 -58
  210. package/src/types/views/slides.ts +0 -90
  211. /package/es/{helpers/test/map-api-slide-to-ui.test.d.ts → actions/api/test/fetch-skills.test.d.ts} +0 -0
  212. /package/{lib/helpers/test/map-api-slide-to-ui.test.d.ts → es/actions/api/test/fetch-slide.test.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import noop from 'lodash/fp/noop';
2
- import {SlideFromAPI, UISlide} from '../../../types/common';
2
+ import {SlideFromAPI, UISlide} from '../../../../types/common';
3
3
 
4
4
  export const qcmSlide: SlideFromAPI = {
5
5
  question: {
@@ -70,7 +70,11 @@ export const qcmSlide: SlideFromAPI = {
70
70
  tips: 'En 2021, le média en ligne Numerama a créé un NFT vendu aux enchères sur OpenSea. Sur cette plateforme, il est obligatoire de mettre un prix de réserve, autrement dit un prix minimum au-dessous duquel la vente ne sera pas automatiquement acceptée. Sur OpenSea il ne peut être inférieur à 1 ETH. Si le prix de réserve est atteint, pas de problème, les "gas fees" (les frais de gaz) sont couverts par OpenSea. Mais, si ce n’est pas le cas, c’est au vendeur de s’en acquitter. <br/>Le NFT en question est parti à 0,021 ETH, soit 40€ au cours de l\'époque, un prix inférieur au prix de réserve. Numerama a dû acquitter des frais de gaz, et payer 190 €. <br/>Avec les NFT, on ne gagne pas à tous les coups.',
71
71
  universalRef: 'sli_N1XACJobn',
72
72
  hasClue: true,
73
- id: 'sli_N1XACJobn'
73
+ id: 'sli_N1XACJobn',
74
+ parentContentTitle: {
75
+ title: 'Developing the review app',
76
+ type: 'course'
77
+ }
74
78
  };
75
79
 
76
80
  export const qcmUISlide: Partial<UISlide> = {
@@ -0,0 +1,98 @@
1
+ import noop from 'lodash/fp/noop';
2
+ import {SlideFromAPI, UISlide} from '../../../../types/common';
3
+
4
+ export const selectTemplateSlide: SlideFromAPI = {
5
+ question: {
6
+ content: {
7
+ template:
8
+ 'La vue {{sel80495}} présente la liste des utilisateurs ayant le plus grand nombre d’étoiles cumulées.',
9
+ choices: [
10
+ {
11
+ items: [
12
+ {
13
+ _id: '5b57464e3b594d002e8829f7',
14
+ value: 'sli_N13-hG3kX.choice_NJgC3aznJm',
15
+ text: 'Catalogue'
16
+ },
17
+ {
18
+ _id: '5b57464e3b594d002e8829f6',
19
+ value: 'sli_N13-hG3kX.choice_EJZ02aMny7',
20
+ text: 'Leaderboard'
21
+ },
22
+ {
23
+ _id: '5b57464e3b594d002e8829f5',
24
+ value: 'sli_N13-hG3kX.choice_4keCaf21Q',
25
+ text: 'Activité'
26
+ },
27
+ {
28
+ _id: '5b57464e3b594d002e8829f4',
29
+ value: 'sli_N13-hG3kX.choice_NkbJAMn17',
30
+ text: 'Slides'
31
+ }
32
+ ],
33
+ _id: '5b57464e3b594d002e8829f3',
34
+ name: 'sel80495',
35
+ type: 'select'
36
+ }
37
+ ]
38
+ },
39
+ type: 'template',
40
+ header: 'Complétez la phrase ci-dessous.',
41
+ explanation:
42
+ 'Saisissez votre réponse ou sélectionnez la bonne réponse dans le(s) menu(s) déroulant(s).'
43
+ },
44
+ klf: 'L’apprenant peut aussi évaluer sa performance grâce à un classement disponible sur la vue leaderboard. Elle compare sa position par rapport à celle des autres apprenants de la plateforme.',
45
+ tips: "La position d'un apprenant peut être aussi consultée depuis le header ou en-tête de la page. Elle se met à jour à chaque fois qu'un apprenant obtient des étoiles.",
46
+ universalRef: 'sli_N13-hG3kX',
47
+ id: 'sli_N13-hG3kX',
48
+ parentContentTitle: {
49
+ title: 'Developing the review app',
50
+ type: 'course'
51
+ }
52
+ };
53
+
54
+ export const selectTemplateUISlide: Partial<UISlide> = {
55
+ questionText: 'Complétez la phrase ci-dessous.',
56
+ answerUI: {
57
+ help: 'Saisissez votre réponse ou sélectionnez la bonne réponse dans le(s) menu(s) déroulant(s).',
58
+ model: {
59
+ type: 'template',
60
+ template:
61
+ 'La vue {{sel80495}} présente la liste des utilisateurs ayant le plus grand nombre d’étoiles cumulées.',
62
+ answers: [
63
+ {
64
+ type: 'select',
65
+ name: 'sel80495',
66
+ onChange: noop,
67
+ options: [
68
+ {name: 'Select an answer', value: '', validOption: false, selected: true},
69
+ {
70
+ name: 'Catalogue',
71
+ value: 'Catalogue',
72
+ validOption: true,
73
+ selected: false
74
+ },
75
+ {
76
+ name: 'Leaderboard',
77
+ value: 'Leaderboard',
78
+ validOption: true,
79
+ selected: false
80
+ },
81
+ {
82
+ name: 'Activité',
83
+ value: 'Activité',
84
+ validOption: true,
85
+ selected: false
86
+ },
87
+ {
88
+ name: 'Slides',
89
+ value: 'Slides',
90
+ validOption: true,
91
+ selected: false
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ }
97
+ }
98
+ };
@@ -0,0 +1,41 @@
1
+ import noop from 'lodash/fp/noop';
2
+ import {SlideFromAPI, UISlide} from '../../../../types/common';
3
+
4
+ export const sliderSlide: SlideFromAPI = {
5
+ question: {
6
+ content: {
7
+ min: 1,
8
+ max: 15,
9
+ unitLabel: 'an(s)'
10
+ },
11
+ type: 'slider',
12
+ header:
13
+ 'En combien d’années la communauté de communes du Thouarsais est-elle passée de zéro à un tiers d’énergies renouvelables ?',
14
+ explanation: 'Déplacez le curseur.'
15
+ },
16
+ klf: 'Dans le cadre d’un projet local, la communauté de communes du Thouarsais, dans le Poitou (ouest de la France), a développé un parc diversifié d’énergies renouvelables : éolien, biomasse, solaire… En sept ans seulement, entre 2007 et 2014, la part d’énergies renouvelables est passée de zéro à un tiers !',
17
+ tips: 'En 2014, le Thouarsais a reçu la médaille de bronze du championnat européen des énergies renouvelables.',
18
+ universalRef: 'sli_VkAzsCLKb',
19
+ id: 'sli_VkAzsCLKb',
20
+ parentContentTitle: {
21
+ title: 'Developing the review app',
22
+ type: 'course'
23
+ }
24
+ };
25
+
26
+ export const sliderUISlide: Partial<UISlide> = {
27
+ questionText:
28
+ 'En combien d’années la communauté de communes du Thouarsais est-elle passée de zéro à un tiers d’énergies renouvelables ?',
29
+ answerUI: {
30
+ help: 'Déplacez le curseur.',
31
+ model: {
32
+ type: 'slider',
33
+ placeholder: 'Déplacez le curseur.',
34
+ minLabel: '1 an(s)',
35
+ maxLabel: '15 an(s)',
36
+ title: '1 an(s)',
37
+ value: 0,
38
+ onChange: noop
39
+ }
40
+ }
41
+ };
@@ -1,5 +1,5 @@
1
1
  import noop from 'lodash/fp/noop';
2
- import {SlideFromAPI, UISlide} from '../../../types/common';
2
+ import {SlideFromAPI, UISlide} from '../../../../types/common';
3
3
 
4
4
  export const textTemplateSlide: SlideFromAPI = {
5
5
  question: {
@@ -33,7 +33,11 @@ export const textTemplateSlide: SlideFromAPI = {
33
33
  tips: "L'origine de l'expression <i>role model</i> est attribué au sociologue Robert K. Merton.",
34
34
  universalRef: 'sli_VJKQonm2g',
35
35
  hasClue: true,
36
- id: 'sli_VJKQonm2g'
36
+ id: 'sli_VJKQonm2g',
37
+ parentContentTitle: {
38
+ title: 'Using redux',
39
+ type: 'chapter'
40
+ }
37
41
  };
38
42
 
39
43
  export const textTemplateUISlide: Partial<UISlide> = {
@@ -1,5 +1,6 @@
1
1
  import test from 'ava';
2
- import {SlideFromAPI, UISlide} from '../../types/common';
2
+ import identity from 'lodash/fp/identity';
3
+ import {SlideFromAPI, UISlide} from '../../../types/common';
3
4
  import {mapApiSlideToUi} from '../map-api-slide-to-ui';
4
5
  import {qcmUISlide, qcmSlide} from './fixtures/qcm';
5
6
  import {qcmDragUISlide, qcmDragSlide} from './fixtures/qcm-drag';
@@ -9,7 +10,7 @@ import {textTemplateSlide, textTemplateUISlide} from './fixtures/text-template';
9
10
  import {selectTemplateSlide, selectTemplateUISlide} from './fixtures/select-template';
10
11
  import {sliderSlide, sliderUISlide} from './fixtures/slider';
11
12
 
12
- const _mapApiSlideToUi = mapApiSlideToUi({translate: (text: string) => text});
13
+ const _mapApiSlideToUi = mapApiSlideToUi(identity);
13
14
 
14
15
  const macro = test.macro({
15
16
  title(providedTitle) {
@@ -19,28 +20,38 @@ const macro = test.macro({
19
20
  t,
20
21
  arg: {
21
22
  slide: SlideFromAPI;
23
+ answers: string[];
22
24
  expectedUiSlide: Partial<UISlide>;
23
25
  }
24
26
  ) {
25
27
  t.deepEqual(
26
- JSON.parse(JSON.stringify(_mapApiSlideToUi(arg.slide))),
28
+ JSON.parse(JSON.stringify(_mapApiSlideToUi(arg.slide, arg.answers))),
27
29
  JSON.parse(JSON.stringify(arg.expectedUiSlide))
28
30
  );
29
31
  }
30
32
  });
31
33
 
32
- test('qcm', macro, {slide: qcmSlide, expectedUiSlide: qcmUISlide});
33
- test('qcm drag', macro, {slide: qcmDragSlide, expectedUiSlide: qcmDragUISlide});
34
- test('qcm graphic', macro, {slide: qcmGraphicSlide, expectedUiSlide: qcmGraphicUISlide});
35
- test('text template', macro, {slide: textTemplateSlide, expectedUiSlide: textTemplateUISlide});
34
+ test('qcm', macro, {slide: qcmSlide, answers: [], expectedUiSlide: qcmUISlide});
35
+ test('qcm drag', macro, {slide: qcmDragSlide, answers: [], expectedUiSlide: qcmDragUISlide});
36
+ test('qcm graphic', macro, {
37
+ slide: qcmGraphicSlide,
38
+ answers: [],
39
+ expectedUiSlide: qcmGraphicUISlide
40
+ });
41
+ test('text template', macro, {
42
+ slide: textTemplateSlide,
43
+ answers: [],
44
+ expectedUiSlide: textTemplateUISlide
45
+ });
36
46
  test('select template', macro, {
37
47
  slide: selectTemplateSlide,
48
+ answers: [],
38
49
  expectedUiSlide: selectTemplateUISlide
39
50
  });
40
- test('free text', macro, {slide: freeTextSlide, expectedUiSlide: freeTextUISlide});
41
- test('slider', macro, {slide: sliderSlide, expectedUiSlide: sliderUISlide});
51
+ test('free text', macro, {slide: freeTextSlide, answers: [], expectedUiSlide: freeTextUISlide});
52
+ test('slider', macro, {slide: sliderSlide, answers: [], expectedUiSlide: sliderUISlide});
42
53
 
43
54
  test('should throw an error if the question type can not be handled', t => {
44
55
  const faultySlide = {...qcmSlide, question: {type: 'lol'}};
45
- t.throws(() => _mapApiSlideToUi(faultySlide as SlideFromAPI));
56
+ t.throws(() => _mapApiSlideToUi(faultySlide as SlideFromAPI, []));
46
57
  });
@@ -1,11 +0,0 @@
1
- import { AnswerUI } from '../types/slides';
2
- import { SlideFromAPI } from '../types/common';
3
- declare type UiUtils = {
4
- translate: (text: string) => string;
5
- };
6
- export declare const getQuestionType: (slide: SlideFromAPI) => SlideFromAPI['question']['type'];
7
- export declare const mapApiSlideToUi: (uiUtils: UiUtils) => (slide: SlideFromAPI) => {
8
- questionText: string;
9
- answerUI: AnswerUI;
10
- };
11
- export {};
@@ -1,193 +0,0 @@
1
- import { concat, divide, get, getOr, head, includes, indexOf, isEmpty, map, pipe, rangeStep, size, toInteger } from 'lodash/fp';
2
- const qcmProps = (question) => {
3
- // TODO: EDIT_CHOICES -> getAnswerValues
4
- const answers = [];
5
- return {
6
- type: 'qcm',
7
- answers: map(choice => ({
8
- title: choice.label,
9
- selected: includes(choice.label, answers),
10
- // TODO: EDIT_CHOICES
11
- // eslint-disable-next-line no-console
12
- onClick: () => console.log('TODO: on choice click'),
13
- ariaLabel: choice.label
14
- }),
15
- // TODO: EDIT_CHOICES -> getChoices
16
- question.content.choices)
17
- };
18
- };
19
- const qcmDragProps = (question) => {
20
- // TODO: EDIT_CHOICES -> getAnswerValues
21
- const answers = [];
22
- return {
23
- type: 'qcmDrag',
24
- answers: map(choice => {
25
- const indexInAnswer = indexOf(choice.label, answers);
26
- return {
27
- title: choice.label,
28
- selected: indexInAnswer !== -1,
29
- order: indexInAnswer,
30
- // TODO: EDIT_CHOICES
31
- // eslint-disable-next-line no-console
32
- onClick: () => console.log('TODO: on choice click')
33
- };
34
- // TODO: EDIT_CHOICES -> getChoices
35
- }, question.content.choices)
36
- };
37
- };
38
- const qcmGraphicProps = (question) => {
39
- // mock the answers
40
- // TODO: EDIT_CHOICES -> getAnswerValues
41
- const answers = [];
42
- return {
43
- type: 'qcmGraphic',
44
- answers: map(choice => ({
45
- title: choice.label,
46
- image: get('media.src.0.url', choice),
47
- selected: includes(choice.label, answers),
48
- // TODO: EDIT_CHOICES
49
- // eslint-disable-next-line no-console
50
- onClick: () => console.log('TODO: on choice click')
51
- }),
52
- // TODO: EDIT_CHOICES -> getChoices
53
- question.content.choices)
54
- };
55
- };
56
- const templateTextProps = (uiUtils) => (choice, index) => {
57
- const { translate } = uiUtils;
58
- // TODO: EDIT_CHOICES -> getAnswerValues
59
- const answers = [];
60
- return {
61
- type: 'text',
62
- name: getOr('', 'name', choice),
63
- placeholder: translate('Type here'),
64
- value: get(index, answers),
65
- // TODO: EDIT_CHOICES
66
- // eslint-disable-next-line no-console
67
- onChange: () => console.log('TODO: on choice change')
68
- };
69
- };
70
- // const getItemText = (item: ChoiceFromAPI['items'][0]): item['text'] is string =>
71
- const templateSelectProps = (uiUtils) => {
72
- return (choice, index) => {
73
- const { translate } = uiUtils;
74
- // TODO: EDIT_CHOICES -> getAnswerValues
75
- const answers = [];
76
- const answer = get(index, answers);
77
- const temporaryOption = {
78
- name: translate('Select an answer'),
79
- value: '',
80
- validOption: false,
81
- selected: true
82
- };
83
- const selectOptions = choice.items.map(item => {
84
- const itemText = getOr('', 'text', item);
85
- return {
86
- name: itemText,
87
- value: itemText,
88
- validOption: true,
89
- selected: itemText === answer
90
- };
91
- });
92
- return {
93
- type: 'select',
94
- name: getOr('', 'name', choice),
95
- // TODO: EDIT_CHOICES
96
- // eslint-disable-next-line no-console
97
- onChange: () => console.log('TODO: on choice change'),
98
- options: isEmpty(answer) ? concat([temporaryOption], selectOptions) : selectOptions
99
- };
100
- };
101
- };
102
- const templateProps = (uiUtils) => {
103
- const templateTextProps_ = templateTextProps(uiUtils);
104
- const templateSelectProps_ = templateSelectProps(uiUtils);
105
- return question => {
106
- // TODO: EDIT_CHOICES -> getChoices
107
- const choices = question.content.choices;
108
- return {
109
- type: 'template',
110
- template: get('content.template', question),
111
- answers: choices.map((choice, index) => choice.type === 'text'
112
- ? templateTextProps_(choice, index)
113
- : templateSelectProps_(choice, index))
114
- };
115
- };
116
- };
117
- const basicProps = (uiUtils) => {
118
- const { translate } = uiUtils;
119
- // TODO: EDIT_CHOICES -> getAnswerValues
120
- const answers = [];
121
- return () => {
122
- return {
123
- type: 'freeText',
124
- placeholder: translate('Type here'),
125
- value: head(answers),
126
- // TODO: EDIT_CHOICES
127
- // eslint-disable-next-line no-console
128
- onChange: () => console.log('TODO: on choice change')
129
- };
130
- };
131
- };
132
- const sliderProps = (question) => {
133
- const values = rangeStep(getOr(1, 'content.step', question), getOr(Number.NaN, 'content.min', question), getOr(Number.NaN, 'content.max', question) + 1
134
- // Lodash doesn't infer the type very well here
135
- );
136
- // TODO: EDIT_CHOICES -> getAnswerValues
137
- const answers = [];
138
- const stateValue = head(answers);
139
- const currentValue = toInteger(stateValue);
140
- const indexValue = indexOf(currentValue, values);
141
- const sliderPosition = divide(indexValue, size(values) - 1);
142
- const unitLabel = get('question.content.unitLabel', question);
143
- return {
144
- type: 'slider',
145
- placeholder: question.explanation,
146
- minLabel: `${question.content.min} ${unitLabel}`,
147
- maxLabel: `${question.content.max} ${unitLabel}`,
148
- title: `${currentValue} ${question.content.unitLabel}`,
149
- value: sliderPosition,
150
- // TODO: EDIT_CHOICES
151
- // eslint-disable-next-line no-console
152
- onChange: () => console.log('TODO: on choice change')
153
- };
154
- };
155
- export const getQuestionType = (slide) => slide.question.type;
156
- const getHelp = (uiUtils) => (slide) => {
157
- const { translate } = uiUtils;
158
- return get('question.explanation', slide) || translate('Select something below');
159
- };
160
- const getAnswerUIModel = (uiUtils) => {
161
- const basicProps_ = basicProps(uiUtils);
162
- const templateProps_ = templateProps(uiUtils);
163
- return slide => {
164
- const type = getQuestionType(slide);
165
- switch (type) {
166
- case 'qcm':
167
- return pipe(get('question'), qcmProps)(slide);
168
- case 'qcmGraphic':
169
- return pipe(get('question'), qcmGraphicProps)(slide);
170
- case 'qcmDrag':
171
- return pipe(get('question'), qcmDragProps)(slide);
172
- case 'basic':
173
- return basicProps_();
174
- case 'template':
175
- return pipe(get('question'), templateProps_)(slide);
176
- case 'slider':
177
- return pipe(get('question'), sliderProps)(slide);
178
- default:
179
- throw new Error(`${type} is not an handled question.type`);
180
- }
181
- };
182
- };
183
- export const mapApiSlideToUi = (uiUtils) => {
184
- const getAnswerUIModel_ = getAnswerUIModel(uiUtils);
185
- const getHelp_ = getHelp(uiUtils);
186
- return slide => {
187
- if (!slide) {
188
- throw new Error('no slide was found');
189
- }
190
- const questionText = pipe(getOr('', 'question.header'), uiUtils.translate)(slide);
191
- return { questionText, answerUI: { model: getAnswerUIModel_(slide), help: getHelp_(slide) } };
192
- };
193
- };
@@ -1,30 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- export const freeTextSlide = {
3
- id: 'sli_E1Pcl-XAYbi',
4
- universalRef: 'sli_E1Pcl-XAYbi',
5
- question: {
6
- type: 'basic',
7
- header: 'sli_E1Pcl-XAYbi.header',
8
- explanation: 'sli_E1Pcl-XAYbi.explanation',
9
- content: {
10
- label: 'sli_E1Pcl-XAYbi.label',
11
- placeholder: 'sli_E1Pcl-XAYbi.placeholder',
12
- id: 'sli_E1Pcl-XAYbi.choice_1'
13
- }
14
- },
15
- clue: 'sli_E1Pcl-XAYbi.clue',
16
- klf: 'sli_E1Pcl-XAYbi.klf',
17
- tips: 'sli_E1Pcl-XAYbi.tips'
18
- };
19
- export const freeTextUISlide = {
20
- answerUI: {
21
- help: 'sli_E1Pcl-XAYbi.explanation',
22
- model: {
23
- type: 'freeText',
24
- placeholder: 'Type here',
25
- value: undefined,
26
- onChange: noop
27
- }
28
- },
29
- questionText: 'sli_E1Pcl-XAYbi.header'
30
- };
@@ -1,112 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- export const qcmDragSlide = {
3
- id: 'sli_419IlQQnf',
4
- universalRef: 'sli_419IlQQnf',
5
- question: {
6
- type: 'qcmDrag',
7
- header: 'sli_419IlQQnf.header',
8
- explanation: 'sli_419IlQQnf.explanation',
9
- content: {
10
- choices: [
11
- {
12
- media: {
13
- src: [],
14
- posters: [],
15
- subtitles: []
16
- },
17
- _id: '62b1ba3ec4f4015504212571',
18
- label: 'sli_419IlQQnf.choice_4kWwlQXhG',
19
- value: 'sli_419IlQQnf.choice_4kWwlQXhG',
20
- items: []
21
- },
22
- {
23
- media: {
24
- src: [],
25
- posters: [],
26
- subtitles: []
27
- },
28
- _id: '62b1ba3ec4f4015504212572',
29
- label: 'sli_419IlQQnf.choice_NJxbwgXm2G',
30
- value: 'sli_419IlQQnf.choice_NJxbwgXm2G',
31
- items: []
32
- },
33
- {
34
- media: {
35
- src: [],
36
- posters: [],
37
- subtitles: []
38
- },
39
- _id: '62b1ba3ec4f4015504212573',
40
- label: 'sli_419IlQQnf.choice_41fwgQXnf',
41
- value: 'sli_419IlQQnf.choice_41fwgQXnf',
42
- items: []
43
- },
44
- {
45
- media: {
46
- src: [],
47
- posters: [],
48
- subtitles: []
49
- },
50
- _id: '62b1ba3ec4f4015504212574',
51
- label: 'sli_419IlQQnf.choice_VJmweQ7nz',
52
- value: 'sli_419IlQQnf.choice_VJmweQ7nz',
53
- items: []
54
- },
55
- {
56
- media: {
57
- src: [],
58
- posters: [],
59
- subtitles: []
60
- },
61
- _id: '62b1ba3ec4f4015504212575',
62
- label: 'sli_419IlQQnf.choice_4kDDgXQhz',
63
- value: 'sli_419IlQQnf.choice_4kDDgXQhz',
64
- items: []
65
- }
66
- ]
67
- }
68
- },
69
- klf: 'sli_419IlQQnf.klf',
70
- tips: 'sli_419IlQQnf.tips'
71
- };
72
- export const qcmDragUISlide = {
73
- questionText: 'sli_419IlQQnf.header',
74
- answerUI: {
75
- help: 'sli_419IlQQnf.explanation',
76
- model: {
77
- type: 'qcmDrag',
78
- answers: [
79
- {
80
- title: 'sli_419IlQQnf.choice_4kWwlQXhG',
81
- selected: false,
82
- order: -1,
83
- onClick: noop
84
- },
85
- {
86
- title: 'sli_419IlQQnf.choice_NJxbwgXm2G',
87
- selected: false,
88
- order: -1,
89
- onClick: noop
90
- },
91
- {
92
- title: 'sli_419IlQQnf.choice_41fwgQXnf',
93
- selected: false,
94
- order: -1,
95
- onClick: noop
96
- },
97
- {
98
- title: 'sli_419IlQQnf.choice_VJmweQ7nz',
99
- selected: false,
100
- order: -1,
101
- onClick: noop
102
- },
103
- {
104
- title: 'sli_419IlQQnf.choice_4kDDgXQhz',
105
- selected: false,
106
- order: -1,
107
- onClick: noop
108
- }
109
- ]
110
- }
111
- }
112
- };
@@ -1,76 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- export const qcmGraphicSlide = {
3
- id: 'sli_41~RSVclH',
4
- universalRef: 'sli_41~RSVclH',
5
- question: {
6
- type: 'qcmGraphic',
7
- header: 'sli_41~RSVclH.header',
8
- explanation: 'sli_41~RSVclH.explanation',
9
- content: {
10
- choices: [
11
- {
12
- media: {
13
- type: 'img',
14
- src: [
15
- {
16
- _id: '5fdce726359bf4003ee66997',
17
- mimeType: 'image/png',
18
- url: 'med_4JVRrE5gH.mediaUrl_VkBtUV9gB'
19
- }
20
- ],
21
- posters: [],
22
- subtitles: []
23
- },
24
- _id: '5fdce726359bf4003ee66996',
25
- label: 'sli_41~RSVclH.choice_V1gN0r4qgS',
26
- value: 'sli_41~RSVclH.choice_V1gN0r4qgS',
27
- items: []
28
- },
29
- {
30
- media: {
31
- type: 'img',
32
- src: [
33
- {
34
- _id: '5fdce726359bf4003ee66999',
35
- mimeType: 'image/png',
36
- url: 'med_Ek8gIEqxB.mediaUrl_EkcFUEclH'
37
- }
38
- ],
39
- posters: [],
40
- subtitles: []
41
- },
42
- _id: '5fdce726359bf4003ee66998',
43
- label: 'sli_41~RSVclH.choice_4JlLeLE5lS',
44
- value: 'sli_41~RSVclH.choice_4JlLeLE5lS',
45
- items: []
46
- }
47
- ]
48
- }
49
- },
50
- clue: 'sli_41~RSVclH.clue',
51
- klf: 'sli_41~RSVclH.klf',
52
- tips: 'sli_41~RSVclH.tips'
53
- };
54
- export const qcmGraphicUISlide = {
55
- questionText: 'sli_41~RSVclH.header',
56
- answerUI: {
57
- help: 'sli_41~RSVclH.explanation',
58
- model: {
59
- type: 'qcmGraphic',
60
- answers: [
61
- {
62
- title: 'sli_41~RSVclH.choice_V1gN0r4qgS',
63
- image: 'med_4JVRrE5gH.mediaUrl_VkBtUV9gB',
64
- selected: false,
65
- onClick: noop
66
- },
67
- {
68
- title: 'sli_41~RSVclH.choice_4JlLeLE5lS',
69
- image: 'med_Ek8gIEqxB.mediaUrl_EkcFUEclH',
70
- selected: false,
71
- onClick: noop
72
- }
73
- ]
74
- }
75
- }
76
- };