refactoring, better README (breaking commit...)
[qomet.git] / public / javascripts / grade.js
1 //TODO: compute grades after exam (in teacher's view)
2
3 new Vue({
4 el: '#grade',
5 data: {
6 assessmentArray: assessmentArray,
7 settings: {
8 totalPoints: 20,
9 halfPoints: false,
10 zeroSum: false,
11 },
12 group: 1, //for detailed grades tables
13 grades: { }, //computed
14 },
15 mounted: function() {
16 // TODO
17 },
18 methods: {
19 // GRADES:
20 gradeSettings: function() {
21 $("#gradeSettings").modal("open");
22 Materialize.updateTextFields(); //total points field in grade settings overlap
23 },
24 download: function() {
25 // Download (all) grades as a CSV file
26 let data = [ ];
27 this.studentList(0).forEach( s => {
28 let finalGrade = 0.;
29 let gradesCount = 0;
30 if (!!this.grades[s.number])
31 {
32 Object.keys(this.grades[s.number]).forEach( assessmentName => {
33 s[assessmentName] = this.grades[s.number][assessmentName];
34 if (_.isNumeric(s[assessmentName]) && !isNaN(s[assessmentName]))
35 {
36 finalGrade += s[assessmentName];
37 gradesCount++;
38 }
39 if (gradesCount >= 1)
40 finalGrade /= gradesCount;
41 s["final"] = finalGrade; //TODO: forbid "final" as assessment name
42 });
43 }
44 data.push(s); //number,name,group,assessName1...assessNameN,final
45 });
46 let csv = Papa.unparse(data, {
47 quotes: true,
48 header: true,
49 });
50 let downloadAnchor = $("#download");
51 downloadAnchor.attr("download", this.course.code + "_results.csv");
52 downloadAnchor.attr("href", "data:text/plain;charset=utf-8," + encodeURIComponent(csv));
53 this.$refs.download.click()
54 //downloadAnchor.click(); //fails
55 },
56 showDetails: function(group) {
57 this.group = group;
58 $("#detailedGrades").modal("open");
59 },
60 groupList: function() {
61 let maxGrp = 1;
62 this.course.students.forEach( s => {
63 if (s.group > maxGrp)
64 maxGrp = s.group;
65 });
66 return _.range(1,maxGrp+1);
67 },
68 grade: function(assessmentIndex, studentNumber) {
69 if (!this.grades[assessmentIndex] || !this.grades[assessmentIndex][studentNumber])
70 return ""; //no grade yet
71 return this.grades[assessmentIndex][studentNumber];
72 },
73 groupId: function(group, prefix) {
74 return (prefix || "") + "group" + group;
75 },
76 togglePresence: function(number, index) {
77 // UNIMPLEMENTED
78 // TODO: if no grade (thus automatic 0), toggle "exempt" state on student for current exam
79 // --> automatic update of grades view (just a few number to change)
80 },
81 computeGrades: function() {
82 // UNIMPLEMENTED
83 // TODO: compute all grades using settings (points, coefficients, bonus/malus...).
84 // If some questions with free answers (open), display answers and ask teacher action.
85 // TODO: need a setting for that too (by student, by exercice, by question)
86 },
87 },
88 });