Skip to content

Commit b82bdd0

Browse files
feat(orga): create cover-rate-gauge component
Co-authored-by: Vincent Hardouin <[email protected]>
1 parent 4fa1b11 commit b82bdd0

File tree

6 files changed

+162
-0
lines changed

6 files changed

+162
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { guidFor } from '@ember/object/internals';
2+
import { htmlSafe } from '@ember/template';
3+
import Component from '@glimmer/component';
4+
import { t } from 'ember-intl';
5+
6+
const MAX_REACHABLE_LEVEL = 7;
7+
8+
export default class CoverRateGauge extends Component {
9+
get id() {
10+
return guidFor(this);
11+
}
12+
13+
get userLevel() {
14+
return this.formatNumber(this.args.userLevel);
15+
}
16+
17+
get tubeLevel() {
18+
return this.formatNumber(this.args.tubeLevel);
19+
}
20+
21+
formatNumber = (str) => {
22+
const num = Number(str);
23+
const oneDigitNum = num.toFixed(1);
24+
if (oneDigitNum.toString().endsWith('0')) {
25+
return Math.ceil(num);
26+
}
27+
return oneDigitNum;
28+
};
29+
30+
getGaugeSizeStyle = (level, { withExtraPercentage }) => {
31+
const gaugeSize = (level / MAX_REACHABLE_LEVEL) * 100;
32+
return htmlSafe(`width: calc(${gaugeSize}% + ${withExtraPercentage ? 5 : 0}%)`);
33+
};
34+
35+
<template>
36+
<div class="cover-rate-gauge">
37+
<div class="cover-rate-gauge__container">
38+
<div
39+
class="cover-rate-gauge__level cover-rate-gauge__level--tube-level"
40+
style={{this.getGaugeSizeStyle this.tubeLevel withExtraPercentage=true}}
41+
>
42+
{{this.tubeLevel}}
43+
</div>
44+
<div class="cover-rate-gauge__background">
45+
<label for={{this.id}} class="screen-reader-only">{{t
46+
"pages.statistics.gauge.label"
47+
userLevel=this.userLevel
48+
tubeLevel=this.tubeLevel
49+
}}</label>
50+
<progress
51+
class="cover-rate-gauge__progress"
52+
id={{this.id}}
53+
max={{this.tubeLevel}}
54+
value={{this.userLevel}}
55+
style={{this.getGaugeSizeStyle this.tubeLevel withExtraPercentage=false}}
56+
>
57+
{{this.userLevel}}
58+
</progress>
59+
</div>
60+
<div
61+
class="cover-rate-gauge__level cover-rate-gauge__level--user-level"
62+
style={{this.getGaugeSizeStyle this.userLevel withExtraPercentage=true}}
63+
>
64+
{{this.userLevel}}
65+
</div>
66+
</div>
67+
</div>
68+
</template>
69+
}

orga/app/styles/app.scss

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
@import 'components/sup-organization-participant/replace-students-modal';
5252
@import 'components/import-banner';
5353
@import 'components/import-information-banner';
54+
@import 'components/statistics/cover-rate-gauge';
5455

5556
// pages
5657
@import 'pages/login';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
.cover-rate-gauge {
2+
display: grid;
3+
align-items: center;
4+
justify-content: center;
5+
width: 100%;
6+
height: 3.5rem;
7+
}
8+
9+
.cover-rate-gauge__container {
10+
position: relative;
11+
width: 8.875rem;
12+
13+
--gauge-height: 0.875rem;
14+
15+
height: var(--gauge-height);
16+
color: var(--pix-neutral-500);
17+
font-weight: var(--pix-font-medium);
18+
}
19+
20+
.cover-rate-gauge__background {
21+
display: grid;
22+
align-items: center;
23+
height: var(--gauge-height);
24+
padding: 0 2px;
25+
line-height: 20px;
26+
background-color: rgba(var(--pix-neutral-900-inline), 0.1);
27+
border-radius: 3.125rem;
28+
29+
--level-text-spacing-from-gauge: -12px;
30+
31+
&:before {
32+
position: absolute;
33+
left: var(--level-text-spacing-from-gauge);
34+
content: '0';
35+
}
36+
37+
&:after {
38+
position: absolute;
39+
right: var(--level-text-spacing-from-gauge);
40+
content: '7';
41+
}
42+
}
43+
44+
.cover-rate-gauge__progress {
45+
width: 100%;
46+
height: 10px;
47+
color: var(--pix-primary-300);
48+
background-color: var(--pix-neutral-0);
49+
border: none;
50+
51+
--gauge-border-radius: 1.625rem;
52+
53+
border-radius: var(--gauge-border-radius);
54+
55+
&::-webkit-progress-value {
56+
background-color: var(--pix-primary-300);
57+
border-radius: var(--gauge-border-radius);
58+
}
59+
60+
&::-moz-progress-bar {
61+
background-color: var(--pix-primary-300);
62+
border-radius: var(--gauge-border-radius);
63+
}
64+
65+
&::-webkit-progress-bar {
66+
background-color: var(--pix-neutral-0);
67+
border-radius: var(--gauge-border-radius);
68+
}
69+
}
70+
71+
.cover-rate-gauge__level {
72+
position: absolute;
73+
text-align: right;
74+
75+
&--user-level {
76+
color: var(--pix-primary-500);
77+
}
78+
79+
&--tube-level {
80+
top: -20px;
81+
color: var(--pix-neutral-800);
82+
}
83+
}

orga/translations/en.json

+3
Original file line numberDiff line numberDiff line change
@@ -1462,6 +1462,9 @@
14621462
}
14631463
},
14641464
"statistics": {
1465+
"gauge": {
1466+
"label": "On the topic, your participants achieved a level of {userLevel} out of a maximum reachable level of {tubeLevel}."
1467+
},
14651468
"level": {
14661469
"advanced": "advanced",
14671470
"expert": "expert",

orga/translations/fr.json

+3
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,9 @@
14681468
}
14691469
},
14701470
"statistics": {
1471+
"gauge": {
1472+
"label": "Sur le sujet vos participants ont obtenu un niveau de {userLevel} sur un niveau maximum atteignable de {tubeLevel}."
1473+
},
14711474
"level": {
14721475
"advanced": "avancé",
14731476
"expert": "expert",

orga/translations/nl.json

+3
Original file line numberDiff line numberDiff line change
@@ -1462,6 +1462,9 @@
14621462
"title": "{count, plural, =0 {Studenten} =1 {Studenten ({count})} other {studenten ({count})}}"
14631463
},
14641464
"statistics": {
1465+
"gauge": {
1466+
"label": "Je deelnemers behaalden een {userLevel} op een maximaal haalbaar niveau van {tubeLevel}."
1467+
},
14651468
"level": {
14661469
"advanced": "geavanceerd",
14671470
"expert": "expert",

0 commit comments

Comments
 (0)