asignamateria.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. //alumnosObj.push({id: <?php echo $cve;?>, nombre:"", plan:"", matArr:[{id, desc, clave, plan, sem, grupo_id, grupo, califArr{calif, fecha, calif_tipo, revalidada}}]});
  2. //carga las materias en el objeto alumnosObj
  3. function loadMaterias(){
  4. if(idArr.length > 0){
  5. $.ajax({
  6. url: './action/asignamaterias_select.php',
  7. type: 'POST',
  8. dataType: 'json',
  9. data: { idArr: idArr, plan: _plan},
  10. success: function(result) {
  11. if(result["error"]!= "" && result["error"] !== undefined){
  12. $("#errorBox").collapse('show');
  13. $("#errorBox_text").html(result["error"]);
  14. $('#messageBox')[0].scrollIntoView({ block: "end" });
  15. }else{
  16. //cargar datos de materias
  17. if(result["alumnos"].length > 0){//hay materias
  18. alumnosObj = result["alumnos"];
  19. }//hay materias
  20. printAlumnosDataHTML();//imprime datos de alumnos
  21. updateAll();//actualiza materias para todos
  22. printMateriasHTML();//imprime listado
  23. }
  24. },
  25. error: function(jqXHR, textStatus, errorThrown ){
  26. $("#errorBox").collapse('show');
  27. $("#errorBox_text").html(errorThrown);
  28. $('#messageBox')[0].scrollIntoView({ block: "end" });
  29. }
  30. });//
  31. }//fin hay semestre
  32. }
  33. function buscaAlumno(clave){
  34. var i;
  35. for(i = 0; i<alumnosObj.length; i++){
  36. if(alumnosObj[i].id == clave)
  37. return i;
  38. }
  39. return -1;
  40. }
  41. function buscaMateria(index, id){
  42. var i;
  43. for(i = 0; i<alumnosObj[index].matArr.length; i++){
  44. if(alumnosObj[index].matArr[i].id == id)
  45. return i;
  46. }
  47. return -1;
  48. }
  49. //{id, desc, clave, plan, sem, calif, fecha, calif_tipo, revalidada, grupo_id, grupo}]
  50. function insertaMateriaAlumno(index, id, desc, clave, plan, gpo_id, gpo){
  51. if(buscaMateria(index, id) < 0){//no está
  52. alumnosObj[index].matArr.push({id: id, desc:desc, clave:clave, plan:plan, calif:"", revalidada:false, grupo_id: gpo_id, grupo: gpo});
  53. return true;
  54. }
  55. return false;
  56. }
  57. function borraMateriaAlumno(index, id){
  58. var pos = buscaMateria(index, id);
  59. if(pos >= 0){//si está
  60. alumnosObj[index].matArr.splice(pos, 1);
  61. return true;
  62. }
  63. return false;
  64. }
  65. function buscaMateriaAll(id, arreglo){
  66. var i;
  67. for(i = 0; i<arreglo.length; i++){
  68. if(arreglo[i].id == id)
  69. return i;
  70. }
  71. return -1;
  72. }
  73. function updateAll(){
  74. var materiaArr = [];//[{id, desc, clave, plan, total}]});
  75. for(i=0; i<alumnosObj.length; i++){
  76. for(j=0; j<alumnosObj[i].matArr.length; j++){
  77. if(alumnosObj[i].matArr[j].califArr === undefined || alumnosObj[i].matArr[j].califArr.length == 0 || !alumnosObj[i].matArr[j].califArr[0].revalidada){//sólo pone materias sin calificación
  78. pos = buscaMateriaAll(alumnosObj[i].matArr[j].id, materiaArr);
  79. if(pos == -1){//no existe y no tiene calificación
  80. materiaArr.push({id: alumnosObj[i].matArr[j].id, desc: alumnosObj[i].matArr[j].desc, clave: alumnosObj[i].matArr[j].clave, plan: alumnosObj[i].matArr[j].plan, total: 1});
  81. }else{//ya existe
  82. materiaArr[pos].total++;
  83. }
  84. }
  85. }
  86. }
  87. //imprime
  88. $("#tab0 .table-asignadas tbody").html("");
  89. for(i=0; i<materiaArr.length; i++){
  90. allMateriaHTML(materiaArr[i].id, materiaArr[i].desc, materiaArr[i].clave, materiaArr[i].plan, materiaArr[i].total);
  91. }
  92. }
  93. function printAlumnosDataHTML(){
  94. for(var index=0; index < alumnosObj.length; index++){
  95. var alumno = alumnosObj[index].id;
  96. $("#tab"+alumno+" .nombre").text(alumnosObj[index].nombre);
  97. $("#tab"+alumno+" .plan").text(alumnosObj[index].plan);
  98. }
  99. }
  100. function datosMateriaHTML(desc, clave, plan, grupo){
  101. if(grupo == "")//sin grupo
  102. return '<td><b class="text-uppercase">'+desc+'</b><br>['+clave+'] '+plan+'</td>';
  103. return '<td><span class="mr-2 badge badge-secondary text-monospace">'+grupo+'</span> <b class="text-uppercase">'+desc+'</b><br>['+clave+'] '+plan+'</td>';
  104. }
  105. //Para materias cargdas. Ya pueden tener Calificación
  106. function printMateriasHTML(){
  107. for(var index=0; index < alumnosObj.length; index++){
  108. var alumno = alumnosObj[index].id;
  109. for(var m = 0; m < alumnosObj[index].matArr.length; m++){
  110. //{id, desc, clave, plan, calif, fecha, extra, revalidada}
  111. var id_mat = alumnosObj[index].matArr[m].id;
  112. var desc = alumnosObj[index].matArr[m].desc;
  113. var clave = alumnosObj[index].matArr[m].clave;
  114. var plan = alumnosObj[index].matArr[m].plan;
  115. //var extra = (alumnosObj[index].matArr[m].extra) ? 'Sí' : 'No';
  116. var revalidada = false;
  117. if(alumnosObj[index].matArr[m].califArr.length > 0 && alumnosObj[index].matArr[m].califArr[0].revalidada){
  118. revalidada = true;
  119. }
  120. alumnosObj[index].matArr[m].revalidada;
  121. var grupo = alumnosObj[index].matArr[m].grupo;
  122. var nuevaMateria ="";
  123. if(!revalidada){//No es revalidada, puede borrar
  124. nuevaMateria = '<tr id="mat_'+alumno+'_'+id_mat+'">';
  125. nuevaMateria += '<td class="text-secondary" width="80px"><a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar" data-cve="'+alumno+'" data-mat="'+id_mat+'">\
  126. <span class="ing-basura ing-fw"></span> </a></td>';
  127. nuevaMateria += datosMateriaHTML(desc, clave, plan, grupo);
  128. nuevaMateria += '<td>&nbsp;</td>';
  129. }else{
  130. nuevaMateria = '<tr style="color:#aaa">';
  131. nuevaMateria += '<td>&nbsp;</td>';
  132. nuevaMateria += datosMateriaHTML(desc, clave, plan, "");
  133. nuevaMateria += '<td><i>Equivalencia</i></td>';
  134. }
  135. nuevaMateria += '</tr>';
  136. $(nuevaMateria).appendTo("#tab"+alumno+" .table-asignadas tbody");
  137. }
  138. }
  139. }
  140. //Para concentrado de materias
  141. function allMateriaHTML(id_mat, desc, clave, plan, total){
  142. var nuevaMateria ="";
  143. nuevaMateria = '<tr>\
  144. <td class="text-secondary" width="80px"><a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar" data-cve="0" data-mat="'+id_mat+'">\
  145. <span class="ing-basura ing-fw"></span> </a></td>\
  146. '+datosMateriaHTML(desc, clave, plan, '')+'\
  147. <td>Total: '+total+'</td>\
  148. </tr>';
  149. $(nuevaMateria).appendTo("#tab0 .table-asignadas tbody");
  150. }
  151. //Para materias nuevas. No necesita Calificación y se puede borrar
  152. function creaMateriaHTML(index, id_mat, desc, clave, plan, grupo){
  153. var alumno = alumnosObj[index].id;
  154. var nuevaMateria = '<tr id="mat_'+alumno+'_'+id_mat+'">\
  155. <td class="text-secondary" width="80px"><a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar" data-cve="'+alumno+'" data-mat="'+id_mat+'">\
  156. <span class="ing-basura ing-fw"></span> </a></td>\
  157. '+datosMateriaHTML(desc, clave, plan, grupo)+'\
  158. <td>&nbsp;</td>\
  159. </tr>';
  160. $(nuevaMateria).appendTo("#tab"+alumno+" .table-asignadas tbody");
  161. }
  162. function changeAllChecks(activo){
  163. $(".selectAll").prop("checked", activo);//deselecciona general
  164. $(".select_materia").prop("checked", activo);//deselecciona cada uno
  165. $("#btn_lote").prop("disabled", !activo);//bloquea boton
  166. }
  167. function preguntarAntesDeSalir(){
  168. if (_modificado)
  169. return "¿Deseas abandonar la página? Los últimos cambios que realizaste no se guardarán";
  170. }
  171. window.onbeforeunload = preguntarAntesDeSalir;
  172. $('body').on('change', '.selectAll', function() {
  173. var check = $(this).prop("checked");
  174. $(this).parents(".table").find(".select_materia").prop("checked", check);
  175. if($(".select_materia:checked").length > 0)
  176. $("#btn_lote").prop("disabled", false);
  177. else
  178. $("#btn_lote").prop("disabled", true);
  179. });
  180. $('body').on('change', '.select_materia', function() {
  181. event.stopPropagation();
  182. //var check = $(this).prop("checked");
  183. var numberOfChecked = $(this).parents(".table").find('.select_materia:checked').length;
  184. var totalCheckboxes = $(this).parents(".table").find('.select_materia').length;
  185. if(numberOfChecked == totalCheckboxes){
  186. $(this).parents(".table").find(".selectAll").prop("checked", true);
  187. }else{
  188. $(this).parents(".table").find(".selectAll").prop("checked", false);
  189. }
  190. if($(".select_materia:checked").length > 0){
  191. $("#btn_lote").prop("disabled", false);
  192. }else{
  193. $("#btn_lote").prop("disabled", true);
  194. }
  195. });
  196. $(document).ready(function(){
  197. loadMaterias();
  198. _selected = $(".nav-pills .active").data("id");
  199. $("#btn_lote").prop("disabled", true);
  200. $("#btn_lote").click(function(){//asigna materias seleccionadas
  201. var asignadas = 0;
  202. var total = 0;
  203. if(_selected == 0){//asigna a todos
  204. for(thisIndex = 0; thisIndex<alumnosObj.length; thisIndex++){
  205. $(".select_materia:checked").each(function(index) {
  206. if(insertaMateriaAlumno(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"), $(this).data("grupo_id"), $(this).data("grupo"))){
  207. creaMateriaHTML(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"), $(this).data("grupo"));
  208. }else{
  209. asignadas++;
  210. }
  211. total++;
  212. });
  213. }
  214. //TODO imprimir listado general desde el objeto
  215. }else{
  216. thisIndex = buscaAlumno(_selected);//devuelve indice
  217. $(".select_materia:checked").each(function(index) {
  218. if(insertaMateriaAlumno(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"), $(this).data("grupo_id"), $(this).data("grupo"))){
  219. creaMateriaHTML(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"), $(this).data("grupo"));
  220. }else{
  221. asignadas++;
  222. }
  223. total++;
  224. });
  225. }
  226. _modificado = true;
  227. changeAllChecks(false);//deselecciona checks de busqueda de materias
  228. updateAll();//actualiza para todos
  229. if(asignadas > 0){
  230. $("#errorBox").collapse('show');
  231. if(_selected == 0){//asigna a todos
  232. $("#errorBox_text").html(asignadas+" materias ya está asignadas a algunos alumnos y fueron omitidas.");
  233. }else{
  234. $("#errorBox_text").html(asignadas+" materias ya está asignadas al alumno y fueron omitidas.");
  235. }
  236. }
  237. if(asignadas < total){
  238. $("#successBox").collapse('show');
  239. $("#successBox_text").html("Las materias se asignaron correctamente. Recuerda guardar los cambios");
  240. }
  241. $('#messageBox')[0].scrollIntoView({ block: "end" });
  242. });
  243. //cambia tab, cambia variable de activo
  244. $(".nav-pills .nav-link").click(function(){
  245. _selected = $(this).data("id");
  246. });
  247. $("#filter_sem").change(function(){
  248. if($("#filter_sem").val() == ""){
  249. $("#result_block").addClass("d-none");
  250. }else{
  251. $.ajax({
  252. url: './action/materiaasignar_busca.php',
  253. type: 'POST',
  254. dataType: 'json',
  255. data: { sem: $("#filter_sem").val(), plan:_plan},
  256. success: function(result) {
  257. if(result["error"]!= "" && result["error"] !== undefined){
  258. $("#errorBox").collapse('show');
  259. $("#errorBox_text").html(result["error"]);
  260. $('#messageBox')[0].scrollIntoView({ block: "end" });
  261. }else{
  262. //cargar grupos y materias
  263. if(result["materias"].length == 0){//no hay materias
  264. $("#result_block").addClass("d-none");
  265. $("#result_sin").removeClass("d-none");
  266. }else{
  267. $("#result_sin").addClass("d-none");
  268. $("#result_block").removeClass("d-none");
  269. var grupos = $("#accordion > .card").length;//cuenta bloques de grupo actuales
  270. $('#accordion .collapse').not('#grupoCollapse0').collapse('hide');
  271. if(grupos > result["materias"].length){//sobran
  272. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  273. while(grupos > result["materias"].length && grupos > 1){
  274. $("#accordion .card:last-child").remove();
  275. grupos--;
  276. }
  277. }else{//faltan
  278. // clone the rest of the rows
  279. for(var i=0; i<(result["materias"].length - grupos); i++){
  280. var cloned = $("#accordion .card:first-child").clone();//sirvió sin (true)
  281. cloned.find(".collapse").removeClass("in");
  282. cloned.find(".accordion-toggle").prop("href", "#grupoCollapse"+(i+grupos));
  283. cloned.find(".panel-collapse").prop("id", "grupoCollapse"+(i+grupos)).addClass("collapse");
  284. cloned.find(".selectAll").prop("id", "selectAll"+(i+grupos));
  285. cloned.find(".selectAll").siblings("label").prop("for", "selectAll"+(i+grupos));
  286. $("#accordion").append(cloned);
  287. }
  288. }
  289. $('#grupoCollapse0').collapse('show');
  290. if(result["materias"].length != 0){//hay grupos?
  291. $("#accordion .card").each(function(index) {
  292. if(index < result["materias"].length){//llenar info
  293. $(this).find(".grupo-nombre").text(result["materias"][index][0]["gpo"]);
  294. //clonar renglones de tabla
  295. var rows = $(this).find(".mat_asignar tr").length;//cuenta accesos actuales
  296. if(rows > result["materias"][index].length){//sobran
  297. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  298. while(rows > result["materias"][index].length && rows > 1){
  299. $(this).find(".mat_asignar tr:last-child").remove();
  300. rows--;
  301. }
  302. }else{//faltan
  303. // clone the rest of the rows
  304. for(var i=0; i<(result["materias"][index].length - rows); i++){
  305. $(this).find(".mat_asignar tr:first-child").clone(true).appendTo("#grupoCollapse"+index+" .mat_asignar");
  306. }
  307. }
  308. var index_gpo = index;
  309. $("#grupoCollapse"+index_gpo+" .mat_asignar tr").each(function(index2) {
  310. if(index2 < result["materias"][index_gpo].length){//llenar info
  311. $(this).prop("id", "mat"+result["materias"][index_gpo][index2]["id"]);
  312. $(this).data("id", result["materias"][index_gpo][index2]["id"]);
  313. $(this).find(".materia-nombre").html(result["materias"][index_gpo][index2]["desc"]);
  314. $(this).find(".materia-clave").html(result["materias"][index_gpo][index2]["clave"]);
  315. $(this).find(".materia-plan").html(result["materias"][index_gpo][index2]["plan"]);
  316. $(this).find(".select_materia").prop("id", "check"+index_gpo+"_"+result["materias"][index_gpo][index2]["id"]);
  317. $(this).find(".select_materia").val(result["materias"][index_gpo][index2]["id"]);
  318. $(this).find(".select_materia").data("id", result["materias"][index_gpo][index2]["id"])
  319. .data("desc", result["materias"][index_gpo][index2]["desc"])
  320. .data("clave", result["materias"][index_gpo][index2]["clave"])
  321. .data("plan", result["materias"][index_gpo][index2]["plan"])
  322. .data("grupo_id", result["materias"][index_gpo][index2]["gpo_id"])
  323. .data("grupo", result["materias"][index_gpo][index2]["gpo"]);
  324. $(this).find("label").prop("for", "check"+index_gpo+"_"+result["materias"][index_gpo][index2]["id"]);
  325. }
  326. });
  327. }
  328. });
  329. }
  330. }//hay materias
  331. }//sin error
  332. },
  333. error: function(jqXHR, textStatus, errorThrown ){
  334. $("#errorBox").collapse('show');
  335. $("#errorBox_text").html(errorThrown);
  336. $('#messageBox')[0].scrollIntoView({ block: "end" });
  337. }
  338. });//
  339. }//fin hay semestre
  340. }); //click
  341. //al abrir modal
  342. $("#modal_confirm").on('show.bs.modal', function (event) {
  343. var button = $(event.relatedTarget);// Button that triggered the modal
  344. $("#cve_borrar").val(button.data("cve"));
  345. $("#mat_borrar").val(button.data("mat"));
  346. if(button.data("cve") == 0)
  347. $("#all-msg").removeClass("d-none");
  348. else
  349. $("#all-msg").addClass("d-none");
  350. });
  351. $(".btn-borrar").click(function(){
  352. var pos;
  353. if($("#cve_borrar").val() == 0){//todos
  354. for(pos=0; pos<alumnosObj.length; pos++){
  355. if(borraMateriaAlumno(pos, $("#mat_borrar").val()))
  356. $('#mat_'+alumnosObj[pos].id+'_'+$("#mat_borrar").val()).remove();
  357. }
  358. }else{//uno solo
  359. pos = buscaAlumno($("#cve_borrar").val());
  360. if(borraMateriaAlumno(pos, $("#mat_borrar").val()))
  361. $('#mat_'+$("#cve_borrar").val()+'_'+$("#mat_borrar").val()).remove();
  362. }
  363. $("#modal_confirm").modal('hide');
  364. updateAll();//actualiza para todos
  365. _modificado = true;
  366. //$('#messageBox')[0].scrollIntoView({ block: "end" });
  367. });
  368. $("#btn-guardar").click(function(){
  369. $.ajax({
  370. url: './action/asignamaterias_update.php',
  371. type: 'POST',
  372. dataType: 'json',
  373. async: false,
  374. data: { json: JSON.stringify(alumnosObj)},
  375. beforeSend: function(x) {
  376. if (x && x.overrideMimeType) {
  377. x.overrideMimeType("application/j-son;charset=UTF-8");
  378. }
  379. },
  380. success: function(result) {
  381. if(result["error"]!= "" && result["error"] !== undefined){
  382. $("#errorBox").collapse('show');
  383. $("#errorBox_text").html("Error al guardar el horario.<br>"+result["error"]);
  384. }else{
  385. if(result["sin_borrar"] !== undefined && result["sin_borrar"] > 0){
  386. $("#errorBox").collapse('show');
  387. $("#errorBox_text").html(result["sin_borrar"]+" materias no pudieron ser borradas");
  388. }else if(result["aprobadas"] !== undefined && result["aprobadas"] > 0){
  389. $("#errorBox").collapse('show');
  390. $("#errorBox_text").html(result["aprobadas"]+" materias ya estaban aprobadas y no se guardaron");
  391. for(i=0; i<result["aprobadasArr"].length; i++){
  392. var pos = buscaAlumno(result["aprobadasArr"][i].usr);
  393. if(borraMateriaAlumno(pos, result["aprobadasArr"][i].mat)){
  394. $('#mat_'+result["aprobadasArr"][i].usr+'_'+result["aprobadasArr"][i].mat).remove();
  395. }
  396. }
  397. }else
  398. $("#errorBox").collapse('hide');
  399. $("#successBox").collapse('show');
  400. $("#successBox_text").html(result["ok"]);
  401. }
  402. $('#messageBox')[0].scrollIntoView({ block: "end" });
  403. _modificado = false;
  404. },
  405. error: function(jqXHR, textStatus, errorThrown ){
  406. $("#errorBox").collapse('show');
  407. $("#errorBox_text").html(errorThrown);
  408. $('#messageBox')[0].scrollIntoView({ block: "end" });
  409. }
  410. });//ajax
  411. });
  412. });