asignarevalidada.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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. var _min_calif = 8;//para select
  3. //carga las materias en el objeto alumnosObj
  4. function loadMaterias(){
  5. if(idArr.length > 0){
  6. $.ajax({
  7. url: './action/asignamaterias_select.php',
  8. type: 'POST',
  9. dataType: 'json',
  10. data: { idArr: idArr, plan: _plan},
  11. success: function(result) {
  12. if(result["error"]!= "" && result["error"] !== undefined){
  13. $("#errorBox").collapse('show');
  14. $("#errorBox_text").html(result["error"]);
  15. $('#messageBox')[0].scrollIntoView({ block: "end" });
  16. }else{
  17. //cargar datos de materias
  18. if(result["alumnos"].length > 0){//hay materias
  19. alumnosObj = result["alumnos"];
  20. }//hay materias
  21. printAlumnosDataHTML();//imprime datos de alumnos
  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. function insertaMateriaAlumno(index, id, desc, clave, plan){
  50. if(buscaMateria(index, id) < 0){//no está
  51. alumnosObj[index].matArr.push({id: id, desc:desc, clave:clave, plan:plan, calif:"", revalidada:true});
  52. return true;
  53. }
  54. return false;
  55. }
  56. function borraMateriaAlumno(index, id){
  57. var pos = buscaMateria(index, id);
  58. if(pos >= 0){//si está
  59. alumnosObj[index].matArr.splice(pos, 1);
  60. return true;
  61. }
  62. return false;
  63. }
  64. function printAlumnosDataHTML(){
  65. for(var index=0; index < alumnosObj.length; index++){
  66. var alumno = alumnosObj[index].id;
  67. $("#tab"+alumno+" .nombre").text(alumnosObj[index].nombre);
  68. $("#tab"+alumno+" .plan").text(alumnosObj[index].plan);
  69. }
  70. }
  71. function datosMateriaHTML(desc, clave, plan){
  72. return '<td><b class="text-uppercase">'+desc+'</b><br>['+clave+'] '+plan+'</td>';
  73. }
  74. //alumnosObj.push({id: <?php echo $cve;?>, nombre:"", plan:"", matArr:[{id, desc, clave, plan, sem, grupo_id, grupo, califArr{calif, fecha, calif_tipo, revalidada}}]});
  75. //Para materias cargdas. Ya pueden tener Calificación
  76. function printMateriasHTML(){
  77. for(var index=0; index < alumnosObj.length; index++){
  78. var alumno = alumnosObj[index].id;
  79. var nuevaMateria ="";
  80. for(var m = 0; m < alumnosObj[index].matArr.length; m++){
  81. //{id, desc, clave, plan, calif, fecha, extra, revalidada}
  82. var id_mat = alumnosObj[index].matArr[m].id;
  83. var desc = alumnosObj[index].matArr[m].desc;
  84. var clave = alumnosObj[index].matArr[m].clave;
  85. var plan = alumnosObj[index].matArr[m].plan;
  86. //var sem = alumnosObj[index].matArr[m].sem;
  87. //var califArr = alumnosObj[index].matArr[m].califArr;
  88. //var extra = (alumnosObj[index].matArr[m].extra) ? 'checked="true"' : '';
  89. nuevaMateria ="";
  90. //Sólo muestra revalidadas
  91. if(alumnosObj[index].matArr[m].califArr.length > 0 && alumnosObj[index].matArr[m].califArr[0].revalidada){
  92. nuevaMateria = '<tr class="materia" id="mat_'+alumno+'_'+id_mat+'" data-al="'+alumno+'" data-mat="'+id_mat+'">';
  93. nuevaMateria += '<td class="text-secondary" width="80px"><a href="#" tabindex="-1" data-toggle="modal" data-target="#modal_confirm" title="Borrar" data-cve="'+alumno+'" data-mat="'+id_mat+'">\
  94. <span class="ing-basura ing-fw"></span> </a></td>';
  95. nuevaMateria += datosMateriaHTML(desc, clave, plan);
  96. nuevaMateria += '<td style="width:100px;" class="text-center">\
  97. <select class="form-control text-center text-uppercase calif check-modificada" name="calif" data-clave="" data-mat="">';
  98. for(var i=10; i>=_min_calif; i--){
  99. if(i == alumnosObj[index].matArr[m].califArr[0].calif)
  100. nuevaMateria += '<option value="'+i+'" selected="selected">'+i+'</option>';
  101. else
  102. nuevaMateria += '<option value="'+i+'">'+i+'</option>';
  103. }
  104. nuevaMateria += '</select></td>';
  105. nuevaMateria += '</tr>';
  106. }else{
  107. nuevaMateria = '<tr style="color:#aaa">';
  108. nuevaMateria += '<td class="text-secondary" width="80px">&nbsp;</td>';
  109. nuevaMateria += datosMateriaHTML(desc, clave, plan);
  110. nuevaMateria += '<td style="width:100px;" class="text-center"></td>';
  111. nuevaMateria += '</tr>';
  112. }
  113. $(nuevaMateria).appendTo("#tab"+alumno+" .table-asignadas tbody");
  114. }
  115. }
  116. }
  117. //Para materias nuevas. No necesita Calificación y se puede borrar
  118. function creaMateriaHTML(index, id_mat, desc, clave, plan){
  119. var alumno = alumnosObj[index].id;
  120. var nuevaMateria ="";
  121. nuevaMateria = '<tr class="materia" id="mat_'+alumno+'_'+id_mat+'" data-al="'+alumno+'" data-mat="'+id_mat+'">';
  122. nuevaMateria += '<td class="text-secondary" width="80px"><a href="#" tabindex="-1" data-toggle="modal" data-target="#modal_confirm" title="Borrar" data-cve="'+alumno+'" data-mat="'+id_mat+'">\
  123. <span class="ing-basura ing-fw"></span> </a></td>';
  124. nuevaMateria += datosMateriaHTML(desc, clave, plan);
  125. nuevaMateria += '<td style="width:100px;" class="text-center">\
  126. <select class="form-control text-center text-uppercase calif check-modificada" name="calif" data-clave="" data-mat="">';
  127. for(var i=10; i>=_min_calif; i--){
  128. nuevaMateria += '<option value="'+i+'">'+i+'</option>';
  129. }
  130. nuevaMateria += '</select></td>';
  131. nuevaMateria += '</tr>';
  132. $(nuevaMateria).appendTo("#tab"+alumno+" .table-asignadas tbody");
  133. }
  134. function changeAllChecks(activo){
  135. $("#selectAll").prop("checked", activo);//deselecciona general
  136. $(".select_materia").prop("checked", activo);//deselecciona cada uno
  137. $("#btn_lote").prop("disabled", !activo);//bloquea boton
  138. }
  139. function preguntarAntesDeSalir(){
  140. if (_modificado)
  141. return "¿Deseas abandonar la página? Los últimos cambios que realizaste no se guardarán";
  142. }
  143. window.onbeforeunload = preguntarAntesDeSalir;
  144. $(document).on("change", ".check-modificada", function(e){
  145. _modificado = true;
  146. });
  147. $(document).ready(function(){
  148. loadMaterias();
  149. _selected = $(".nav-pills .active").data("id");
  150. $("#btn_lote").prop("disabled", true);
  151. $("#selectAll").change(function(){//selecciona materias para asignar
  152. var check = $(this).prop("checked");
  153. $(".select_materia").prop("checked", check);
  154. $("#btn_lote").prop("disabled", !check);
  155. });
  156. $(".select_materia").change(function(event){
  157. event.stopPropagation();
  158. //var check = $(this).prop("checked");
  159. var numberOfChecked = $('.select_materia:checked').length;
  160. var totalCheckboxes = $('.select_materia').length;
  161. if(numberOfChecked == totalCheckboxes){
  162. $("#selectAll").prop("checked", true);
  163. }else{
  164. $("#selectAll").prop("checked", false);
  165. }
  166. if(numberOfChecked > 0){
  167. $("#btn_lote").prop("disabled", false);
  168. }else{
  169. $("#btn_lote").prop("disabled", true);
  170. }
  171. });
  172. $("#btn_lote").click(function(){//asigna materias seleccionadas
  173. thisIndex = buscaAlumno(_selected);//devuelve indice
  174. var asignadas = 0;
  175. $(".select_materia:checked").each(function(index) {
  176. if(insertaMateriaAlumno(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"))){
  177. creaMateriaHTML(thisIndex, $(this).data("id"), $(this).data("desc"), $(this).data("clave"), $(this).data("plan"), $(this).data("plan"));
  178. _modificado = true;
  179. }else{
  180. asignadas++;
  181. }
  182. });
  183. if(asignadas > 0){
  184. $("#errorBox").collapse('show');
  185. $("#errorBox_text").html(asignadas+" materias ya está asignadas al alumno y fueron omitidas. Si no se muestra en esta pantalla, se asignó como materia regular.");
  186. }
  187. changeAllChecks(false);//deselecciona checks de busqueda de materias
  188. $("#tab"+_selected).find(".calif:enabled:visible:first").focus();
  189. $('#messageBox')[0].scrollIntoView({ block: "end" });
  190. });
  191. //cambia tab, cambia variable de activo
  192. $(".nav-pills .nav-link").click(function(){
  193. _selected = $(this).data("id");
  194. });
  195. $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  196. var clave = $(e.target).data("id");
  197. $("#tab"+clave).find(".calif:enabled:visible:first").focus();
  198. })
  199. $("#filter_sem").change(function(){
  200. if($("#filter_sem").val() == ""){
  201. $("#result_block").addClass("d-none");
  202. }else{
  203. $.ajax({
  204. url: './action/materiaasignar_all.php',
  205. type: 'POST',
  206. dataType: 'json',
  207. data: { sem: $("#filter_sem").val(), plan:_plan},
  208. success: function(result) {
  209. if(result["error"]!= "" && result["error"] !== undefined){
  210. $("#errorBox").collapse('show');
  211. $("#errorBox_text").html(result["error"]);
  212. $('#messageBox')[0].scrollIntoView({ block: "end" });
  213. }else{
  214. //cargar datos de materia
  215. var rows = $("#mat_asignar > tr").length;//cuenta accesos actuales
  216. if(result["materias"].length == 0){//no hay materias
  217. $("#result_block").addClass("d-none");
  218. $("#result_sin").removeClass("d-none");
  219. }else{
  220. $("#result_sin").addClass("d-none");
  221. //console.log(result["materias"]);
  222. $("#result_block").removeClass("d-none");
  223. if(rows > result["materias"].length){//sobran
  224. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  225. while(rows > result["materias"].length && rows > 1){
  226. $("#mat_asignar tr:last-child").remove();
  227. rows--;
  228. }
  229. }else{//faltan
  230. // clone the rest of the rows
  231. for(var i=0; i<(result["materias"].length - rows); i++){
  232. $("#mat_asignar tr:first-child").clone(true).appendTo("#mat_asignar");
  233. }
  234. }
  235. if(result["materias"].length != 0){//hay materias?
  236. $("#mat_asignar").children().each(function(index) {
  237. if(index < result["materias"].length){//llenar info
  238. $(this).prop("id", "mat"+result["materias"][index]["id"]);
  239. $(this).data("id", result["materias"][index]["id"]);
  240. $(this).find(".materia-nombre").html(result["materias"][index]["desc"]);
  241. $(this).find(".materia-clave").html(result["materias"][index]["clave"]);
  242. $(this).find(".materia-plan").html(result["materias"][index]["plan"]);
  243. $(this).find(".select_materia").prop("id", "check"+result["materias"][index]["id"]);
  244. $(this).find(".select_materia").val(result["materias"][index]["id"]);
  245. $(this).find(".select_materia").data("id", result["materias"][index]["id"]).data("desc", result["materias"][index]["desc"]).data("clave", result["materias"][index]["clave"]).data("plan", result["materias"][index]["plan"])
  246. $(this).find("label").prop("for", "check"+result["materias"][index]["id"]);
  247. }
  248. });
  249. }
  250. }//hay materias
  251. }
  252. },
  253. error: function(jqXHR, textStatus, errorThrown ){
  254. $("#errorBox").collapse('show');
  255. $("#errorBox_text").html(errorThrown);
  256. }
  257. });//
  258. }//fin hay semestre
  259. }); //click
  260. //al abrir modal
  261. $("#modal_confirm").on('show.bs.modal', function (event) {
  262. var button = $(event.relatedTarget);// Button that triggered the modal
  263. $("#cve_borrar").val(button.data("cve"));
  264. $("#mat_borrar").val(button.data("mat"));
  265. if(button.data("cve") == 0)
  266. $("#all-msg").removeClass("d-none");
  267. else
  268. $("#all-msg").addClass("d-none");
  269. });
  270. $(".btn-borrar").click(function(){
  271. var pos;
  272. if($("#cve_borrar").val() == 0){//todos
  273. for(pos=0; pos<alumnosObj.length; pos++){
  274. if(borraMateriaAlumno(pos, $("#mat_borrar").val()))
  275. $('#mat_'+alumnosObj[pos].id+'_'+$("#mat_borrar").val()).remove();
  276. }
  277. }else{//uno solo
  278. pos = buscaAlumno($("#cve_borrar").val());
  279. if(borraMateriaAlumno(pos, $("#mat_borrar").val()))
  280. $('#mat_'+$("#cve_borrar").val()+'_'+$("#mat_borrar").val()).remove();
  281. }
  282. $("#modal_confirm").modal('hide');
  283. updateAll();//actualiza para todos
  284. _modificado = true;
  285. //$('#messageBox')[0].scrollIntoView({ block: "end" });
  286. });
  287. //alumnosObj.push({id: <?php echo $cve;?>, nombre:"", plan:"", matArr:[{id, desc, clave, plan, sem, grupo_id, grupo, califArr{calif, fecha, calif_tipo, revalidada}}]});
  288. $("#btn-guardar").click(function(){
  289. //guarda calif
  290. $(".table-asignadas .materia").each(function(index) {//cada renglón
  291. var pos = buscaAlumno($(this).data("al"));
  292. var matPos = buscaMateria(pos, $(this).data("mat"));
  293. var calif = [];
  294. if($(this).find(".calif").val() != ""){
  295. calif.push({calif: $(this).find(".calif").val(), calif_tipo:1, revalidada:true});
  296. }
  297. alumnosObj[pos].matArr[matPos].califArr = calif;
  298. });
  299. $.ajax({
  300. url: './action/revalidamaterias_update.php',
  301. type: 'POST',
  302. dataType: 'json',
  303. async: false,
  304. data: { json: JSON.stringify(alumnosObj)},
  305. beforeSend: function(x) {
  306. if (x && x.overrideMimeType) {
  307. x.overrideMimeType("application/j-son;charset=UTF-8");
  308. }
  309. },
  310. success: function(result) {
  311. if(result["error"]!= "" && result["error"] !== undefined){
  312. $("#errorBox").collapse('show');
  313. $("#errorBox_text").html(result["error"]);
  314. }else{
  315. $("#errorBox").collapse('hide');
  316. }
  317. _modificado = false;
  318. $("#successBox").collapse('show');
  319. $("#successBox_text").html(result["ok"]);
  320. $('#messageBox')[0].scrollIntoView({ block: "end" });
  321. },
  322. error: function(jqXHR, textStatus, errorThrown ){
  323. $("#errorBox").collapse('show');
  324. $("#errorBox_text").html(errorThrown);
  325. $('#messageBox')[0].scrollIntoView({ block: "end" });
  326. }
  327. });//ajax
  328. });
  329. });