PageSourceSearch

https://ta-tum.com/js/modules/student/classroom/StudentClassroomGradebook.js

js ta-tum.com collected 2026-09-24 11:28:43 UTC 21,378 bytes, 434 lines download raw bytes

1/**
2 * Module Student Classroom Gradebook
3 * @description Módulo que representa el libro de calificaciones
4 * @author Alejandro Micheloud
5 */
6
7var StudentClassroomGradebook = function (sco) {
8    var scope = sco;
9    var builded = false;
10    var gradebook = null;
11    var amount_projects = null;
12    var amount_students = null;
13    var classroom_total = null; // total of student points
14    var classroom_project_total = null;
15
16    /**
17     * Se invoca cuando el módulo recibe foco
18     * @returns {undefined}
19     */
20    function show() {
21        console.log("StudentClassroomStudents:show();");
22        if (!builded) {
23            build(doStart);
24        } else {
25            doStart();
26        }
27        scope.find(".mStudents.d-students").show();
28    }
29    function doStart() {
30        scope.show();
31
32        mDiscover.showLoading();
33        mCom.ajax("classroom/gradebook/" + mStudentHome.getClassroomGuid(), "GET", "", function (data, status) {
34            console.log("doStart() result");
35            mDiscover.hideLoading();
36            gradebook = data;
37            render();
38        }, function (err, status, msg) {
39            mDiscover.hideLoading();
40            mToast.toast("Problemas al recuperar resultados", 3000);
41        });
42
43    }
44    function calcTotal() {
45        classroom_total = 0;
46        amount_projects = gradebook.projects.length;
47        classroom_project_total = 0; // total de puntos que puede obtener un alumno
48        for (var i = 0; i < amount_projects; i++) {
49            var project_score = 0;
50            var amount_tasks = 0;
51            if (gradebook.projects[i].hasOwnProperty("item_guid")) {
52                // gradebook classroom item
53                if (!isNaN(gradebook.projects[i].score)) {
54                    project_score += gradebook.projects[i].score;
55                }
56            } else {
57                for (var j = 0; j < gradebook.projects[i].tasks.length; j++) {
58                    if (gradebook.projects[i].tasks[j].hasOwnProperty("item_guid")) {
59                        // gradebook project item
60                        if (!isNaN(gradebook.projects[i].tasks[j].score)) {
61                            project_score += gradebook.projects[i].tasks[j].score;
62                        }
63                    } else {
64                        if (!isNaN(gradebook.projects[i].tasks[j].task_score)) {
65                            project_score += gradebook.projects[i].tasks[j].task_score;
66                        }
67                        amount_tasks++;
68                    }
69                }
70            }
71            gradebook.projects[i].project_score = project_score;
72            classroom_project_total += project_score;
73            gradebook.projects[i].amount_tasks = amount_tasks;
74            //console.log("gradebook.projects[i].project_score: " + gradebook.projects[i].project_score);
75        }
76        for (var i = 0; i < gradebook.students.length; i++) {
77            var student_total = 0;
78            var student_without_access_points = 0;
79            for (var j = 0; j < amount_projects; j++) {
80                var project_total = 0;
81                if (gradebook.students[i].projects[j].hasOwnProperty("item_guid")) {
82                    // gradebook classroom item
83                    if (!isNaN(gradebook.students[i].projects[j].score)) {
84                        project_total += gradebook.students[i].projects[j].score;
85                    }
86                } else {
87                    for (var k = 0;
88                            k < gradebook.students[i].projects[j].tasks.length;
89                            k++) {
90                        if (gradebook.students[i].projects[j].tasks[k].hasOwnProperty("item_guid")) {
91                            // gradebook project item
92                            if (!isNaN(gradebook.students[i].projects[j].tasks[k].score)) {
93                                project_total += gradebook.students[i].projects[j].tasks[k].score;
94                            }
95                        } else {
96                            if (gradebook.students[i].projects[j].tasks[k].status === "corrected") {
97                                if (!isNaN(gradebook.students[i].projects[j].tasks[k].student_score)) {
98                                    project_total += gradebook.students[i].projects[j].tasks[k].student_score;
99                                }
100                            } else {
101                                // descontar tareas/test en estado distinto a corregido
102                                if (gradebook.students[i].projects[j].tasks[k].with_access) {
103                                    if (!isNaN(gradebook.students[i].projects[j].tasks[k].student_score)) {
104                                        student_without_access_points += gradebook.students[i].projects[j].tasks[k].task_score;
105                                    }
106                                }
107                            }
108                        }
109                    }
110                }
111                gradebook.students[i].projects[j].project_total = project_total;
112                student_total += project_total;
113            }
114            gradebook.students[i].student_total = student_total;
115            gradebook.students[i].score = student_total * 10 / (classroom_project_total - student_without_access_points);
116            gradebook.students[i].score = Math.round(gradebook.students[i].score * 100) / 100;
117
118            classroom_total += student_total;
119        }
120    }
121
122    function render() {
123        calcTotal();
124
125        // classroom total
126        // scope.find(".d-left-fixed .d-header.h2 span").first().html(classroom_total);
127        scope.find(".d-left-fixed .d-header.h2 span.d-total").html(classroom_project_total);
128
129        // students
130        amount_students = gradebook.students.length;
131        var html = "";
132        for (var i = 0; i < amount_students; i++) {
133            html += getHtmlStudent(gradebook.students[i]);
134        }
135        scope.find(".d-col-students").html(html);
136
137        // project and responses
138        html = getHtmlHeaderTasks() +
139                '<div class="d-col-tasks">';
140        for (var i = 0; i < amount_students; i++) {
141            html += getHtmlStudentTasks(gradebook.students[i]);
142        }
143        html += '</div>';
144        scope.find(".d-right").html(html);
145
146        for (var i = 0; i < amount_students; i++) {
147            var $student = scope.find(".d-right .d-col-project-student").eq(i);
148            $student.data(gradebook.students[i]);
149            for (var j = 0; j < gradebook.students[i].projects.length; j++) {
150                $student.find(".d-col-project-student-tasks[guid='" + gradebook.students[i].projects[j].guid + "']").data(gradebook.students[i].projects[j]);
151
152                if (gradebook.students[i].projects[j].hasOwnProperty("item_guid")) {
153                    // gradebook classroom item
154                } else {
155                    for (var k = 0;
156                            k < gradebook.students[i].projects[j].tasks.length;
157                            k++) {
158                        $student.find(".d-col-project-student-tasks[guid='" + gradebook.students[i].projects[j].guid + "'] .d-project-task").eq(k).data(gradebook.students[i].projects[j].tasks[k]);
159                    }
160                }
161            }
162        }
163
164        scope.find(".d-right .d-col-project-student-tasks .d-project-task").click(function () {
165            if ($(this).hasClass("new-item") || $(this).hasAttr("item_guid")) {
166                return;
167            }
168            var task = $(this).data();
169            var project = $(this).closest(".d-col-project-student-tasks").data();
170            var student = $(this).closest(".d-col-project-student").data();
171            console.log(task);
172            console.log(project);
173            console.log(student);
174            routie("student/classroom/" + mStudentHome.getClassroomGuid() + "/" + project.project_guid + "/" + project.guid + "/post/" + task.post_guid);
175        });
176
177        // header projects data + hover
178        for (var i = 0; i < gradebook.projects.length; i++) {
179            if ($(this).hasAttr("item_guid")) {
180                return;
181            }
182            var project = gradebook.projects[i];
183            var $cell = scope.find(".d-right .d-right-header-project[guid='" + project.guid + "']");
184            $cell.find(".d-project-status").addClass(project.status);
185            $cell.data(project);
186            mTooltip.setTooltip($cell, '<b>"' + project.title + '"</b>' + "<br>Estado: " + getProjectStateLabel(project.status));
187            if (project.hasOwnProperty("tasks")) {
188                for (var j = 0; j < project.tasks.length; j++) {
189                    if (!project.tasks[j].hasOwnProperty("item_guid")) {
190                        var $cellTask = scope.find(".d-right .d-right-header-task[guid='" + project.tasks[j].task_guid + "']");
191                        var title = stripTags(project.tasks[j].title);
192                        if (title === "" || title === null) title = "Sin título";
193                        mTooltip.setTooltip($cellTask, '<b>"' + title + '"</b>' + "<br>Creado " + getElapsedTimeMDM(project.tasks[j].created_at_mdm));
194                        var route_classroom_project_post = "student/classroom/" + mStudentHome.getClassroomGuid() + "/" + project.project_guid + "/" + project.guid + "/post/" + project.tasks[j].guid;
195                        $cellTask.attr("route", route_classroom_project_post);
196                        $cellTask.click(function () {
197                            routie($(this).attr("route"));
198                        });
199                    }
200                }
201            }
202        }
203        var $cell = scope.find(".d-right .d-right-header-project").click(function () {
204            var project = $(this).data();
205            if (scope.find(".d-right-header-project-tasks[guid='" + project.guid + "']").is(":visible")) {
206                scope.find(".d-right-header-project-tasks[guid='" + project.guid + "']").fadeOut();
207                scope.find(".d-col-project-student-tasks[guid='" + project.guid + "']").fadeOut();
208
209                scope.find(".d-project[guid='" + project.guid + "']")
210                    .removeClass("d-task-open")
211                    .addClass("d-task-close");
212
213                scope.find(".d-right-header-project[guid='" + project.guid + "']")
214                    .addClass("d-task-close")
215                    .removeClass("d-task-open");
216
217                var totalWidth = scope.find(".d-right-header-project[guid='" + project.guid + "']").width();
218
219                scope.find(".d-right-header-project[guid='" + project.guid + "'] .d-title")
220                    .width(totalWidth);
221
222                scope.find(".d-right-header-project[guid='" + project.guid + "'] .d-title .d-title-text")
223                    .width(147);
224            } else {
225                onProjectOpen(project);
226            }
227        });
228        //setTimeout(function () {
229        var $cell = scope.find(".d-right .d-right-header-project").each(function () {
230            var project = $(this).data();
231            onProjectOpen(project)
232
233        });
234        //}, 100);
235
236        function onProjectOpen(project) {
237            scope.find(".d-right-header-project-tasks[guid='" + project.guid + "']").fadeIn();
238            scope.find(".d-col-project-student-tasks[guid='" + project.guid + "']").fadeIn();
239            scope.find(".d-project[guid='" + project.guid + "']")
240                .removeClass("d-task-close")
241                .addClass("d-task-open");
242
243            scope.find(".d-right-header-project[guid='" + project.guid + "']")
244                .addClass("d-task-open")
245                .removeClass("d-task-close");
246
247            var totalWidth = scope.find(".d-col-project-student-tasks[guid='" + project.guid + "']").width() +
248                scope.find(".d-right-header-project[guid='" + project.guid + "']").width();
249
250            scope.find(".d-right-header-project[guid='" + project.guid + "'] .d-title")
251                .width(totalWidth);
252
253            var titleText = scope.find(".d-right-header-project[guid='" + project.guid + "'] .d-title .d-title-text");
254            if (titleText && titleText.position())
255                titleText.width(totalWidth - titleText.position().left);
256        }
257        /*
258         // animation
259         for (var i = 0; i < amount_projects; i++) {
260         scope.find(".d-right .d-right-header-project").eq(i).delay(((i + 1) * 1000)).queue(function (next) {
261         $(this).click();
262         next();
263         });
264         }
265         */
266    }
267    /**
268     * Constructor de módulo
269     * @returns {undefined}
270     */
271    function build(callback) {
272
273        builded = true;
274
275        scope.html(getHtmlGradebook());
276
277        scope.find(".d-gradebook").scroll(function (e) {
278            //console.log(e);
279            try {
280                scope.find(".d-left-fixed").css("left", e.currentTarget.scrollLeft + "px");
281            } catch (err) {
282                console.log(err);
283            }
284        });
285
286        // button export
287        scope.find(".d-header-link .btn-export").click(availableSoon);
288
289        if (isFunction(callback))
290            callback();
291    }
292
293    /**
294     * Constructor
295     * @returns {undefined}
296     */
297    function init() {
298        // nada, latente hasta show
299    }
300    init();
301
302    // helpers
303    /* html of module */
304    function getHtmlGradebook() {
305        return  '       <div class="d-header-link">' +
306                /*'           <div class="btn btn-export standard-text-shadow-1">Exportar</div>' +*/
307                '       </div>' +
308                '       <div class="d-gradebook standard-inner-shadow-1 standard-scrollbar-3">' +
309                '            <div class="d-left-fixed standard-inner-shadow-4">' +
310                '               <div class="d-headers">' +
311                '                   <div class="d-header h1"></div>' +
312                '                   <div class="d-header h2">' + lang.gradebook_score + '/ ' + lang.gradebook_project_item_points + ' <div class="on-score-ten">10</div><div><span class="d-total">-</span></div></div > ' +
313                /*'                   <div class="d-header h3">' + lang.gradebook_project_item_points + '</div>' +*/
314                '               </div>' +
315                '               <div class="d-col-students">' +
316                '               </div>' +
317                '            </div>' +
318                '            <div class="d-right">' +
319                '            </div>' +
320                '       </div>';
321    }
322    function getHtmlStudent(student) {
323        return '<div class="d-student">' +
324                '   <div class="d-avatar">' + getHtmlStudentAvatar(student, "x-small") + '</div>' +
325                '   <div class="d-name"><span>' + getStudentName(student) + '</span></div>' +
326                '   <div class="d-score">' + (isNaN(student.score) ? "-" : student.score) + '</div>' +
327                '   <div class="d-points">' + student.student_total + '</div>' +
328                '</div>';
329    }
330    function getHtmlStudentTasks(student) {
331        var html = '<div class="d-col-project-student">';
332        for (var i = 0; i < amount_projects; i++) {
333            if (student.projects[i].hasOwnProperty("item_guid")) {
334                // gradebook classroom item
335                var score = (student.projects[i].score !== null) ? student.projects[i].score : "-";
336                html += '<div class="d-project active item" item_guid=' + student.projects[i].item_guid + '>' +
337                        '   <div class="d-item-points contenteditable="false"">' + score + '</div>' +
338                        '</div>';
339            } else {
340                html += '<div class="d-project" guid="' + student.projects[i].guid + '">' + student.projects[i].project_total + '</div>';
341                // console.log("getHtmlStudentTasks i: " + i);
342                // console.log(student);
343                html += '<div class="d-col-project-student-tasks" guid="' + student.projects[i].guid + '">';
344
345                for (var j = 0; j < student.projects[i].tasks.length; j++) {
346                    if (student.projects[i].tasks[j].hasOwnProperty("item_guid")) {
347                        // gradebook project item
348                        var score = (student.projects[i].tasks[j].score !== null) ? student.projects[i].tasks[j].score : "-";
349                        html += '<div class="d-project-task active item" item_guid=' + student.projects[i].tasks[j].item_guid + '>' +
350                                '   <div class="d-item-points" contenteditable="false">' + score + '</div>' +
351                                '</div>';
352                    } else {
353                        var student_score = (student.projects[i].tasks[j].student_score) ? student.projects[i].tasks[j].student_score : "0";
354                        html += '<div class="d-project-task">' + (student.projects[i].tasks[j].status === "corrected" ? student_score : "-") + '</div>';
355                    }
356                }
357                html += '</div>';
358            }
359        }
360
361        html += '</div>';
362        return html;
363    }
364    function getHtmlHeaderTasks() {
365        var amount = gradebook.projects.length;
366
367        var html = '<div class="d-right-header">';
368        for (var i = 0; i < amount; i++) {
369            var project = gradebook.projects[i];
370            var amount_tasks = 0;
371            var amount_quizzes = 0;
372            if (project.hasOwnProperty("item_guid")) {
373                // gradebook classroom item
374                html += getHtmlNewItem(null, project);
375            } else {
376                var title_project = userLang === "eu" ? (i + 1) + ". " + lang.gradebook_project_title : lang.gradebook_project_title + ' ' + (i + 1);
377                html += '<div class="d-right-header-project" guid="' + gradebook.projects[i].guid + '">' +
378                        '    <div class="d-title"><div class="d-project-status active"></div><div class="d-title-text">' + project.title + '</div></div>' +
379                        '</div>' +
380                        '<div class="d-right-header-project-tasks" guid="' + gradebook.projects[i].guid + '">';
381                for (var j = 0; j < project.tasks.length; j++) {
382                    var task = project.tasks[j];
383                    if (task.hasOwnProperty("item_guid")) {
384                        // gradebook project item
385                        html += '<div class="d-right-header-task active" item_guid="' + task.item_guid + '">' +
386                                '   <div class="d-btn-add btn btn-bitmap"></div>' +
387                                '   <div class="d-item-form">' +
388                                '       <div class="d-item-title" placeholder="Nuevo item">' + ((task.name !== null) ? task.name : "") + '</div>' +
389                                '       <div class="d-item-points">' + ((task.score !== null) ? task.score : "") + '</div>' +
390                                '   </div>' +
391                                '</div>';
392
393                    } else {
394                        var task_title = "";
395
396                        if (task.type === "quizz") {
397                            amount_quizzes++;
398                            task_title = userLang === "eu" ? amount_quizzes + ". " + lang.gradebook_project_quizz : lang.gradebook_project_quizz + " " + amount_quizzes;
399                        } else {
400                            amount_tasks++;
401                            task_title = userLang === "eu" ? amount_tasks + ". " + lang.gradebook_project_task : lang.gradebook_project_task + " " + amount_tasks;
402                        }
403                        html += '<div class="d-right-header-task" guid="' + task.task_guid + '">' +
404                                '    <div class="d-title">' + task_title + '</div>' +
405                                '    <div class="d-points">' + (task.task_score !== null ? task.task_score : "") + '</div>' +
406                                '</div>';
407                    }
408                }
409                html += '</div>';
410            }
411        }
412        html += '</div>';
413        return html;
414    }
415    function getHtmlNewItem(_project_guid, _gradebook_item) {
416        var gradebook_item = _gradebook_item || null;
417        var project_guid = _project_guid || null;
418        var attr_project_guid = (project_guid !== null) ? ' project_guid="' + project_guid + '"' : '';
419        var tile_class = (project_guid !== null) ? 'd-right-header-task' : 'd-right-header-project';
420        var active_class = gradebook_item !== null ? 'active' : 'new-item';
421        var attr_item = gradebook_item !== null ? 'item_guid="' + gradebook_item.item_guid + '"' : '';
422        return '<div class="' + tile_class + ' ' + active_class + ' "' + attr_project_guid + ' ' + attr_item + '>' +
423                '   <div class="d-btn-add btn btn-bitmap" title="Agregar nuevo item"></div>' +
424                '   <div class="d-item-form">' +
425                '       <div class="d-item-title" placeholder="Nuevo item">' + ((gradebook_item !== null && gradebook_item.name !== null) ? gradebook_item.name : "") + '</div>' +
426                '       <div class="d-item-points" placeholder="Puntos">' + ((gradebook_item !== null && gradebook_item.score !== null) ? gradebook_item.score : "") + '</div>' +
427                '   </div>' +
428                '</div>';
429    }
430
431    // public methods
432    this.show = show;
433
434};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.