1/** 2 * Module School Admin: Add Teachers 3 * @description Módulo para agregar docentes a colegio 4 * @author Alejandro Micheloud 5 */ 6 7function TeacherModalAdd() { 8 var callback = null; 9 var mModal = null; 10 var _this = this; 11 var teacherTextareaPlaceholder = 12 "Nombre 1,Apellido 1,Correo 1,Clave 1 Nombre 2,Apellido 2,Correo 2,Clave 2"; 13 var teacherTextareaPlaceholder2 = 14 "Nombre 1,Apellido 1,Correo 1,Clave 1\nNombre 2,Apellido 2,Correo 2,Clave 2"; 15 16 function reset() { 17 getModal().find(".sadmin-options").hide(); 18 getModal().find("input.t-name").val(""); 19 getModal().find("input.t-lastname").val(""); 20 getModal().find("input.t-username").val(""); 21 getModal().find("input.t-password").val(""); 22 if ($.trim(getModal().find("textarea.teachers-ar").val()) === "") { 23 getModal().find("textarea.teachers-ar").val(teacherTextareaPlaceholder2); 24 } 25 if (mDiscover.haveSuperAdminSession()) { 26 getModal().find(".sadmin-options").show(); 27 } 28 } 29 30 function init() { 31 $("#modal-container .modal.d-modal-admin-school-add-teachers").remove(); 32 $("#modal-container").append(getHtmlModal()); 33 mModal = new Modal(getModal()); 34 35 getModal() 36 .find(".d-modal-close") 37 .click(function () { 38 _this.hide(); 39 }); 40 getModal() 41 .find(".d-footer .btn-cancel") 42 .click(function () { 43 _this.hide(); 44 }); 45 46 getModal() 47 .find(".btn-save") 48 .click(function () { 49 if (!getModal().find("form")[0].checkValidity()) { 50 mToast.toast("Debes completar correctamente el formulario."); 51 return; 52 } 53 54 var data = { username: getModal().find("input.t-username").val() }; 55 mDiscover.showLoading(); 56 mCom.ajax( 57 "register/verify-username", 58 "GET", 59 data, 60 function (data, status) { 61 // correo ok, registro... 62 var data = {}; 63 data.school_guid = mDiscover.getUser().schools[0].guid; 64 data.treatment = getModal().find("select.t-treatment").val(); 65 data.name = getModal().find("input.t-name").val(); 66 data.lastname = getModal().find("input.t-lastname").val(); 67 data.username = getModal().find("input.t-username").val(); 68 data.password = getModal().find("input.t-password").val(); 69 data.is_verified = 70 getModal().find("select.t-license").val() === "active";
71 data.is_admin = getModal().find("select.t-admin").val() === "yes"; 72 73 mDiscover.showLoading(); 74 mCom.ajax( 75 "school/admin/new-teacher", 76 "POST", 77 data, 78 function (data, status) { 79 console.log(data); 80 mDiscover.hideLoading(); 81 if (data.is_verified && !data.have_license) { 82 mToast.toast("Se creó el docente", 3000); 83 mToast.toast( 84 "Atención: Has llegado al lÃmite de licencias de docente.", 85 6000 86 ); 87 } else { 88 mToast.toast("Se guardó correctamente", 3000); 89 } 90 if (isFunction(callback)) { 91 callback(); 92 } 93 mModal.hide(); 94 }, 95 function (err, status, msg) { 96 mToast.toast( 97 "Problemas al guardar, por favor revisa que los datos sean correctos", 98 3000 99 ); 100 mDiscover.hideLoading(); 101 } 102 ); 103 }, 104 function (err, status, msg) { 105 if (err.status === 409) { 106 mToast.toast( 107 "El correo se encuentra registrado en la plataforma." 108 ); 109 } else { 110 console.log(err); 111 console.log(status); 112 console.log(msg); 113 } 114 mDiscover.hideLoading(); 115 } 116 ); 117 }); 118 119 // batch add 120 getModal().find(".btn-preview").click(addTeachersPreview); 121 getModal() 122 .find(".preview-container .btn.close") 123 .click(function () { 124 getModal().find(".preview-container").hide(); 125 }); 126 getModal().find(".preview-container .btn.confirm").click(addTeachers); 127 getModal() 128 .find(".preview-container .btn.ok") 129 .click(function () { 130 getModal().find(".preview-container").hide(); 131 _this.hide(); 132 getModal().find("textarea.teachers-ar").val(""); 133 }); 134 } 135 136 function addTeachersPreview() { 137 if ( 138 $.trim(getModal().find("textarea.teachers-ar").val()) === "" || 139 getModal().find("textarea.teachers-ar").val().split(",").length < 3 140 ) { 141 mToast.toast("No hay usuarios que agregar"); 142 return; 143 } 144 145 var html_teachers = ""; 146 var pointer = 0; 147 var teachers_ar = getModal().find("textarea.teachers-ar").val().split(/\n/); 148 for (var i = 0; i < teachers_ar.length; i++) { 149 var fields_ar = String(teachers_ar[i]).split(","); 150 if (fields_ar.length > 1) { 151 pointer++; 152 var teacher = {}; 153 teacher.name = $.trim(fields_ar[0]); 154 teacher.lastname = $.trim(fields_ar[1]); 155 156 if (!fields_ar[2]) { 157 // sin username, creamos 158 fields_ar[2] = String(teacher.name + "." + teacher.lastname) 159 .toLocaleLowerCase() 160 .split(" ") 161 .join(""); 162 } 163 if (!fields_ar[3]) { 164 // sin password, creamos 165 var alphabet = "abcdefghijklmnopqrstuvwxyz123456789"; 166 fields_ar[3] = getRandomPassword(alphabet, 5); 167 } 168 var unique_password = $.trim( 169 String(getModal().find(".password-unique").val()) 170 ); 171 if (unique_password !== "") { 172 fields_ar[3] = unique_password; 173 } 174 175 teacher.username = fields_ar[2] ? $.trim(fields_ar[2]) : ""; 176 teacher.password = fields_ar[3] ? $.trim(fields_ar[3]) : ""; 177 html_teachers += getHtmlTeacher(pointer, teacher, false); 178 } 179 } 180 181 var html = 182 "" + 183 "<tr>" + 184 " <th>#</th>" + 185 " <th>Trat.</th>" + 186 " <th>Nombre</th>" + 187 " <th>Apellidos</th>" + 188 " <th>Usuario</th>" + 189 " <th>Clave</th>" + 190 "</tr>" + 191 html_teachers; 192 193 getModal().find(".preview-container .title").html("Previsualización"); 194 getModal() 195 .find(".preview-container .sub-title") 196 .html("Puedes editar datos de docentes antes de crear las cuentas"); 197 getModal().find(".preview-container table").html(html); 198 getModal().find(".preview-container .footer .btn.close").show(); 199 getModal().find(".preview-container .footer .btn.confirm").show(); 200 getModal().find(".preview-container .footer .btn.ok").hide(); 201 getModal().find(".preview-container").show(); 202 } 203 function isEmail(email) { 204 var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; 205 return regex.test(email); 206 } 207 function addTeachers() { 208 var data = {}; 209 var error = false;
210 data.teachers_ar = []; 211 data.isLinkExistingUser = false; 212 if ( 213 mDiscover.haveSuperAdminSession() && 214 getModal().find("#link-existing-teachers").is(":checked") 215 ) { 216 data.isLinkExistingUser = true; 217 } 218 219 getModal() 220 .find("table tr.teacher") 221 .each(function (i) { 222 var teacher = {}; 223 teacher.position = i + 1; 224 teacher.treatment = $.trim($(this).find("select.treatment").val()); 225 teacher.name = $.trim($(this).find("input.name").val()); 226 teacher.lastname = $.trim($(this).find("input.lastname").val()); 227 teacher.username = $.trim($(this).find("input.username").val()); 228 teacher.password = $.trim($(this).find("input.password").val()); 229 teacher.school_guid = mDiscover.getUser().schools[0].guid; 230 teacher.is_verified = true; 231 console.log(teacher); 232 if (teacher.name.length < 2) { 233 error = 234 "Problema Docente #" + 235 teacher.position + 236 ": El nombre debe tener al menos dos caracteres."; 237 return false; 238 } 239 if (teacher.lastname.length < 2) { 240 error = 241 "Problema Docente #" + 242 teacher.position + 243 ": Los apellidos deben tener al menos dos caracteres."; 244 return false; 245 } 246 if (teacher.username.length < 3) { 247 error = 248 "Problema Docente #" + 249 teacher.position + 250 ": El nombre de usuario debe tener al menos tres caracteres."; 251 return false; 252 } 253 if (!isEmail(teacher.username)) { 254 error = 255 "Problema Docente #" + 256 teacher.position + 257 ": El nombre de usuario debe ser un correo electrónico."; 258 return false; 259 } 260 if (teacher.password.length < 3) { 261 error = 262 "Problema Docente #" + 263 teacher.position + 264 ": La clave debe tener al menos tres caracteres."; 265 return false; 266 } 267 data.teachers_ar.push(teacher); 268 }); 269 270 addTeachersDo(error, data); 271 } 272 function addTeachersDo(err, data) { 273 if (err) { 274 mToast.toast(err); 275 } else { 276 mDiscover.showLoading(); 277 mCom.ajax( 278 "school/admin/teachers", 279 "POST", 280 data, 281 function (datax, status) { 282 mDiscover.hideLoading(); 283 284 console.log(datax); 285 getModal().find(".preview-container .title").html("Resultado"); 286 getModal().find(".preview-container .sub-title").html(""); 287 288 getModal().find(".sadmin-options").hide(); 289 290 var html_ok = ""; 291 var html_notok = ""; 292 var pointer_ok = 0; 293 var pointer_notok = 0; 294 for (var i = 0; i < datax.teachers_ar.length; i++) { 295 var teacher = datax.teachers_ar[i]; 296 if (teacher.hasOwnProperty("guid")) { 297 pointer_ok++; 298 html_ok += getHtmlTeacher(pointer_ok, teacher, true); 299 } else { 300 pointer_notok++; 301 html_notok += getHtmlTeacher(pointer_notok, teacher, true); 302 } 303 } 304 305 var html = 306 "" + 307 "<tr>" + 308 " <th>#</th>" + 309 " <th>Trat.</th>" + 310 " <th>Nombre</th>" + 311 " <th>Apellidos</th>" + 312 " <th>Usuario</th>" + 313 " <th>Clave</th>" + 314 "</tr>" + 315 "<tr>" + 316 ' <td colspan="5"><span class="d-class">Cuentas creadas:</span></td>' + 317 "</tr>" + 318 html_ok; 319 if (html_notok !== "") { 320 html += 321 "<tr>" + 322 ' <td colspan="5"><span class="d-class">Cuentas no creadas:</span></td>' + 323 "</tr>" + 324 html_notok; 325 } 326 327 getModal().find(".preview-container table").html(html); 328 getModal().find(".preview-container .footer .btn.ok").show(); 329 getModal().find(".preview-container .footer .btn.close").hide(); 330 getModal().find(".preview-container .footer .btn.confirm").hide(); 331 }, 332 function (err, status, msg) { 333 mToast.toast("Problemas al crear docentes", 3000); 334 mDiscover.hideLoading(); 335 } 336 ); 337 } 338 } 339 340 // helpers 341 function getModal() {
342 return $("#modal-container .modal.d-modal-admin-school-add-teachers"); 343 } 344 function getHtmlModal() { 345 return ( 346 '<div class="modal d-modal-admin-school-add-teachers">' + 347 ' <div class="modal-content wrap-dialog-popup">' + 348 ' <div class="modal-body">' + 349 ' <div class="d-header">' + 350 ' <div class="d-title">Nuevos Docentes</div>' + 351 ' <div class="d-modal-close btn btn-bitmap"></div>' + 352 " </div>" + 353 ' <div class="d-content">' + 354 ' <form class="d-form">' + 355 ' <div class="d-avatar"></div>' + 356 ' <div class="d-avatar-bg"></div>' + 357 ' <table class="f-teacher">' + 358 " <tr>" + 359 ' <td class="d-label">Tratamiento</td>' + 360 ' <td class="d-value">' + 361 ' <select class="simple-input t-treatment"><option value="mr">Sr.</option><option value="mrs">Sra.</option></select>' + 362 " </td>" + 363 " </tr>" + 364 " <tr>" + 365 ' <td class="d-label">Nombre</td>' + 366 ' <td class="d-value"><input type="text" class="simple-input t-name" required="required" pattern=".{2,30}" /></td>' + 367 " </tr>" + 368 " <tr>" + 369 ' <td class="d-label">Apellido</td>' + 370 ' <td class="d-value"><input type="text" class="simple-input t-lastname" required="required" pattern=".{2,30}" /></td>' + 371 " </tr>" + 372 " <tr>" + 373 ' <td class="d-label">Correo electrónico</td>' + 374 ' <td class="d-value"><input type="text" class="simple-input t-username" required="required" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,4}$" /></td>' + 375 " </tr>" + 376 " <tr>" + 377 ' <td class="d-label">Contraseña</td>' + 378 ' <td class="d-value"><input type="text" class="simple-input t-password" required="required" pattern=".{3,20}" /></td>' + 379 " </tr>" + 380 " <tr>" + 381 ' <td class="d-label">Licencia</td>' + 382 ' <td class="d-value">' + 383 ' <select class="simple-input t-license">' + 384 ' <option value="active">Activa</option>' + 385 ' <option value="no-active">No activa</option>' + 386 " </select>" + 387 " </td>" + 388 " </tr>" + 389 " <tr>" + 390 ' <td class="d-label">Administrador</td>' + 391 ' <td class="d-value">' + 392 ' <select class="simple-input t-admin">' + 393 ' <option value="no">No</option>' + 394 ' <option value="yes">SÃ</option>' + 395 " </select>" + 396 " </td>" + 397 " </tr>" + 398 " <tr>" + 399 ' <td class="d-label"></td>' + 400 ' <td class="d-value">' + 401 ' <div class="btn orange btn-save">Guardar</div>' + 402 " </td>" + 403 " </tr>" + 404 " </table>" + 405 ' <table width="100%">' + 406 " <tr>" + 407 ' <td class="d-label left">O pega aquà una lista de docentes:</td>' + 408 " </tr>" + 409 " <tr>" + 410 ' <td class="d-value">' + 411 ' <textarea class="teachers-ar">' + 412 teacherTextareaPlaceholder + 413 "</textarea>" + 414 " </td>" + 415 " <tr>" + 416 ' <td class="d-label left">' + 417 ' <div><input type="text" placeholder="Contraseña única (opcional)" class="password-unique"/></div>' + 418 ' <div class="btn orange btn-preview">Previsualizar</div>' + 419 " </td>" + 420 " </tr>" + 421 " </tr>" + 422 " </table>" + 423 " </form>" + 424 " </div>" + 425 " </div>" + 426 ' <div class="preview-container">' + 427 ' <div class="title"></div>' + 428 ' <div class="sub-title"></div>' + 429 " <table>" + 430 " </table>" + 431 ' <div class="sadmin-options">' + 432 ' <div class="simple-checkbox square"> ' + 433 ' <input id="link-existing-teachers" type="checkbox" checked="true" /><label for="link-existing-teachers">Vincular al colegio si la cuenta existe</label> ' + 434 ' <p> ð¤ <i>Si la cuenta existe <span style="color: darkred;">no</span> se modifican nombre, apellido y contraseña.</i></p>' + 435 " </div> " + 436 " </div>" + 437 ' <div class="footer">' + 438 ' <div class="btn dark close">Descartar</div>' + 439 ' <div class="btn orange confirm">Crear cuentas</div>' + 440 ' <div class="btn orange ok">Aceptar</div>' + 441 " </div>" + 442 " </div>" + 443 " </div>" + 444 "</div>" 445 ); 446 } 447 448 function getHtmlTeacher(index, teacher, readOnly) { 449 var ro = readOnly ? 'disabled="disabled"' : ""; 450 return ( 451 '<tr class="teacher">' + 452 " <td>" + 453 index + 454 "</td>" + 455 ' <td><select class="treatment" ' + 456 ro + 457 '><option value="mr">Sr.</option><option value="mrs">Sra.</option></select></td>' + 458 ' <td><input type="text" class="name" value="' + 459 teacher.name + 460 '" size="13" ' + 461 ro + 462 " /></td>" + 463 ' <td><input type="text" class="lastname" value="' + 464 teacher.lastname + 465 '" size="13" ' + 466 ro + 467 " /></td>" + 468 ' <td><input type="text" class="username" value="' + 469 teacher.username + 470 '" size="21" ' + 471 ro + 472 " /></td>" + 473 ' <td><input type="text" class="password" value="' + 474 teacher.password + 475 '" size="13" ' + 476 ro + 477 " /></td>" + 478 "</tr>" 479 ); 480 } 481 482 this.show = function (_callback) { 483 callback = _callback; 484 mModal.show(); 485 reset(); 486 }; 487 this.hide = function () { 488 mModal.hide(); 489 if (isFunction(callback)) { 490 callback(null); 491 } 492 }; 493 494 init(); 495}
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.