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.