Skip to content

Commit 7986665

Browse files
authored
Merge branch 'develop' into fix/whitescreen-question
2 parents 71c0357 + a6e8a6c commit 7986665

24 files changed

Lines changed: 682 additions & 224 deletions

back-end/src/base/articles/articles.controller.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,20 @@ export class ArticlesController {
120120
return res.status(201).json(article);
121121
}
122122

123+
// add document
124+
@Put('/document/:id')
125+
async addDocument(@Req() req: Request, @Res() res: Response) {
126+
const article = await this.articlesService.addDocument(req.params.id, req.body);
127+
return res.status(201).json(article);
128+
}
129+
130+
// remove document
131+
@Put('/removeDocument/:id')
132+
async removeDocument(@Req() req: Request, @Res() res: Response) {
133+
const article = await this.articlesService.removeDocument(req.params.id, req.body);
134+
return res.status(201).json(article);
135+
}
136+
123137
// delete article
124138
@Delete('/delete/:id')
125139
async deleteArticle(@Req() req: Request, @Res() res: Response) {

back-end/src/base/articles/articles.service.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,22 @@ export class ArticlesService {
210210
return await this.articlesRepository.updateOneArticle({ _id: new ObjectId(id) }, update);
211211
}
212212

213+
// add document
214+
async addDocument(id, queryDocument) {
215+
queryDocument._id = new ObjectId();
216+
const update = { $push: { documents: queryDocument } };
217+
218+
return await this.articlesRepository.updateOneArticle({ _id: new ObjectId(id) }, update);
219+
}
220+
221+
// remove document
222+
async removeDocument(id, queryDocument) {
223+
queryDocument._id = new ObjectId(queryDocument._id);
224+
const update = { $pull: { documents: queryDocument } };
225+
226+
return await this.articlesRepository.updateOneArticle({ _id: new ObjectId(id) }, update);
227+
}
228+
213229
// delete article
214230
async deleteArticle(id) {
215231
return await this.articlesRepository.deleteOneArticle(id);

back-end/src/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { config } from 'src/config/config';
77

88
import { AppModule } from 'src/app.module';
99
import { corsOptionsDelegate } from 'src/config/cors';
10+
import * as bodyParser from 'body-parser';
1011

1112
//! Proxy settings, production only
1213
// <NestExpressApplication>
@@ -27,7 +28,7 @@ async function bootstrap() {
2728
);
2829

2930
app.use(cookieParser());
30-
31+
app.use(bodyParser.json({ limit: '50mb' }));
3132
app.enableCors(corsOptionsDelegate);
3233
//! versioning, production only
3334
// app.enableVersioning({

front-end/src/components/RessourcesComponents/AddCourse.vue

Lines changed: 115 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,34 @@
77
</h3>
88
<div class="modal-body">
99
<form class="w-full max-w-sm">
10-
<input type="text" name="title" v-model="this.tag" placeholder="Title :" /><br />
11-
<input type="datetime-local" class="text-field" v-model="this.periodStart" /><br />
12-
<input type="datetime-local" class="text-field" v-model="this.periodEnd" /><br />
13-
<input type="url" placeholder="picture link" v-model="this.picture" /><br />
10+
<input type="text" name="title" v-model="tag" placeholder="Title :" /><br />
11+
<VueDatePicker
12+
placeholder="debut"
13+
v-model="periodStart"
14+
:format="dateFormat"
15+
:language="datePickerLanguage"
16+
/>
17+
<VueDatePicker
18+
placeholder="fin"
19+
v-model="periodEnd"
20+
:format="dateFormat"
21+
:language="datePickerLanguage"
22+
/>
23+
<input type="url" placeholder="picture link" v-model="picture" /><br />
1424
<input
1525
type="text"
1626
name="language"
17-
v-model="this.language"
27+
v-model="language"
1828
placeholder="Language :"
19-
/><br />
29+
@input="searchLanguage"
30+
autocomplete="off"
31+
/>
32+
<ul v-if="showSuggest">
33+
<li v-for="suggest in languageSuggest" :key="suggest" @click="selectSuggest(suggest)">
34+
{{ suggest }}
35+
</li>
36+
</ul>
37+
<input type="file" id="file" ref="fileInput" @change="onFileSelected" />
2038
<div class="flex justify-center mt-6">
2139
<button
2240
class="px-4 py-2 text-white bg-blue-500 rounded-lg hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50"
@@ -41,6 +59,8 @@
4159

4260
<script lang="ts">
4361
import { useCoursStore } from '@/store/modules/course.store';
62+
import VueDatePicker from '@vuepic/vue-datepicker';
63+
import Swal from 'sweetalert2';
4464
4565
export default {
4666
name: 'AddCourses',
@@ -57,11 +77,33 @@ export default {
5777
project: [],
5878
site: '',
5979
teacherId: '',
80+
languages: [],
81+
languageSuggest: [],
82+
showSuggest: false,
83+
dateFormat: 'yyyy-MM-dd HH:mm',
84+
datePickerLanguage: 'fr', // Langue du date picker
85+
selectedFile: null,
86+
base64String: '',
6087
};
6188
},
6289
methods: {
63-
AddCourses() {
90+
AddCourses(event) {
91+
event.preventDefault();
92+
93+
// Vérifier si tous les champs sont remplis
94+
if (!this.tag || !this.periodStart || !this.periodEnd || !this.picture || !this.language) {
95+
Swal.fire({
96+
title: 'Vous devez remplir tous les champs',
97+
text: 'Veuillez remplir tous les champs pour ajouter un nouveau cours',
98+
icon: 'error',
99+
confirmButtonColor: '#3085d6',
100+
cancelButtonColor: '#d33',
101+
confirmButtonText: 'OK',
102+
});
103+
return;
104+
}
64105
const course = useCoursStore();
106+
65107
this.newCourse = {
66108
tag: this.tag,
67109
classTag: '',
@@ -74,8 +116,73 @@ export default {
74116
project: [],
75117
site: '',
76118
teacherId: '',
119+
files: this.base64String,
77120
};
78-
course.addCourse(this.newCourse);
121+
122+
Swal.fire({
123+
title: 'Votre cours a été ajouté',
124+
icon: 'success',
125+
confirmButtonColor: '#3085d6',
126+
cancelButtonColor: '#d33',
127+
confirmButtonText: 'OK',
128+
}).then(async (result) => {
129+
if (result.isConfirmed) {
130+
// Ajouter le cours
131+
course.addCourse(this.newCourse);
132+
}
133+
});
134+
// Rediriger vers la page des cours
135+
this.$emit('close');
136+
},
137+
onFileSelected(event) {
138+
this.selectedFile = event.target.files[0];
139+
this.convertToBase64();
140+
},
141+
142+
convertToBase64() {
143+
if (this.selectedFile) {
144+
const reader = new FileReader();
145+
reader.onload = (event) => {
146+
let result = event.target.result;
147+
this.base64String = result.toString();
148+
};
149+
reader.readAsDataURL(this.selectedFile);
150+
}
151+
},
152+
153+
searchLanguage() {
154+
//recherche de toutes les matieres
155+
this.showSuggest = true;
156+
this.getAllTagCourse();
157+
this.languageSuggest = [];
158+
this.languages.forEach((element) => {
159+
let alreadyInList = false;
160+
if (element.toUpperCase().includes(this.language.toUpperCase()) && this.language != '') {
161+
this.languageSuggest.forEach((languageInList) => {
162+
if (languageInList == element.toUpperCase()) {
163+
alreadyInList = true;
164+
}
165+
});
166+
if (!alreadyInList) {
167+
this.languageSuggest.push(element.toUpperCase());
168+
}
169+
}
170+
});
171+
},
172+
173+
getAllTagCourse() {
174+
this.languages = []; //reset la list
175+
const courseStore = useCoursStore();
176+
const course = courseStore.items;
177+
course.forEach((element) => {
178+
if (!this.languages.includes(element.language)) {
179+
this.languages.push(element.language);
180+
}
181+
});
182+
},
183+
184+
selectSuggest(suggest) {
185+
this.language = suggest;
79186
},
80187
},
81188
};

front-end/src/components/RessourcesComponents/Cours.vue

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
<template>
22
<div>
3-
<div v-if="userRole === Roles.USER">
4-
<h1>ELEVE</h1>
5-
</div>
63
<div class="flex items-center justify-center">
74
<button
8-
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full mr-4"
5+
class="bg-blue-500 hover:bg-blue-700 font-bold py-2 px-4 rounded-full mr-4"
96
@click="
107
startYears-- && endYears--;
118
getCurrentYearsCours();
129
"
1310
>
1411
1512
</button>
16-
<span class="text-2xl font-bold">{{ startYears }} - {{ endYears }}</span>
13+
<span class="text-2xl font-bold text-gray-900 dark:text-white"
14+
>{{ startYears }} - {{ endYears }}</span
15+
>
1716
<button
18-
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full ml-4"
17+
class="bg-blue-500 hover:bg-blue-700 font-bold py-2 px-4 rounded-full ml-4"
1918
@click="
2019
startYears++ && endYears++;
2120
getCurrentYearsCours();
@@ -28,7 +27,7 @@
2827
<div class="flex items-center justify-center">
2928
<div class="flex items-center justify-center">
3029
<button
31-
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full"
30+
class="bg-blue-500 hover:bg-blue-700 font-bold py-2 px-4 rounded-full"
3231
@click="showModal = true"
3332
>
3433
+
@@ -46,7 +45,7 @@
4645
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
4746
<div
4847
v-for="item in coursesFiltered"
49-
class="max-w-sm bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700"
48+
class="max-w-sm bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700 text-gray-900 dark:text-white"
5049
@click="openCourse(item._id)"
5150
>
5251
<img

0 commit comments

Comments
 (0)