Skip to content

Commit 44d9e5a

Browse files
committed
fix(ue): fix date parsing and update ue overview layout
1 parent 43034bf commit 44d9e5a

File tree

5 files changed

+148
-26
lines changed

5 files changed

+148
-26
lines changed

public/locales/fr/ues.json.ts

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ export default {
1111
'filter.semester.title': 'Semestre',
1212
'filter.semester.autumn': 'Automne',
1313
'filter.semester.spring': 'Printemps',
14+
'overview.credits': 'Crédits',
15+
'overview.minors': 'Mineures',
16+
'overview.taughtIn': 'Enseigné en',
17+
'overview.requirements': 'prérequis',
1418
'detailed.inscriptionCode': "Code d'inscription",
1519
'detailed.inscriptionCode.copy': 'Copier dans le presse-papier',
1620
'detailed.worktime.hour': 'h',

src/api/api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export class ResponseHandler<T, R = undefined> {
103103
* @param rawResponse The raw response from the API.
104104
*/
105105
function formatResponse<T>(rawResponse: RawResponseType<T>): T {
106-
if (typeof rawResponse === 'string' && !isNaN(Date.parse(rawResponse))) {
106+
if (typeof rawResponse === 'string' && rawResponse.search(/^\d{4}(?:-\d{2}){2}T(?:\d{2}:){2}\d{2}\.\d{3}Z$/) === 0) {
107107
return new Date(rawResponse) as T;
108108
} else if (Array.isArray(rawResponse)) {
109109
return rawResponse.map(formatResponse) as T;

src/api/ue/ue.interface.ts

+51-23
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
11
export interface UE {
22
code: string;
3-
inscriptionCode: string;
43
name: string;
54
info: {
65
requirements: Array<string>;
7-
comment: string;
8-
degree: string;
9-
languages: string;
10-
minors: string;
11-
objectives: string;
12-
program: string;
6+
languages: Array<string>;
7+
minors: Array<string>;
138
};
149
credits: Array<{
1510
credits: number;
1611
category: {
1712
code: string;
1813
name: string;
1914
};
20-
}>;
21-
branchOption: Array<{
22-
code: string;
23-
name: string;
24-
branch: {
15+
branchOption: Array<{
2516
code: string;
2617
name: string;
27-
};
18+
branch: {
19+
code: string;
20+
name: string;
21+
};
22+
}>;
2823
}>;
2924
openSemester: Array<{
3025
code: string;
@@ -33,16 +28,49 @@ export interface UE {
3328
}>;
3429
}
3530

36-
export interface DetailedUE extends UE {
37-
validationRate: number;
38-
workTime: {
39-
cm: number;
40-
td: number;
41-
tp: number;
42-
the: number;
43-
project: number;
44-
internship: number;
45-
};
31+
export interface DetailedUE {
32+
code: string;
33+
creationYear: number;
34+
updateYear: number;
35+
ueofs: Array<{
36+
name: string;
37+
code: string;
38+
credits: Array<{
39+
credits: number;
40+
category: {
41+
code: string;
42+
name: string;
43+
};
44+
branchOption: Array<{
45+
code: string;
46+
name: string;
47+
branch: {
48+
code: string;
49+
name: string;
50+
};
51+
}>;
52+
}>;
53+
info: {
54+
objectives: string;
55+
program: string;
56+
language: string;
57+
minors: Array<string>;
58+
requirements: Array<string>;
59+
};
60+
openSemester: Array<{
61+
code: string;
62+
start: Date;
63+
end: Date;
64+
}>;
65+
workTime: {
66+
cm: number;
67+
td: number;
68+
tp: number;
69+
the: number;
70+
project: boolean;
71+
internship: number;
72+
};
73+
}>;
4674
starVotes: {
4775
[criterionId: string]: number;
4876
};

src/app/ues/page.tsx

+48-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Branch } from '@/api/branch/branch.interface';
1212
import { useBranches, useCreditCategories } from '@/module/constantData';
1313
import { useMemo } from 'react';
1414
import { CreditCategory } from '@/api/credit/credit.interface';
15+
import Tooltip from '@/components/UI/Tooltip';
1516

1617
/**
1718
* The different filters that exist.
@@ -97,8 +98,53 @@ export default function Page() {
9798
baseRedirectUrl={'/ues'}
9899
onEndReached={fetchNextItems}
99100
itemFactory={({ item }) => (
100-
<div className={!item ? styles.glimmer : ''}>
101-
<h2>{item?.code}</h2>
101+
<div className={!item ? styles.glimmer : styles.container}>
102+
<div className={styles.headerLayout}>
103+
<h2>{item?.code}</h2>
104+
<div className={styles.metaContainer}>
105+
<div className={styles.sideData}>
106+
<div className={styles.credits}>
107+
<span className={styles.label}>{t('ues:overview.credits')}</span>
108+
{item?.credits
109+
?.sort((a, b) => a.category.name > b.category.name)
110+
.map((credit) => (
111+
<div key={credit.category.code}>
112+
{credit.credits}
113+
<span className={styles.categoryLabel}>
114+
<Tooltip content={credit.category.name}>{credit.category.code}</Tooltip>
115+
</span>
116+
</div>
117+
))}
118+
</div>
119+
<div className={styles.languages}>
120+
<span className={[styles.taughtIn, styles.label].join(' ')}>{t('ues:overview.taughtIn')}</span>
121+
{item?.info.languages.map((language) => <span key={language}>{language}</span>)}
122+
</div>
123+
</div>
124+
<div className={styles.sideData}>
125+
{item?.info.minors.length ? (
126+
<div className={styles.minors}>
127+
<span className={[styles.label, styles.categoryLabel].join(' ')}>
128+
{t('ues:overview.minors')}
129+
</span>
130+
{item?.info.minors.map((minor) => <span key={minor}>{minor}</span>)}
131+
</div>
132+
) : (
133+
''
134+
)}
135+
{item?.info?.requirements?.length ? (
136+
<div className={[styles.requirements, styles.categoryLabel].join(' ')}>
137+
<Tooltip content={item?.info?.requirements?.join(', ')}>
138+
{item?.info?.requirements?.length}{' '}
139+
<span className={styles.label}>{t('ues:overview.requirements')}</span>
140+
</Tooltip>
141+
</div>
142+
) : (
143+
''
144+
)}
145+
</div>
146+
</div>
147+
</div>
102148
<p>{item?.name}</p>
103149
</div>
104150
)}

src/app/ues/style.module.scss

+44
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,50 @@
2525
flex-grow: 1;
2626
height: 100%;
2727

28+
.container {
29+
width: 100%;
30+
}
31+
32+
.headerLayout {
33+
width: 100%;
34+
display: flex;
35+
flex-flow: row wrap;
36+
justify-content: space-between;
37+
38+
.metaContainer {
39+
display: flex;
40+
flex-flow: column wrap;
41+
42+
.sideData {
43+
width: 100%;
44+
display: flex;
45+
gap: 1ch;
46+
flex-flow: row wrap;
47+
justify-content: end;
48+
}
49+
50+
.label {
51+
text-transform: uppercase;
52+
font-size: 0.8em;
53+
color: $ung-light-grey;
54+
}
55+
56+
.credits,
57+
.languages,
58+
.minors,
59+
.requirements {
60+
display: flex;
61+
flex-flow: row wrap;
62+
gap: 0.5ch;
63+
align-items: baseline;
64+
65+
.categoryLabel {
66+
margin-left: 0.2ch;
67+
}
68+
}
69+
}
70+
}
71+
2872
.glimmer {
2973
p,
3074
h2 {

0 commit comments

Comments
 (0)