Skip to content

Commit 211a01c

Browse files
[FEATURE] Relier le composant transitoire à la page de fin de parcours et à la modal du tab "Formation"(PIX-17016)
#11827
2 parents 3ae9447 + c08f960 commit 211a01c

File tree

13 files changed

+251
-30
lines changed

13 files changed

+251
-30
lines changed

api/config/feature-toggles-config.js

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ export default {
55
defaultValue: false,
66
tags: ['frontend'],
77
},
8+
isModalSentResultEnabled: {
9+
description: 'Used to enable display of sent-results-modal',
10+
type: 'boolean',
11+
defaultValue: false,
12+
tags: ['frontend', 'team-devcomp'],
13+
},
814
isV3CertificationAttestationEnabled: {
915
description: 'Used to enable new certification attestation for V3',
1016
type: 'boolean',

api/db/seeds/data/team-devcomp/build-campaigns.js

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ async function _createScoCampaigns(databaseBuilder, trainingIds, participantCoun
1313
targetProfileId: PIX_EDU_SMALL_TARGET_PROFILE_ID,
1414
configCampaign: {
1515
participantCount,
16+
completionDistribution: { started: participantCount },
1617
profileDistribution: { beginner: 1, perfect: 1, blank: 1 },
1718
recommendedTrainingsIds: trainingIds,
1819
},

api/src/shared/config.js

+2
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,12 @@ const configuration = (function () {
522522
config.featureToggles.deprecatePoleEmploiPushNotification = false;
523523
config.featureToggles.isAlwaysOkValidateNextChallengeEndpointEnabled = false;
524524
config.featureToggles.isDirectMetricsEnabled = false;
525+
config.featureToggles.isModalSentResultEnabled = false;
525526
config.featureToggles.isNeedToAdjustCertificationAccessibilityEnabled = false;
526527
config.featureToggles.isOppsyDisabled = false;
527528
config.featureToggles.isPixAppNewLayoutEnabled = true;
528529
config.featureToggles.isPixCompanionEnabled = false;
530+
config.featureToggles.isPixAdminNewSidebarEnabled = false;
529531
config.featureToggles.isSelfAccountDeletionEnabled = false;
530532
config.featureToggles.isQuestEnabled = false;
531533
config.featureToggles.isAsyncQuestRewardingCalculationEnabled = false;

api/tests/shared/acceptance/application/feature-toggles/feature-toggle-controller_test.js

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ describe('Acceptance | Shared | Application | Controller | feature-toggle', func
2525
'is-always-ok-validate-next-challenge-endpoint-enabled': false,
2626
'is-async-quest-rewarding-calculation-enabled': false,
2727
'is-direct-metrics-enabled': false,
28+
'is-modal-sent-result-enabled': false,
2829
'is-need-to-adjust-certification-accessibility-enabled': false,
2930
'is-oppsy-disabled': false,
3031
'is-pix-app-new-layout-enabled': true,

mon-pix/app/components/campaigns/assessment/results/evaluation-results-tabs/index.gjs

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export default class EvaluationResultsTabs extends Component {
6666
@questResults={{@questResults}}
6767
@campaignParticipationResult={{@campaignParticipationResult}}
6868
@campaignId={{@campaign.id}}
69+
@onResultsShared={{@onResultsShared}}
6970
/>
7071
</Panel>
7172
{{/if}}

mon-pix/app/components/campaigns/assessment/results/evaluation-results-tabs/trainings.gjs

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export default class EvaluationResultsTabsTrainings extends Component {
3939

4040
const campaignParticipationResultToShare = this.args.campaignParticipationResult;
4141
await this.campaignParticipationResult.share(campaignParticipationResultToShare, this.args.questResults);
42+
this.args.onResultsShared();
4243

4344
campaignParticipationResultToShare.isShared = true;
4445
campaignParticipationResultToShare.canImprove = false;

mon-pix/app/components/campaigns/assessment/results/quit-results.gjs

+24-24
Original file line numberDiff line numberDiff line change
@@ -25,34 +25,34 @@ export default class QuitResults extends Component {
2525
<button class="evaluation-results-header__back-link" type="button" {{on "click" this.toggleModal}}>
2626
{{t "common.actions.quit"}}
2727
</button>
28-
<PixModal
29-
@title={{t "pages.evaluation-results.quit-results.modal.title"}}
30-
@onCloseButtonClick={{this.toggleModal}}
31-
@showModal={{this.showModal}}
32-
>
33-
<:content>
34-
<p class="quit-results__first-paragraph">{{t
35-
"pages.evaluation-results.quit-results.modal.content-information"
36-
}}</p>
37-
<p><strong>{{t "pages.evaluation-results.quit-results.modal.content-instruction"}}</strong></p>
38-
</:content>
39-
40-
<:footer>
41-
<div class="quit-results__footer">
42-
<PixButton @variant="secondary" @triggerAction={{this.toggleModal}}>
43-
{{t "pages.evaluation-results.quit-results.modal.actions.cancel-to-share"}}
44-
</PixButton>
45-
46-
<PixButtonLink @href="authenticated" @variant="primary">
47-
{{t "pages.evaluation-results.quit-results.modal.actions.quit-without-sharing"}}
48-
</PixButtonLink>
49-
</div>
50-
</:footer>
51-
</PixModal>
5228
{{else}}
5329
<LinkTo @route="authenticated" class="evaluation-results-header__back-link">
5430
{{t "common.actions.quit"}}
5531
</LinkTo>
5632
{{/if}}
33+
<PixModal
34+
@title={{t "pages.evaluation-results.quit-results.modal.title"}}
35+
@onCloseButtonClick={{this.toggleModal}}
36+
@showModal={{this.showModal}}
37+
>
38+
<:content>
39+
<p class="quit-results__first-paragraph">{{t
40+
"pages.evaluation-results.quit-results.modal.content-information"
41+
}}</p>
42+
<p><strong>{{t "pages.evaluation-results.quit-results.modal.content-instruction"}}</strong></p>
43+
</:content>
44+
45+
<:footer>
46+
<div class="quit-results__footer">
47+
<PixButton @variant="secondary" @triggerAction={{this.toggleModal}}>
48+
{{t "pages.evaluation-results.quit-results.modal.actions.cancel-to-share"}}
49+
</PixButton>
50+
51+
<PixButtonLink @href="authenticated" @variant="primary">
52+
{{t "pages.evaluation-results.quit-results.modal.actions.quit-without-sharing"}}
53+
</PixButtonLink>
54+
</div>
55+
</:footer>
56+
</PixModal>
5757
</template>
5858
}

mon-pix/app/components/routes/campaigns/assessment/evaluation-results.gjs

+31
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
import { action } from '@ember/object';
22
import { service } from '@ember/service';
33
import Component from '@glimmer/component';
4+
import { tracked } from '@glimmer/tracking';
45
import { t } from 'ember-intl';
56
import ENV from 'mon-pix/config/environment';
67

78
import EvaluationResultsHero from '../../../campaigns/assessment/results/evaluation-results-hero';
89
import EvaluationResultsTabs from '../../../campaigns/assessment/results/evaluation-results-tabs';
10+
import EvaluationSentResultsModal from '../../../campaigns/assessment/results/evaluation-sent-results-modal';
911
import QuitResults from '../../../campaigns/assessment/results/quit-results';
1012

1113
export default class EvaluationResults extends Component {
1214
@service tabManager;
15+
@service featureToggles;
16+
17+
@tracked showEvaluationResultsModal = false;
18+
19+
get isModalSentResultEnabled() {
20+
return this.featureToggles.featureToggles?.isModalSentResultEnabled;
21+
}
1322

1423
get hasTrainings() {
1524
return Boolean(this.args.model.trainings.length);
@@ -20,6 +29,10 @@ export default class EvaluationResults extends Component {
2029
return !isAutonomousCourse && !this.args.model.campaign.isForAbsoluteNovice;
2130
}
2231

32+
get trainingsForModal() {
33+
return this.args.model.trainings.slice(0, 2);
34+
}
35+
2336
@action
2437
showTrainings() {
2538
const tabElement = document.querySelector('[role="tablist"]');
@@ -33,6 +46,16 @@ export default class EvaluationResults extends Component {
3346
this.tabManager.setActiveTab(2);
3447
}
3548

49+
@action
50+
shareResults() {
51+
this.showEvaluationResultsModal = true;
52+
}
53+
54+
@action
55+
closeModal() {
56+
this.showEvaluationResultsModal = false;
57+
}
58+
3659
<template>
3760
<main role="main" class="evaluation-results">
3861
<header class="evaluation-results__header">
@@ -60,7 +83,15 @@ export default class EvaluationResults extends Component {
6083
@questResults={{@model.questResults}}
6184
@isSharableCampaign={{this.isSharableCampaign}}
6285
@trainings={{@model.trainings}}
86+
@onResultsShared={{this.shareResults}}
6387
/>
88+
{{#if this.isModalSentResultEnabled}}
89+
<EvaluationSentResultsModal
90+
@trainings={{this.trainingsForModal}}
91+
@showModal={{this.showEvaluationResultsModal}}
92+
@onCloseButtonClick={{this.closeModal}}
93+
/>
94+
{{/if}}
6495
</main>
6596
</template>
6697
}

mon-pix/app/models/feature-toggle.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export default class FeatureToggle extends Model {
66
@attr('boolean') isPixAppNewLayoutEnabled;
77
@attr('boolean') isPixCompanionEnabled;
88
@attr('boolean') isQuestEnabled;
9+
@attr('boolean') isModalSentResultEnabled;
910
}

mon-pix/app/styles/components/campaigns/assessment/results/evaluation-sent-results-modal.scss

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
left: 0;
1111
z-index: 1000;
1212
padding: 0;
13-
overflow-y: auto;
13+
overflow-y: hidden;
1414
text-align: center; // Used to center horizontally the inline-block modal content
1515
// we inline the pix-neutral-800 value
1616
background-color: rgb(37 56 88 / 50%);
@@ -39,7 +39,7 @@
3939
display: inline-block;
4040
width: 100%;
4141
height: 100%;
42-
padding: 6.25vw 5.75vw;
42+
padding: 48px 80px;
4343
overflow: hidden;
4444
color: var(--pix-neutral-900);
4545
text-align: center;

mon-pix/tests/integration/components/campaigns/assessment/results/evaluation-results-tabs-test.js

+24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { render } from '@1024pix/ember-testing-library';
2+
import { click } from '@ember/test-helpers';
23
import { hbs } from 'ember-cli-htmlbars';
34
import { t } from 'ember-intl/test-support';
45
import { module, test } from 'qunit';
6+
import sinon from 'sinon';
57

68
import setupIntlRenderingTest from '../../../../../helpers/setup-intl-rendering';
79

@@ -10,6 +12,7 @@ module('Integration | Components | Campaigns | Assessment | Results | Evaluation
1012

1113
module('when there are rewards and trainings', function (hooks) {
1214
let screen;
15+
let onResultsSharedStub;
1316

1417
hooks.beforeEach(async function () {
1518
// given
@@ -18,16 +21,22 @@ module('Integration | Components | Campaigns | Assessment | Results | Evaluation
1821
const acquiredBadge = store.createRecord('badge', { isAcquired: true });
1922
this.set('campaignParticipationResult', {
2023
campaignParticipationBadges: [acquiredBadge],
24+
isShared: false,
2125
});
2226

2327
const training = store.createRecord('training', { duration: { days: 2 } });
2428
this.set('trainings', [training]);
2529

30+
onResultsSharedStub = sinon.stub();
31+
this.set('onResultsShared', onResultsSharedStub);
32+
2633
// when
2734
screen = await render(
2835
hbs`<Campaigns::Assessment::Results::EvaluationResultsTabs
2936
@campaignParticipationResult={{this.campaignParticipationResult}}
3037
@trainings={{this.trainings}}
38+
@onResultsShared={{this.onResultsShared}}
39+
@isSharableCampaign={{true}}
3140
/>`,
3241
);
3342
});
@@ -45,6 +54,21 @@ module('Integration | Components | Campaigns | Assessment | Results | Evaluation
4554
// then
4655
assert.dom(screen.getByRole('heading', { name: t('pages.skill-review.tabs.rewards.title') })).isVisible();
4756
});
57+
58+
module('when clicking on shared results button', function () {
59+
test('it should call onResultsShared', async function (assert) {
60+
// given
61+
const campaignParticipationResultService = this.owner.lookup('service:campaign-participation-result');
62+
sinon.stub(campaignParticipationResultService, 'share');
63+
64+
// when
65+
await click(screen.queryByRole('tab', { name: 'Formations' }));
66+
await click(screen.queryByRole('button', { name: t('pages.skill-review.actions.send') }));
67+
68+
// then
69+
assert.true(onResultsSharedStub.calledOnce);
70+
});
71+
});
4872
});
4973

5074
module('when there are rewards but no trainings', function () {

mon-pix/tests/integration/components/campaigns/assessment/results/tabs/trainings-test.js

+14
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,15 @@ module('Integration | Components | Campaigns | Assessment | Evaluation Results T
9191

9292
module('when participation is not already shared', function (hooks) {
9393
let screen;
94+
let onResultsSharedStub;
9495

9596
hooks.beforeEach(async function () {
9697
// given
9798
this.set('isParticipationShared', false);
9899
this.set('campaignId', 1);
99100
this.set('campaignParticipationResultId', 1);
101+
onResultsSharedStub = sinon.stub();
102+
this.set('onResultsShared', onResultsSharedStub);
100103

101104
// when
102105
screen = await render(
@@ -105,6 +108,7 @@ module('Integration | Components | Campaigns | Assessment | Evaluation Results T
105108
@isParticipationShared={{this.isParticipationShared}}
106109
@campaignParticipationResultId={{this.campaignParticipationResultId}}
107110
@campaignId={{this.campaignId}}
111+
@onResultsShared={{this.onResultsShared}}
108112
/>`,
109113
);
110114
});
@@ -143,6 +147,16 @@ module('Integration | Components | Campaigns | Assessment | Evaluation Results T
143147
// then
144148
assert.true(campaignParticipationResultServiceStub.calledOnce);
145149
});
150+
test('it should call the onResultsShared function', async function (assert) {
151+
// given
152+
sinon.stub(campaignParticipationResultService, 'share');
153+
154+
// when
155+
await click(screen.queryByRole('button', { name: t('pages.skill-review.actions.send') }));
156+
157+
// then
158+
assert.true(onResultsSharedStub.calledOnce);
159+
});
146160

147161
module('when share action fails', function () {
148162
test('it should display an error message', async function (assert) {

0 commit comments

Comments
 (0)