PageSourceSearch

https://ta-tum.com/js/modules/school_admin/school/section/TeacherModalAdd.js

js ta-tum.com collected 2026-10-01 14:52:10 UTC 18,272 bytes, 495 lines download raw bytes

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>&nbsp;&nbsp;&nbsp;&nbsp; 🤎 <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.