@coorpacademy/app-review 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/es/actions/api/post-answer.d.ts +5 -1
  2. package/es/actions/ui/answers.d.ts +1 -1
  3. package/es/actions/ui/answers.js +6 -4
  4. package/es/actions/ui/test/answers.test.js +15 -5
  5. package/es/reducers/data/index.d.ts +1 -1
  6. package/es/reducers/data/progression.d.ts +2 -1
  7. package/es/reducers/data/progression.js +2 -0
  8. package/es/reducers/data/test/progression.test.js +11 -26
  9. package/es/reducers/index.d.ts +1 -1
  10. package/es/reducers/ui/index.d.ts +1 -1
  11. package/es/reducers/ui/test/answers.test.js +4 -0
  12. package/es/test/util/services.mock.d.ts +1 -0
  13. package/es/test/util/services.mock.js +4 -1
  14. package/es/views/slides/index.js +1 -1
  15. package/es/views/slides/map-api-slide-to-ui.js +26 -22
  16. package/es/views/slides/test/fixtures/template.d.ts +4 -0
  17. package/es/views/slides/test/fixtures/{select-template.js → template.js} +82 -4
  18. package/es/views/slides/test/index.test.js +239 -0
  19. package/es/views/slides/test/map-api-slide-to-ui.test.js +4 -10
  20. package/es/views/slides/test/slide.template.on-change.test.d.ts +1 -0
  21. package/es/views/slides/test/slide.template.on-change.test.js +79 -0
  22. package/lib/actions/api/post-answer.d.ts +5 -1
  23. package/lib/actions/ui/answers.d.ts +1 -1
  24. package/lib/actions/ui/answers.js +6 -4
  25. package/lib/actions/ui/test/answers.test.js +24 -5
  26. package/lib/reducers/data/index.d.ts +1 -1
  27. package/lib/reducers/data/progression.d.ts +2 -1
  28. package/lib/reducers/data/progression.js +2 -0
  29. package/lib/reducers/data/test/progression.test.js +11 -26
  30. package/lib/reducers/index.d.ts +1 -1
  31. package/lib/reducers/ui/index.d.ts +1 -1
  32. package/lib/reducers/ui/test/answers.test.js +4 -0
  33. package/lib/test/util/services.mock.d.ts +1 -0
  34. package/lib/test/util/services.mock.js +4 -1
  35. package/lib/views/slides/index.js +1 -1
  36. package/lib/views/slides/map-api-slide-to-ui.js +34 -28
  37. package/lib/views/slides/test/fixtures/template.d.ts +4 -0
  38. package/lib/views/slides/test/fixtures/{select-template.js → template.js} +82 -4
  39. package/lib/views/slides/test/index.test.js +239 -0
  40. package/lib/views/slides/test/map-api-slide-to-ui.test.js +4 -10
  41. package/lib/views/slides/test/slide.template.on-change.test.d.ts +1 -0
  42. package/lib/views/slides/test/slide.template.on-change.test.js +82 -0
  43. package/package.json +3 -3
  44. package/src/actions/api/post-answer.ts +6 -1
  45. package/src/actions/ui/answers.ts +8 -6
  46. package/src/actions/ui/test/answers.test.ts +17 -5
  47. package/src/reducers/data/progression.ts +3 -1
  48. package/src/reducers/data/test/progression.test.ts +12 -28
  49. package/src/reducers/ui/test/answers.test.ts +5 -0
  50. package/src/test/util/services.mock.ts +4 -1
  51. package/src/views/slides/index.ts +1 -1
  52. package/src/views/slides/map-api-slide-to-ui.ts +63 -30
  53. package/src/views/slides/test/fixtures/{select-template.ts → template.ts} +82 -4
  54. package/src/views/slides/test/index.test.ts +253 -0
  55. package/src/views/slides/test/map-api-slide-to-ui.test.ts +4 -10
  56. package/src/views/slides/test/slide.template.on-change.test.ts +92 -0
  57. package/es/views/slides/test/fixtures/select-template.d.ts +0 -4
  58. package/es/views/slides/test/fixtures/text-template.d.ts +0 -4
  59. package/es/views/slides/test/fixtures/text-template.js +0 -58
  60. package/lib/views/slides/test/fixtures/select-template.d.ts +0 -4
  61. package/lib/views/slides/test/fixtures/text-template.d.ts +0 -4
  62. package/lib/views/slides/test/fixtures/text-template.js +0 -58
  63. package/src/views/slides/test/fixtures/text-template.ts +0 -62
@@ -238,3 +238,256 @@ test('should create initial props when the slide is on the state', t => {
238
238
  }
239
239
  });
240
240
  });
241
+
242
+ test('should create props when the next slide is on the state', t => {
243
+ const state: StoreState = {
244
+ data: {
245
+ progression: {
246
+ _id: '62b1d1087aa12f00253f40ee',
247
+ content: {
248
+ ref: '_skill-ref',
249
+ type: 'skill'
250
+ },
251
+ engine: {
252
+ ref: 'review'
253
+ },
254
+ state: {
255
+ allAnswers: [
256
+ {
257
+ slideRef: 'sli_VJYjJnJhg',
258
+ isCorrect: true,
259
+ answer: ['Benchmark']
260
+ }
261
+ ],
262
+ isCorrect: true,
263
+ nextContent: {
264
+ ref: 'sli_VkSQroQnx',
265
+ type: 'slide'
266
+ },
267
+ content: {
268
+ ref: 'sli_VJYjJnJhg',
269
+ type: 'slide'
270
+ },
271
+ pendingSlides: [],
272
+ slides: ['sli_VJYjJnJhg'],
273
+ step: {
274
+ current: 2
275
+ },
276
+ stars: 4
277
+ }
278
+ },
279
+ skills: [],
280
+ slides: {
281
+ sli_VJYjJnJhg: {
282
+ question: {
283
+ content: {
284
+ media: {
285
+ src: [],
286
+ posters: [],
287
+ subtitles: []
288
+ },
289
+ label: '',
290
+ placeholder: 'Type here',
291
+ id: 'sli_VJYjJnJhg.choice_1'
292
+ },
293
+ type: 'basic',
294
+ header:
295
+ 'Which term is used to describe the act of asking what the usual salary is for the position you are applying for?',
296
+ explanation: 'Type your answer.'
297
+ },
298
+ klf: 'To negotiate your salary when being hired, you have to establish a benchmark beforehand. In other words, you should assess the salary to which you aspire by enquiring about the remuneration paid in the same industry, the same region and the same position.',
299
+ tips: 'According to Insee, Paris salaries are 20-25% higher compared with those of the provinces in 2015.',
300
+ universalRef: 'sli_VJYjJnJhg',
301
+ id: 'sli_VJYjJnJhg',
302
+ parentContentTitle: {
303
+ title: 'Developing the review app',
304
+ type: 'course'
305
+ }
306
+ },
307
+ sli_VkSQroQnx: {
308
+ question: {
309
+ content: {
310
+ media: {
311
+ src: [],
312
+ posters: [],
313
+ subtitles: []
314
+ },
315
+ choices: [
316
+ {
317
+ media: {
318
+ src: [
319
+ {
320
+ _id: '624efd915948a7013083e986',
321
+ mimeType: 'image/jpeg',
322
+ url: '//static.coorpacademy.com/content/CoorpAcademy/content-partnerships/cockpit-partner-au-feminin/default/true-1512554153232.jpg',
323
+ id: '624efd915948a7013083e986'
324
+ }
325
+ ],
326
+ posters: [],
327
+ subtitles: [],
328
+ type: 'img'
329
+ },
330
+ items: [],
331
+ _id: '624efd915948a7013083e985',
332
+ label: 'Vrai',
333
+ value: 'sli_VkSQroQnx.choice_NJesyUo7nx',
334
+ id: '624efd915948a7013083e985'
335
+ },
336
+ {
337
+ media: {
338
+ src: [
339
+ {
340
+ _id: '624efd915948a7013083e988',
341
+ mimeType: 'image/jpeg',
342
+ url: '//static.coorpacademy.com/content/CoorpAcademy/content-partnerships/cockpit-partner-au-feminin/default/false-1512554160848.jpg',
343
+ id: '624efd915948a7013083e988'
344
+ }
345
+ ],
346
+ posters: [],
347
+ subtitles: [],
348
+ type: 'img'
349
+ },
350
+ items: [],
351
+ _id: '624efd915948a7013083e987',
352
+ label: 'Faux',
353
+ value: 'sli_VkSQroQnx.choice_VkgayLjX3e',
354
+ id: '624efd915948a7013083e987'
355
+ }
356
+ ]
357
+ },
358
+ type: 'qcmGraphic',
359
+ header:
360
+ 'Pour mener une bonne négociation, il ne faut ressentir aucune émotion. Vrai ou faux ?',
361
+ explanation: 'Sélectionnez la bonne réponse.'
362
+ },
363
+ klf: "Il ne faut pas prendre la négociation comme une affaire personnelle, afin de rester centré sur son sujet. Mais cela ne signifie pas être dépourvu de toute émotion, car celles-ci peuvent être de vrais atouts. À condition de réussir à les exprimer sans accuser l'autre d'en être à l'origine.",
364
+ tips: "Pour gérer ses émotions, il faut d'abord les identifier, notamment en analysant ses ressentis physiques et en trouvant l'élément déclencheur.",
365
+ universalRef: 'sli_VkSQroQnx',
366
+ id: 'sli_VkSQroQnx',
367
+ parentContentTitle: {
368
+ title: 'Developing the review app',
369
+ type: 'course'
370
+ }
371
+ }
372
+ },
373
+ token: 'undefined'
374
+ },
375
+ ui: {
376
+ currentSlideRef: 'sli_VJYjJnJhg',
377
+ navigation: ['loader', 'slides'],
378
+ answers: ['My value'],
379
+ slide: {
380
+ validateButton: false
381
+ }
382
+ }
383
+ };
384
+
385
+ const props = mapStateToSlidesProps(state, identity);
386
+ t.is(props.congratsProps, undefined);
387
+ t.deepEqual(omit(['onQuitClick'], props.header), {
388
+ 'aria-label': 'aria-header-wrapper',
389
+ closeButtonAriaLabel: 'aria-close-button',
390
+ mode: '__revision_mode',
391
+ skillName: '__agility',
392
+ steps: [
393
+ {
394
+ current: true,
395
+ icon: 'right',
396
+ value: '1'
397
+ },
398
+ {
399
+ // FIX ME: update on PR -> https://trello.com/c/qOSDa8Fm/2715-app-review-props-dynamiques-pour-les-step-items-du-header-bas%C3%A9-sur-le-state
400
+ current: true,
401
+ icon: 'no-answer',
402
+ value: '2'
403
+ },
404
+ {
405
+ current: false,
406
+ icon: 'no-answer',
407
+ value: '3'
408
+ },
409
+ {
410
+ current: false,
411
+ icon: 'no-answer',
412
+ value: '4'
413
+ },
414
+ {
415
+ current: false,
416
+ icon: 'no-answer',
417
+ value: '5'
418
+ }
419
+ ]
420
+ });
421
+ t.deepEqual(omit(['validateButton', 'slides'], props.stack), {
422
+ correctionPopinProps: undefined,
423
+ endReview: false
424
+ });
425
+ t.true(props.stack.validateButton.disabled);
426
+ t.deepEqual(omit('answerUI', props.stack.slides['0']), {
427
+ hidden: false,
428
+ position: 0,
429
+ loading: false,
430
+ parentContentTitle: 'From "Developing the review app" course',
431
+ questionText:
432
+ 'Which term is used to describe the act of asking what the usual salary is for the position you are applying for?'
433
+ });
434
+ t.deepEqual(omit('model.onChange', props.stack.slides['0'].answerUI), {
435
+ help: 'Type your answer.',
436
+ model: {
437
+ placeholder: 'Type here',
438
+ type: 'freeText',
439
+ value: 'My value'
440
+ }
441
+ });
442
+ t.deepEqual(
443
+ omit(
444
+ ['0', '1.answerUI.model.answers.0.onClick', '1.answerUI.model.answers.1.onClick'],
445
+ props.stack.slides
446
+ ),
447
+ {
448
+ '1': {
449
+ answerUI: {
450
+ help: 'Sélectionnez la bonne réponse.',
451
+ model: {
452
+ answers: [
453
+ {
454
+ image:
455
+ '//static.coorpacademy.com/content/CoorpAcademy/content-partnerships/cockpit-partner-au-feminin/default/true-1512554153232.jpg',
456
+ selected: false,
457
+ title: 'Vrai'
458
+ },
459
+ {
460
+ image:
461
+ '//static.coorpacademy.com/content/CoorpAcademy/content-partnerships/cockpit-partner-au-feminin/default/false-1512554160848.jpg',
462
+ selected: false,
463
+ title: 'Faux'
464
+ }
465
+ ],
466
+ type: 'qcmGraphic'
467
+ }
468
+ },
469
+ hidden: false,
470
+ loading: false,
471
+ position: 1,
472
+ parentContentTitle: 'From "Developing the review app" course',
473
+ questionText:
474
+ 'Pour mener une bonne négociation, il ne faut ressentir aucune émotion. Vrai ou faux ?'
475
+ },
476
+ '2': {
477
+ hidden: false,
478
+ position: 2,
479
+ loading: true
480
+ },
481
+ '3': {
482
+ hidden: false,
483
+ position: 3,
484
+ loading: true
485
+ },
486
+ '4': {
487
+ hidden: false,
488
+ position: 4,
489
+ loading: true
490
+ }
491
+ }
492
+ );
493
+ });
@@ -7,8 +7,7 @@ import {qcmUISlide, qcmSlide} from './fixtures/qcm';
7
7
  import {qcmDragUISlide, qcmDragSlide} from './fixtures/qcm-drag';
8
8
  import {freeTextSlide, freeTextUISlide} from './fixtures/free-text';
9
9
  import {qcmGraphicUISlide, qcmGraphicSlide} from './fixtures/qcm-graphic';
10
- import {textTemplateSlide, textTemplateUISlide} from './fixtures/text-template';
11
- import {selectTemplateSlide, selectTemplateUISlide} from './fixtures/select-template';
10
+ import {templateSlide, templateUISlide} from './fixtures/template';
12
11
  import {sliderSlide, sliderUISlide} from './fixtures/slider';
13
12
 
14
13
  const _mapApiSlideToUi = mapApiSlideToUi(identity);
@@ -39,15 +38,10 @@ test('qcm graphic', macro, {
39
38
  answers: [],
40
39
  expectedUiSlide: qcmGraphicUISlide
41
40
  });
42
- test('text template', macro, {
43
- slide: textTemplateSlide,
41
+ test('template', macro, {
42
+ slide: templateSlide,
44
43
  answers: [],
45
- expectedUiSlide: textTemplateUISlide
46
- });
47
- test('select template', macro, {
48
- slide: selectTemplateSlide,
49
- answers: [],
50
- expectedUiSlide: selectTemplateUISlide
44
+ expectedUiSlide: templateUISlide
51
45
  });
52
46
  test('free text', macro, {slide: freeTextSlide, answers: [], expectedUiSlide: freeTextUISlide});
53
47
  test('slider', macro, {slide: sliderSlide, answers: [], expectedUiSlide: sliderUISlide});
@@ -0,0 +1,92 @@
1
+ import test from 'ava';
2
+ import omit from 'lodash/fp/omit';
3
+ import get from 'lodash/fp/get';
4
+ import {mapStateToSlidesProps} from '..';
5
+ import {ProgressionFromAPI} from '../../../types/common';
6
+ import {services} from '../../../test/util/services.mock';
7
+ import {createTestStore} from '../../../actions/test/create-test-store';
8
+ import {StoreState} from '../../../reducers';
9
+ import {EDIT_TEMPLATE} from '../../../actions/ui/answers';
10
+ import {Template} from '../../../types/slides';
11
+ import {templateSlide} from './fixtures/template';
12
+
13
+ const progression: ProgressionFromAPI = {
14
+ _id: '123456789123',
15
+ content: {type: 'skill', ref: '_skill-ref'},
16
+ engine: {
17
+ ref: 'review'
18
+ },
19
+ state: {
20
+ allAnswers: [],
21
+ isCorrect: true,
22
+ nextContent: {
23
+ ref: templateSlide.id,
24
+ type: 'slide'
25
+ },
26
+ pendingSlides: [],
27
+ slides: [],
28
+ step: {
29
+ current: 1
30
+ },
31
+ stars: 0
32
+ }
33
+ };
34
+
35
+ const initialState: StoreState = {
36
+ data: {
37
+ progression,
38
+ slides: {
39
+ [templateSlide.id]: templateSlide
40
+ },
41
+ skills: [],
42
+ token: '1234'
43
+ },
44
+ ui: {
45
+ currentSlideRef: templateSlide.id,
46
+ navigation: ['skills', 'slides'],
47
+ answers: [],
48
+ slide: {
49
+ validateButton: false
50
+ }
51
+ }
52
+ };
53
+
54
+ test('should dispatch EDIT_TEMPLATE action via the property onChange of a Template Text slide', t => {
55
+ t.plan(2);
56
+
57
+ const expectedActions = [{type: EDIT_TEMPLATE, payload: ['', 'test', '']}];
58
+ const {dispatch, getState} = createTestStore(t, initialState, services, expectedActions);
59
+
60
+ const props = mapStateToSlidesProps(getState(), dispatch);
61
+ t.deepEqual(omit('answerUI', props.stack.slides['0']), {
62
+ hidden: false,
63
+ position: 0,
64
+ loading: false,
65
+ parentContentTitle: 'From "Developing the review app" course',
66
+ questionText: 'Complétez la phrase ci-dessous.'
67
+ });
68
+
69
+ const SlideProps = props.stack.slides['0'].answerUI?.model as Template;
70
+ const onChange = get(['1', 'onChange'], SlideProps.answers);
71
+ onChange('test');
72
+ });
73
+
74
+ test('should dispatch EDIT_TEMPLATE action via the property onChange of a Template Select slide', t => {
75
+ t.plan(2);
76
+
77
+ const expectedActions = [{type: EDIT_TEMPLATE, payload: ['Catalogue', '', '']}];
78
+ const {dispatch, getState} = createTestStore(t, initialState, services, expectedActions);
79
+
80
+ const props = mapStateToSlidesProps(getState(), dispatch);
81
+ t.deepEqual(omit('answerUI', props.stack.slides['0']), {
82
+ hidden: false,
83
+ position: 0,
84
+ loading: false,
85
+ parentContentTitle: 'From "Developing the review app" course',
86
+ questionText: 'Complétez la phrase ci-dessous.'
87
+ });
88
+
89
+ const SlideProps = props.stack.slides['0'].answerUI?.model as Template;
90
+ const onChange = get(['0', 'onChange'], SlideProps.answers);
91
+ onChange('Catalogue');
92
+ });
@@ -1,4 +0,0 @@
1
- import { UISlide } from '../..';
2
- import { SlideFromAPI } from '../../../../types/common';
3
- export declare const selectTemplateSlide: SlideFromAPI;
4
- export declare const selectTemplateUISlide: Partial<UISlide>;
@@ -1,4 +0,0 @@
1
- import { UISlide } from '../..';
2
- import { SlideFromAPI } from '../../../../types/common';
3
- export declare const textTemplateSlide: SlideFromAPI;
4
- export declare const textTemplateUISlide: Partial<UISlide>;
@@ -1,58 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- export const textTemplateSlide = {
3
- question: {
4
- content: {
5
- media: {
6
- src: [],
7
- posters: [],
8
- subtitles: []
9
- },
10
- template: 'Un {{inp58402}} model.',
11
- choices: [
12
- {
13
- media: {
14
- src: [],
15
- posters: [],
16
- subtitles: []
17
- },
18
- items: [],
19
- _id: '62433c2c58920f02c4950de0',
20
- type: 'text',
21
- name: 'inp58402',
22
- id: '62433c2c58920f02c4950de0'
23
- }
24
- ]
25
- },
26
- type: 'template',
27
- header: 'Comment le protégé doit-il percevoir son mentor ?',
28
- explanation: 'Saisissez votre réponse (en anglais).'
29
- },
30
- klf: "Le mentoré voit dans son mentor un <i>role model</i>, c'est-à-dire un exemple inspirant qui lui permet de se projeter dans un poste à responsabilité.",
31
- tips: "L'origine de l'expression <i>role model</i> est attribué au sociologue Robert K. Merton.",
32
- universalRef: 'sli_VJKQonm2g',
33
- hasClue: true,
34
- id: 'sli_VJKQonm2g',
35
- parentContentTitle: {
36
- title: 'Using redux',
37
- type: 'chapter'
38
- }
39
- };
40
- export const textTemplateUISlide = {
41
- questionText: 'Comment le protégé doit-il percevoir son mentor ?',
42
- answerUI: {
43
- help: 'Saisissez votre réponse (en anglais).',
44
- model: {
45
- type: 'template',
46
- template: 'Un {{inp58402}} model.',
47
- answers: [
48
- {
49
- type: 'text',
50
- name: 'inp58402',
51
- placeholder: 'Type here',
52
- value: undefined,
53
- onChange: noop
54
- }
55
- ]
56
- }
57
- }
58
- };
@@ -1,4 +0,0 @@
1
- import { UISlide } from '../..';
2
- import { SlideFromAPI } from '../../../../types/common';
3
- export declare const selectTemplateSlide: SlideFromAPI;
4
- export declare const selectTemplateUISlide: Partial<UISlide>;
@@ -1,4 +0,0 @@
1
- import { UISlide } from '../..';
2
- import { SlideFromAPI } from '../../../../types/common';
3
- export declare const textTemplateSlide: SlideFromAPI;
4
- export declare const textTemplateUISlide: Partial<UISlide>;
@@ -1,58 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- export var textTemplateSlide = {
3
- question: {
4
- content: {
5
- media: {
6
- src: [],
7
- posters: [],
8
- subtitles: []
9
- },
10
- template: 'Un {{inp58402}} model.',
11
- choices: [
12
- {
13
- media: {
14
- src: [],
15
- posters: [],
16
- subtitles: []
17
- },
18
- items: [],
19
- _id: '62433c2c58920f02c4950de0',
20
- type: 'text',
21
- name: 'inp58402',
22
- id: '62433c2c58920f02c4950de0'
23
- }
24
- ]
25
- },
26
- type: 'template',
27
- header: 'Comment le protégé doit-il percevoir son mentor ?',
28
- explanation: 'Saisissez votre réponse (en anglais).'
29
- },
30
- klf: "Le mentoré voit dans son mentor un <i>role model</i>, c'est-à-dire un exemple inspirant qui lui permet de se projeter dans un poste à responsabilité.",
31
- tips: "L'origine de l'expression <i>role model</i> est attribué au sociologue Robert K. Merton.",
32
- universalRef: 'sli_VJKQonm2g',
33
- hasClue: true,
34
- id: 'sli_VJKQonm2g',
35
- parentContentTitle: {
36
- title: 'Using redux',
37
- type: 'chapter'
38
- }
39
- };
40
- export var textTemplateUISlide = {
41
- questionText: 'Comment le protégé doit-il percevoir son mentor ?',
42
- answerUI: {
43
- help: 'Saisissez votre réponse (en anglais).',
44
- model: {
45
- type: 'template',
46
- template: 'Un {{inp58402}} model.',
47
- answers: [
48
- {
49
- type: 'text',
50
- name: 'inp58402',
51
- placeholder: 'Type here',
52
- value: undefined,
53
- onChange: noop
54
- }
55
- ]
56
- }
57
- }
58
- };
@@ -1,62 +0,0 @@
1
- import noop from 'lodash/fp/noop';
2
- import {UISlide} from '../..';
3
- import {SlideFromAPI} from '../../../../types/common';
4
-
5
- export const textTemplateSlide: SlideFromAPI = {
6
- question: {
7
- content: {
8
- media: {
9
- src: [],
10
- posters: [],
11
- subtitles: []
12
- },
13
- template: 'Un {{inp58402}} model.',
14
- choices: [
15
- {
16
- media: {
17
- src: [],
18
- posters: [],
19
- subtitles: []
20
- },
21
- items: [],
22
- _id: '62433c2c58920f02c4950de0',
23
- type: 'text',
24
- name: 'inp58402',
25
- id: '62433c2c58920f02c4950de0'
26
- }
27
- ]
28
- },
29
- type: 'template',
30
- header: 'Comment le protégé doit-il percevoir son mentor ?',
31
- explanation: 'Saisissez votre réponse (en anglais).'
32
- },
33
- klf: "Le mentoré voit dans son mentor un <i>role model</i>, c'est-à-dire un exemple inspirant qui lui permet de se projeter dans un poste à responsabilité.",
34
- tips: "L'origine de l'expression <i>role model</i> est attribué au sociologue Robert K. Merton.",
35
- universalRef: 'sli_VJKQonm2g',
36
- hasClue: true,
37
- id: 'sli_VJKQonm2g',
38
- parentContentTitle: {
39
- title: 'Using redux',
40
- type: 'chapter'
41
- }
42
- };
43
-
44
- export const textTemplateUISlide: Partial<UISlide> = {
45
- questionText: 'Comment le protégé doit-il percevoir son mentor ?',
46
- answerUI: {
47
- help: 'Saisissez votre réponse (en anglais).',
48
- model: {
49
- type: 'template',
50
- template: 'Un {{inp58402}} model.',
51
- answers: [
52
- {
53
- type: 'text',
54
- name: 'inp58402',
55
- placeholder: 'Type here',
56
- value: undefined,
57
- onChange: noop
58
- }
59
- ]
60
- }
61
- }
62
- };