project-booster-vue 9.2.0 → 9.2.3

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 (27) hide show
  1. package/package.json +15 -15
  2. package/src/components/configurations/list/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-components-configurations-pb-configurations-list-/360/237/247/254-component-showcase-1-snap.png +0 -0
  3. package/src/components/media/upload/PbMediaUpload.vue +3 -0
  4. package/src/components/projects/project-hub/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-components-projects-pb-project-hub-/360/237/246/240-features-documents-media-showcase-with-media-documents-1-snap.png +0 -0
  5. package/src/components/projects/project-hub/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-components-projects-pb-project-hub-/360/237/246/240-features-project-attributes-showcase-empty-state-1-snap.png +0 -0
  6. package/src/components/question/PbQuestion.vue +19 -7
  7. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-demo-multiple-multiple-1-snap.png +0 -0
  8. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-demo-simple-simple-1-snap.png +0 -0
  9. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-answers-multiple-skippable-multiselect-question-1-snap.png +0 -0
  10. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-101-101-1-snap.png +0 -0
  11. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-custom-back-button-hide-back-button-1-snap.png +0 -0
  12. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-decorator-stripes-decorator-stripe-1-snap.png +0 -0
  13. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-show-more-show-more-1-snap.png +0 -0
  14. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-skippable-mutiple-skippable-1-snap.png +0 -0
  15. package/src/components/question/__snapshots__/storyshots-puppeteer-test-puppeteer-ts-image-storyshots-project-booster-scenario-questions-pb-question-/360/237/246/240-features-question-skippable-skippable-1-snap.png +0 -0
  16. package/src/components/question/upload-document/PbUploadDocument-Features-ShowMore.stories.json +8 -3
  17. package/src/components/question/upload-document/PbUploadDocument-Features-StartOpen.stories.json +8 -3
  18. package/src/components/question/upload-document/PbUploadDocument.vue +0 -3
  19. package/src/components/question/upload-document/default-payload.json +8 -3
  20. package/src/components/question/upload-document/pictures-payload.json +6 -3
  21. package/src/components/scenario/PbScenario.vue +9 -17
  22. package/src/components/scenario/scenarii/appointment-qualification-kitchen.json +13 -5
  23. package/src/components/tasks/contentul-preview/ContenfulPlanner.ts +1 -1
  24. package/src/components/tasks/details/PbTaskDetails.vue +2 -2
  25. package/src/services/api/appointmentQualificationsApi.ts +1 -5
  26. package/src/services/scenarioConditionals.ts +1 -1
  27. package/src/types/pb/Scenario.ts +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-booster-vue",
3
- "version": "9.2.0",
3
+ "version": "9.2.3",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -81,21 +81,21 @@
81
81
  "@mswjs/interceptors": "0.12.7",
82
82
  "@semantic-release/changelog": "5.0.1",
83
83
  "@semantic-release/git": "9.0.0",
84
- "@storybook/addon-a11y": "6.4.20",
85
- "@storybook/addon-essentials": "6.4.20",
84
+ "@storybook/addon-a11y": "6.4.21",
85
+ "@storybook/addon-essentials": "6.4.21",
86
86
  "@storybook/addon-knobs": "6.3.1",
87
- "@storybook/addon-links": "6.4.20",
87
+ "@storybook/addon-links": "6.4.21",
88
88
  "@storybook/addon-postcss": "2.0.0",
89
- "@storybook/addon-storyshots": "6.4.20",
90
- "@storybook/addon-storyshots-puppeteer": "6.4.20",
91
- "@storybook/addon-storysource": "6.4.20",
92
- "@storybook/addons": "6.4.20",
93
- "@storybook/builder-webpack5": "6.4.20",
94
- "@storybook/manager-webpack5": "6.4.20",
95
- "@storybook/source-loader": "6.4.20",
89
+ "@storybook/addon-storyshots": "6.4.21",
90
+ "@storybook/addon-storyshots-puppeteer": "6.4.21",
91
+ "@storybook/addon-storysource": "6.4.21",
92
+ "@storybook/addons": "6.4.21",
93
+ "@storybook/builder-webpack5": "6.4.21",
94
+ "@storybook/manager-webpack5": "6.4.21",
95
+ "@storybook/source-loader": "6.4.21",
96
96
  "@storybook/storybook-deployer": "2.8.11",
97
- "@storybook/theming": "6.4.20",
98
- "@storybook/vue3": "6.4.20",
97
+ "@storybook/theming": "6.4.21",
98
+ "@storybook/vue3": "6.4.21",
99
99
  "@testing-library/jest-dom": "5.16.2",
100
100
  "@testing-library/vue": "6.5.1",
101
101
  "@types/axios": "0.14.0",
@@ -147,13 +147,13 @@
147
147
  "eslint-plugin-import": "2.25.4",
148
148
  "eslint-plugin-mdx": "1.16.0",
149
149
  "eslint-plugin-prettier": "4.0.0",
150
- "eslint-plugin-storybook": "0.5.7",
150
+ "eslint-plugin-storybook": "0.5.8",
151
151
  "eslint-plugin-vue": "7.11.1",
152
152
  "fluent-json-schema": "3.0.1",
153
153
  "husky": "6.0.0",
154
154
  "jest": "26.6.3",
155
155
  "msw": "0.39.1",
156
- "msw-storybook-addon": "1.6.1",
156
+ "msw-storybook-addon": "1.6.3",
157
157
  "mutationobserver-shim": "0.3.7",
158
158
  "postcss": "8.3.11",
159
159
  "postcss-loader": "4.2.0",
@@ -407,6 +407,9 @@ export default defineComponent({
407
407
 
408
408
  async upload() {
409
409
  if (!this.disabled && !this.isMediaUploaded) {
410
+ if (this.selectedType === null) {
411
+ this.selectedType = this.payload.viewModel.dialog.defaultMediaType;
412
+ }
410
413
  await this.$store.dispatch(this.storePrefix + 'uploadFile', {
411
414
  formData: this.formData,
412
415
  fileName: this.fileName,
@@ -16,9 +16,11 @@
16
16
  {{ payload.viewModel.hero }}
17
17
  </div>
18
18
  <div class="pb-question__title-container">
19
- <div v-if="payload.viewModel.label" class="pb-question__title">
20
- {{ decorate(payload.viewModel.label, payload.defaultDecoratorValue) }}
21
- </div>
19
+ <div
20
+ v-if="payload.viewModel.label"
21
+ class="pb-question__title"
22
+ v-html="decorate(payload.viewModel.label, payload.defaultDecoratorValue)"
23
+ />
22
24
  <div v-if="payload.viewModel.subtitle" class="pb-question__subtitle">
23
25
  {{ decorate(payload.viewModel.subtitle, payload.defaultDecoratorValue) }}
24
26
  <m-link
@@ -329,7 +331,7 @@ export default defineComponent({
329
331
  */
330
332
  answers: {
331
333
  type: Object as PropType<Map<string, ScenarioStepAnswer[]>>,
332
- default: () => ({}),
334
+ default: () => new Map<string, ScenarioStepAnswer[]>(),
333
335
  },
334
336
  /**
335
337
  * Name for the current step in the scenario
@@ -431,8 +433,13 @@ export default defineComponent({
431
433
  if (
432
434
  questionPossibleAnswer &&
433
435
  (questionPossibleAnswer?.selected ||
434
- answerValues.findIndex((answer: ScenarioStepAnswer) => answer?.code === answerCode && answer?.selected) >=
435
- 0) &&
436
+ answerValues.findIndex(
437
+ (answer: ScenarioStepAnswer | string) =>
438
+ (typeof answer === 'string' && answer === answerCode) ||
439
+ (typeof answer === 'object' &&
440
+ (<ScenarioStepAnswer>answer)?.code === answerCode &&
441
+ (<ScenarioStepAnswer>answer)?.selected),
442
+ ) >= 0) &&
436
443
  areConditionsValid(questionPossibleAnswer.conditions!, this.answers, this.runtimeOptions)
437
444
  ) {
438
445
  this.selectedAnswers.set(answerCode, true);
@@ -452,7 +459,12 @@ export default defineComponent({
452
459
  decorate(valueToDecorate: string, defaultValue = '') {
453
460
  if (valueToDecorate) {
454
461
  valueToDecorate = `\`${valueToDecorate}\``;
455
- return this.doEval(valueToDecorate, defaultValue);
462
+ try {
463
+ return this.doEval(valueToDecorate, defaultValue);
464
+ } catch (e) {
465
+ console.error(e);
466
+ return valueToDecorate;
467
+ }
456
468
  }
457
469
  return valueToDecorate;
458
470
  },
@@ -9,8 +9,7 @@
9
9
  "startOpened": false,
10
10
  "mediaPayload": {
11
11
  "viewModel": {
12
- "type": "documents",
13
- "subType": "PLAN",
12
+ "type": "documentsPlans",
14
13
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic, image/heif-sequence, image/heic-sequence, application/pdf",
15
14
  "dialog": {
16
15
  "hideCross": false,
@@ -25,14 +24,20 @@
25
24
  "acceptedMediaTypesErrorLabel": "Seuls les formats JPG et PNG, et PDF sont acceptés",
26
25
  "mediaTypes": [
27
26
  {
27
+ "type": "PLAN",
28
+ "subtype": "HAND_DRAWN_PLAN",
28
29
  "code": "HAND_DRAWN_PLAN",
29
- "label": "Un plan fait moi même"
30
+ "label": "Un plan fait moi-même"
30
31
  },
31
32
  {
33
+ "type": "PLAN",
34
+ "subtype": "ARCHITECT_PLAN",
32
35
  "code": "ARCHITECT_PLAN",
33
36
  "label": "Un plan d’architecte"
34
37
  },
35
38
  {
39
+ "type": "PLAN",
40
+ "subtype": "KITCHEN_DESIGNER_PLAN",
36
41
  "code": "KITCHEN_DESIGNER_PLAN",
37
42
  "label": "Un plan d’un autre cuisiniste"
38
43
  }
@@ -5,8 +5,7 @@
5
5
  "startOpened": true,
6
6
  "mediaPayload": {
7
7
  "viewModel": {
8
- "type": "documents",
9
- "subType": "PLAN",
8
+ "type": "documentsPlans",
10
9
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic, image/heif-sequence, image/heic-sequence, application/pdf",
11
10
  "dialog": {
12
11
  "hideCross": false,
@@ -22,14 +21,20 @@
22
21
  "acceptedMediaTypesErrorLabel": "Seuls les formats JPG et PNG, et PDF sont acceptés",
23
22
  "mediaTypes": [
24
23
  {
24
+ "type": "PLAN",
25
+ "subtype": "HAND_DRAWN_PLAN",
25
26
  "code": "HAND_DRAWN_PLAN",
26
- "label": "Un plan fait moi même"
27
+ "label": "Un plan fait moi-même"
27
28
  },
28
29
  {
30
+ "type": "PLAN",
31
+ "subtype": "ARCHITECT_PLAN",
29
32
  "code": "ARCHITECT_PLAN",
30
33
  "label": "Un plan d’architecte"
31
34
  },
32
35
  {
36
+ "type": "PLAN",
37
+ "subtype": "KITCHEN_DESIGNER_PLAN",
33
38
  "code": "KITCHEN_DESIGNER_PLAN",
34
39
  "label": "Un plan d’un autre cuisiniste"
35
40
  }
@@ -238,9 +238,6 @@ export default defineComponent({
238
238
  setup(props, { emit }) {
239
239
  const store = useStore();
240
240
  let storeModuleName = ref(props.payload.viewModel.mediaPayload.viewModel.type);
241
- if (props.payload.viewModel.mediaPayload.viewModel.subType) {
242
- storeModuleName.value += props.payload.viewModel.mediaPayload.viewModel.subType === 'PLAN' ? 'Plans' : 'Pictures';
243
- }
244
241
 
245
242
  const pbMediaUpload = ref<ComponentCustomProperties>();
246
243
 
@@ -5,8 +5,7 @@
5
5
  "startOpened": false,
6
6
  "mediaPayload": {
7
7
  "viewModel": {
8
- "type": "documents",
9
- "subType": "PLAN",
8
+ "type": "documentsPlan",
10
9
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic, image/heif-sequence, image/heic-sequence, application/pdf",
11
10
  "dialog": {
12
11
  "hideCross": false,
@@ -21,14 +20,20 @@
21
20
  "acceptedMediaTypesErrorLabel": "Seuls les formats JPG et PNG, et PDF sont acceptés",
22
21
  "mediaTypes": [
23
22
  {
23
+ "type": "PLAN",
24
+ "subtype": "HAND_DRAWN_PLAN",
24
25
  "code": "HAND_DRAWN_PLAN",
25
- "label": "Un plan fait moi même"
26
+ "label": "Un plan fait moi-même"
26
27
  },
27
28
  {
29
+ "type": "PLAN",
30
+ "subtype": "ARCHITECT_PLAN",
28
31
  "code": "ARCHITECT_PLAN",
29
32
  "label": "Un plan d’architecte"
30
33
  },
31
34
  {
35
+ "type": "PLAN",
36
+ "subtype": "KITCHEN_DESIGNER_PLAN",
32
37
  "code": "KITCHEN_DESIGNER_PLAN",
33
38
  "label": "Un plan d’un autre cuisiniste"
34
39
  }
@@ -6,8 +6,7 @@
6
6
  "addText": " ",
7
7
  "mediaPayload": {
8
8
  "viewModel": {
9
- "type": "documents",
10
- "subType": "PHOTO",
9
+ "type": "documentsPictures",
11
10
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic, image/heif-sequence, image/heic-sequence",
12
11
  "dialog": {
13
12
  "hideCross": false,
@@ -18,7 +17,11 @@
18
17
  "chooseAnotherMediaLabel": "Choisir une autre photo",
19
18
  "uploadProgressTitle": "Chargement de votre photo",
20
19
  "errorUploadTitle": "Une erreur est survenue lors de l'envoi de votre photo ",
21
- "uploadPreviewTitle": "Nom de la photo"
20
+ "uploadPreviewTitle": "Nom de la photo",
21
+ "defaultMediaType": {
22
+ "type": "PHOTO",
23
+ "subtype": "ROOM_PHOTO"
24
+ }
22
25
  }
23
26
  }
24
27
  }
@@ -368,12 +368,12 @@ export default defineComponent({
368
368
 
369
369
  state.value.stepsToResume = requestedStep.stepsToResume!;
370
370
 
371
- state.value.currentStep = requestedStep?.step;
371
+ state.value.currentStep = scenarios.get(requestedStep?.step.code)!;
372
372
 
373
373
  animateDisplayedStep(stepIndex < state.value.history.stepIndex);
374
374
  state.value.history.stepIndex = stepIndex;
375
375
 
376
- if (state.value.currentStep.code === '__END__') {
376
+ if (state.value?.currentStep?.code && state.value.currentStep.code === '__END__') {
377
377
  /**
378
378
  * Emitted when the scenario is completed
379
379
  * @event scenario-completed
@@ -381,7 +381,7 @@ export default defineComponent({
381
381
  emit('scenario-completed', state.value.answers);
382
382
  emitEventToPipeline('SCENARIO-COMPLETED', state.value.currentStep);
383
383
  } else {
384
- emitEventToPipeline('STEP-STARTED', state.value.currentStep);
384
+ emitEventToPipeline('STEP-STARTED', state.value?.currentStep);
385
385
  }
386
386
  } else {
387
387
  console.warn(`Scenario step ${stepIndex} was requested but is not in the history`);
@@ -593,8 +593,8 @@ export default defineComponent({
593
593
  state.value.history.steps = [];
594
594
 
595
595
  state.value.stepsToResume = [];
596
- state.value.currentStep = null;
597
- state.value.displayedStep = null;
596
+ state.value.currentStep = undefined;
597
+ state.value.displayedStep = undefined;
598
598
  reverseAnimation.value = false;
599
599
 
600
600
  initScenario('__START__');
@@ -606,6 +606,9 @@ export default defineComponent({
606
606
  (newValue) => {
607
607
  if (newValue && scenarios) {
608
608
  state.value = newValue;
609
+ if (state.value.answers && !(state.value.answers instanceof Map)) {
610
+ state.value.answers = new Map<string, ScenarioStepAnswer[]>(Object.entries(state.value.answers));
611
+ }
609
612
  goToStep(state.value.history.stepIndex);
610
613
  }
611
614
  },
@@ -617,20 +620,9 @@ export default defineComponent({
617
620
  },
618
621
  );
619
622
 
623
+ initScenario('__START__');
620
624
  onMounted(() => {
621
625
  document.getElementsByTagName('body')[0].style.setProperty('overflow-x', 'hidden');
622
- if (scenarios && !props.previousState) {
623
- initScenario('__START__');
624
- } else {
625
- if (props.previousState.refreshSteps) {
626
- state.value.answers = props.previousState.answers;
627
- initScenario('__START__');
628
- } else {
629
- state.value = props.previousState;
630
- const steps = props.previousState?.history?.steps ?? [];
631
- state.value.stepsToResume = steps[props.previousState.history.stepIndex - 1]?.stepsToResume ?? [];
632
- }
633
- }
634
626
  });
635
627
 
636
628
  return {
@@ -558,8 +558,7 @@
558
558
  },
559
559
  "mediaPayload": {
560
560
  "viewModel": {
561
- "type": "documents",
562
- "subType": "PLAN",
561
+ "type": "documentsPictures",
563
562
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic, application/pdf",
564
563
  "dialog": {
565
564
  "hideCross": false,
@@ -573,14 +572,20 @@
573
572
  "mediaTypeTitle": "De quel type de plan s’agit il ?",
574
573
  "mediaTypes": [
575
574
  {
575
+ "type": "PLAN",
576
+ "subtype": "HAND_DRAWN_PLAN",
576
577
  "code": "HAND_DRAWN_PLAN",
577
578
  "label": "Un plan fait moi-même"
578
579
  },
579
580
  {
581
+ "type": "PLAN",
582
+ "subtype": "ARCHITECT_PLAN",
580
583
  "code": "ARCHITECT_PLAN",
581
584
  "label": "Un plan d’architecte"
582
585
  },
583
586
  {
587
+ "type": "PLAN",
588
+ "subtype": "KITCHEN_DESIGNER_PLAN",
584
589
  "code": "KITCHEN_DESIGNER_PLAN",
585
590
  "label": "Un plan d’un autre cuisiniste"
586
591
  }
@@ -707,8 +712,7 @@
707
712
  },
708
713
  "mediaPayload": {
709
714
  "viewModel": {
710
- "type": "documents",
711
- "subType": "PHOTO",
715
+ "type": "documentsPictures",
712
716
  "acceptedFileTypes": "image/jpeg, image/png, image/heif, image/heic",
713
717
  "dialog": {
714
718
  "hideCross": false,
@@ -718,7 +722,11 @@
718
722
  "chooseAnotherMediaLabel": "Choisir une autre photo",
719
723
  "uploadProgressTitle": "Chargement de votre photo",
720
724
  "errorUploadTitle": "Une erreur est survenue lors de l'envoi de votre photo",
721
- "uploadPreviewTitle": "Nom de la photo "
725
+ "uploadPreviewTitle": "Nom de la photo",
726
+ "defaultMediaType": {
727
+ "type": "PHOTO",
728
+ "subtype": "ROOM_PHOTO"
729
+ }
722
730
  }
723
731
  }
724
732
  }
@@ -237,7 +237,7 @@ export const contentfulPlanner = (
237
237
  throw new Error(`No sections found for ${PROJECT_PLANNER_SKELETON_CONTENT_TYPE}`);
238
238
  }
239
239
 
240
- for (const [index, section] of plannerSections?.entries()) {
240
+ for (const [index, section] of plannerSections.entries()) {
241
241
  sections[section.sys.id] = {
242
242
  title: section.fields.title!,
243
243
  position: index,
@@ -318,7 +318,7 @@ export default defineComponent({
318
318
  if (tempTask.value?.viewModel?.sections) {
319
319
  for (const section of tempTask.value.viewModel.sections) {
320
320
  if (section?.options) {
321
- for (const option of section?.options) {
321
+ for (const option of section.options) {
322
322
  if (
323
323
  !isEqual(tempOptionValues.value[decorateValue(option.id)], decorateValue(option.value!)) ||
324
324
  (tempOptionValues.value[decorateValue(option.id)] && !option.value)
@@ -351,7 +351,7 @@ export default defineComponent({
351
351
  if (tempTask.value?.viewModel?.sections) {
352
352
  for (const section of tempTask.value.viewModel.sections) {
353
353
  if (section?.options) {
354
- for (const option of section?.options) {
354
+ for (const option of section.options) {
355
355
  const newValue = tempOptionValues.value[decorateValue(option.id)];
356
356
  const sanitizedNewValue = newValue !== undefined ? newValue : undefined ?? '';
357
357
  const optionValues = tempTask.value?.optionValues ?? {};
@@ -30,11 +30,7 @@ const getAppointmentQualification = async (
30
30
  : `/appointment-qualifications?range=${start}-${end}&groupId=${groupId}&appointmentId=${appointmentId}`;
31
31
  const response = await clientApi.get(url);
32
32
 
33
- return JSON.parse(
34
- JSON.stringify(response.data).replace(/:"([^"]+)"/g, (match, $1) => {
35
- return `: "${he.escape($1)}"`;
36
- }),
37
- );
33
+ return response.data;
38
34
  };
39
35
 
40
36
  const saveAnswersByAppointmentQualificationId = async (appointmentQualificationId: string, data: any) => {
@@ -7,7 +7,7 @@ const Condition = (
7
7
  ) => {
8
8
  const isAnswerMatching = (questionCode: string, answerCode: string) => {
9
9
  const questionAnswers = answers.get(questionCode)!;
10
- return questionAnswers[0]?.code === answerCode;
10
+ return questionAnswers ? questionAnswers[0]?.code === answerCode : false;
11
11
  };
12
12
  const isAnswerContaining = (questionCode: string, answerCode: string) => {
13
13
  const questionAnswers = answers.get(questionCode)!;
@@ -144,8 +144,8 @@ export interface ScenarioHistory {
144
144
  export interface ScenarioState {
145
145
  answers: Map<string, ScenarioStepAnswer[]>;
146
146
  stepsToResume: ScenarioStep[];
147
- currentStep: ScenarioStep | null;
148
- displayedStep: ScenarioStep | null;
147
+ currentStep: ScenarioStep | undefined;
148
+ displayedStep: ScenarioStep | undefined;
149
149
  history: ScenarioHistory;
150
150
  refreshSteps: boolean;
151
151
  }