calendario_edicion.js 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. var _drag = false;
  2. var _editable = false;//permite editar horario o no
  3. //Obtiene el data elegido del primer Li
  4. function getDatalistFirstLiData(selector, data){
  5. var index=1;
  6. var elementRoot = $(selector).parents('.datalist');
  7. var num = elementRoot.find('ul li:not(.not-selectable)').length;
  8. if(index < num){
  9. while(elementRoot.find('ul li:nth-child('+index+')').hasClass("not-selectable") && index <= num){
  10. index++;
  11. }
  12. var element = elementRoot.find('ul li:nth-child('+index+')');
  13. return element.data(data);
  14. }
  15. }
  16. $(document).on( "change", "#todo_dia", function(event){
  17. if($(this).prop('checked')){
  18. $('#divHoras').hide();
  19. }else{
  20. $('#divHoras').show();
  21. }
  22. });
  23. $(document).on( "change", "#tiene_inscripciones", function(event){
  24. if($(this).prop('checked')){
  25. $('.divInscripcion').show();
  26. }else{
  27. $('.divInscripcion').hide();
  28. }
  29. });
  30. $(document).on( "change", "#tiene_evidencias", function(event){
  31. if($(this).prop('checked')){
  32. $('.divEvidencias').show();
  33. }else{
  34. $('.divEvidencias').hide();
  35. }
  36. });
  37. $(document).ready(function(){
  38. $('.clock').clockpicker({placement: 'top'});
  39. $(".date-picker" ).datepicker(datepickerOptions);
  40. $(".date-picker" ).datepicker( $.datepicker.regional[ "es" ] );
  41. //$('.richtext').richText();
  42. cambiaRepeticion($("#repetir").val());
  43. setDatalistFirst('#categoria');
  44. setDatalist('#puesto',12);
  45. $("#categoria_color").css("color", getDatalistFirstLiData('#categoria', 'color') );
  46. loadCalendario();
  47. $('#cat_col').colpick({
  48. layout: 'hex',
  49. submitText: '<span class="ing-aceptar ing-fw"></span>',
  50. onChange:function(hsb,hex,rgb,el,bySetColor) {
  51. $(el).val('#'+hex);
  52. },
  53. onSubmit:function(hsb,hex,rgb,el,bySetColor) {
  54. $(el).val('#'+hex);
  55. $(el).colpickHide();
  56. },
  57. onBeforeShow:function(el){
  58. $(this).colpickSetColor($(this).val(), true);
  59. }
  60. });
  61. $(".dias").change(function(){
  62. if ($(this).is(':checked')){
  63. $(this).next("label").addClass("bg-secondary text-white").removeClass("bg-info text-dark");
  64. }else {
  65. $(this).next("label").removeClass("bg-secondary text-white").addClass("bg-info text-dark");
  66. }
  67. if($("#modal").find(".dias:checked").length == 0){
  68. $("#dias_error").removeClass("d-none");
  69. }else{
  70. $("#dias_error").addClass("d-none");
  71. }
  72. });
  73. $('#dlRepetir ul li').click(function(){//cambia datalist
  74. var cid = $(this).data('id');
  75. cambiaRepeticion(cid);
  76. });
  77. $('#dlCategoria ul li').click(function(){//cambia datalist
  78. var color = $(this).data('color');
  79. $("#categoria_color").css("color", color);
  80. });
  81. $('#submitBtn').click(function(){//enviar evento nuevo
  82. var tipo = $(this).data("nuevo");
  83. if(tipo == 1)
  84. insertaEvento();
  85. else
  86. actualizaEvento();
  87. });
  88. $('#submitBtn_cat').click(function(){//enviar evento nuevo
  89. var nuevo = $(this).data("nuevo");
  90. if(trim($("#cat_desc").val()) == ""){
  91. $("#cat_desc").addClass("is-invalid");
  92. }else{
  93. $.ajax({
  94. url: './action/insigniatipo_insert.php',
  95. type: 'POST',
  96. dataType: 'json',
  97. data: {nuevo: nuevo, id: $("#cat_id").val(), desc:$("#cat_desc").val(), col:$("#cat_col").val(), general:true},
  98. success: function(result) {
  99. if(result["error"]!= "" && result["error"] !== undefined){
  100. $('#modal_categoria').modal("hide");
  101. $("#errorBox").collapse('show');
  102. $("#errorBox_text").html(result["error"]);
  103. $('#messageBox')[0].scrollIntoView({ block: "end" });
  104. }else{
  105. window.location.reload();
  106. }
  107. },
  108. error: function(jqXHR, textStatus, errorThrown ){
  109. $('#modal_categoria').modal("hide");
  110. $("#errorBox").collapse('show');
  111. $("#errorBox_text").html("Error al guardar la categoría");
  112. $('#messageBox')[0].scrollIntoView({ block: "end" });
  113. }
  114. });//ajax
  115. _editable = true;
  116. }
  117. });
  118. //editar fecha de repetición
  119. $('input[type=radio][name=cambio_fecha]').change(function() {
  120. if (this.value == 0) {//revalida
  121. $("#fecha_nueva").attr("disabled", true).addClass("input-info").removeClass("hasDatepicker");
  122. $("#hora_inicial_nueva").attr("disabled", true).addClass("input-info").removeClass("clock");
  123. $("#hora_final_nueva").attr("disabled", true).addClass("input-info").removeClass("clock");
  124. $("#fecha_nueva").parents(".form-group").find("label").addClass("disabled");
  125. $("#hora_inicial_nueva").parents(".form-group").find("label").addClass("disabled");
  126. $("#hora_inicial_nueva").parents(".form-group").addClass("text-info");
  127. }else {
  128. $("#fecha_nueva").attr("disabled", false).removeClass("input-info").addClass("hasDatepicker");
  129. $("#hora_inicial_nueva").attr("disabled", false).removeClass("input-info").addClass("clock");
  130. $("#hora_final_nueva").attr("disabled", false).removeClass("input-info").addClass("clock");
  131. $("#fecha_nueva").parents(".form-group").find("label").removeClass("disabled");
  132. $("#hora_inicial_nueva").parents(".form-group").find("label").removeClass("disabled");
  133. $("#hora_inicial_nueva").parents(".form-group").removeClass("text-info");
  134. }
  135. });
  136. $('#modal_confirm').on('show.bs.modal', function (event) {
  137. var button = $(event.relatedTarget); // Button that triggered the modal
  138. var id = button.parents(".bloque-evento").data("id_obj");
  139. if(clasesObj[id].fechas_total > 1){
  140. $("#btn-borra-todos").show();
  141. }else{
  142. $("#btn-borra-todos").hide();
  143. }
  144. $("#id_borrar").val(id);
  145. });
  146. $('.bloque-borra').click(function(e){//enviar evento nuevo
  147. var thisIndex = getIndexClase($("#id_borrar").val());
  148. var fecha = "";
  149. var hora = "";
  150. var borra_todos = $(this).data("todos");
  151. if(!borra_todos){//solo un evento
  152. fecha = clasesObj[thisIndex].fecha_orig;
  153. hora = clasesObj[thisIndex].hora_ini_orig;
  154. }
  155. $.ajax({
  156. url: './action/calendario_delete.php',
  157. type: 'POST',
  158. dataType: 'json',
  159. async: false,
  160. data: {
  161. id:clasesObj[thisIndex].id_db, insignia_id:clasesObj[thisIndex].insignia_id,
  162. fecha: fecha, hora:hora, fechas_total:clasesObj[thisIndex].fechas_total},
  163. success: function(result) {
  164. if(result["error"]!= "" && result["error"] !== undefined){
  165. $("#errorBox").collapse('show');
  166. $("#errorBox_text").html("Error al borrar el horario.<br>"+result["error"]);
  167. $('#messageBox')[0].scrollIntoView({ block: "end" });
  168. }else{
  169. /*var mat = clasesObj[thisIndex].materia;
  170. $('#bloque_'+$("#id_borrar").val()).remove();
  171. clasesObj.splice(thisIndex, 1);*/
  172. if(clasesObj[thisIndex].fechas_total == 1){//si no son todos, o solo hay 1 borra bloque
  173. $('#bloque_'+$("#id_borrar").val()).remove();
  174. clasesObj.splice(thisIndex, 1);
  175. }else{//recarga
  176. loadCalendario();
  177. }
  178. //actualizaPosiciones();
  179. }
  180. },
  181. error: function(jqXHR, textStatus, errorThrown ){
  182. $("#errorBox").collapse('show');
  183. $("#errorBox_text").html(errorThrown);
  184. $('#messageBox')[0].scrollIntoView({ block: "end" });
  185. }
  186. });//ajax
  187. $('#modal_confirm').modal("hide");
  188. });
  189. //Categorías
  190. $(".categoria_edita").click(function(e){
  191. console.log($(this).data("color"));
  192. $("#cat_id").val($(this).data("id"));
  193. $("#cat_col").val($(this).data("color"));
  194. $("#cat_desc").val($(this).data("desc"));
  195. $("#submitBtn_cat").data("nuevo", 0);
  196. $('#modal_categoria').modal('show');
  197. });
  198. //Abre modal para insertar
  199. $(".calendario_nuevo").click(function(e){
  200. //$("#repetir").val(0).change();
  201. //setDatalistFirst('#frecuencia');
  202. $("#submitBtn").data("nuevo", 1);
  203. setDatalistFirst('#repetir');
  204. cambiaRepeticion($('#repetir').val());
  205. setDatalistFirst('#de_semana');
  206. $("#modal .dias").prop("checked", false).change();
  207. $("#modal").find("input[type=text]").val("");
  208. $("#modal").find("textarea").val("");
  209. $("#modal").find("#hora_final_insc").val("23:59 ");
  210. $("#programacion").show();
  211. if($(this).data("fecha") != "" && $(this).data("fecha") !== undefined){
  212. if(validaFecha($(this).data("fecha"))){
  213. $("#fecha_inicial").val($(this).data("fecha"));
  214. }
  215. }
  216. //Borra atributos
  217. while($('#atributo-list tr').length > 1){
  218. $("#atributo-list tr:last-child").remove();
  219. }
  220. $("#atributo-list tr .atributo_select").val(0);
  221. $("#atributo-list tr .nivel_select").val(0);
  222. hideBorraAtributo();
  223. $("#avanzadoBox").collapse('hide');
  224. $("#fecha_cambio").hide();
  225. $("#errorBox").collapse('hide');
  226. $('#modal').modal('show');
  227. $("#descHelp").addClass("d-none");
  228. });
  229. $(".editable").droppable({
  230. accept: ".bloque-draggable",
  231. drop: function( event, ui ) {
  232. var left = Math.ceil($(this).position().left);
  233. var top = Math.ceil($(this).position().top);
  234. var dia = getDia(left, top);
  235. console.log(left+", "+top);
  236. console.log("dia actual "+dia);
  237. var error = false;
  238. var thisIndex = ui.draggable.data("id_obj");
  239. var fecha_nuevaArr = clasesObj[thisIndex].fecha.split("/");
  240. var fecha_nuevaStr;
  241. if(dia < 10)
  242. fecha_nuevaArr[0] = "0"+dia;
  243. else
  244. fecha_nuevaArr[0] = dia;
  245. fecha_nuevaStr = fecha_nuevaArr.join("/");
  246. if(ui.draggable.parents(".cell").data("fecha") != fecha_nuevaStr ){
  247. for(var i=0; i < clasesObj.length; i++){
  248. if(clasesObj[i].id_obj != ui.draggable.data("id_obj")){
  249. //valida si se sobreponen
  250. if(clasesObj[i].dia == dia){
  251. //mismo evento mismo día no se puede
  252. if(clasesObj[i].id_db == clasesObj[thisIndex].id_db){
  253. $("#errorBox").collapse('show');
  254. $("#errorBox_text").html("El mismo evento no puede estar 2 veces en el mismo día.");
  255. $('#messageBox')[0].scrollIntoView({ block: "end" });
  256. ui.draggable.draggable( "option", "revert", true );
  257. error = true;
  258. break;
  259. console.log("Mismo evento");
  260. }
  261. }
  262. }
  263. }
  264. if(!error){
  265. ui.draggable.appendTo("#dia"+dia+" .calendario_eventos");
  266. $("#dia"+dia).find(".bloque-evento").sort(function (a, b) {
  267. var contentA =parseInt( $(a).data('sort'));
  268. var contentB =parseInt( $(b).data('sort'));
  269. return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;
  270. }).appendTo($("#dia"+dia).find(".calendario_eventos"));
  271. var eventoObj = {
  272. id_db: clasesObj[thisIndex].id_db,
  273. fecha_orig: clasesObj[thisIndex].fecha_orig,
  274. fecha_nueva: fecha_nuevaStr,
  275. todo_dia: clasesObj[thisIndex].todo_dia,
  276. hora_ini: clasesObj[thisIndex].hora_ini,
  277. hora_fin: clasesObj[thisIndex].hora_fin
  278. };
  279. //Edita base de datos
  280. var page = './action/calendariodia_update.php';
  281. console.log("Call ajax update");
  282. $.ajax({
  283. url: page,
  284. type: 'POST',
  285. dataType: 'json',
  286. async: false,
  287. data: {json: JSON.stringify(eventoObj)},
  288. beforeSend: function(x) {
  289. if (x && x.overrideMimeType) {
  290. x.overrideMimeType("application/j-son;charset=UTF-8");
  291. }
  292. },
  293. success: function(result) {
  294. if(result["error"]!= "" && result["error"] !== undefined){
  295. $("#errorBox").collapse('show');
  296. $("#errorBox_text").html("Error al guardar el evento.<br>"+result["error"]);
  297. $('#messageBox')[0].scrollIntoView({ block: "end" });
  298. }else{
  299. clasesObj[thisIndex].dia = dia;
  300. clasesObj[thisIndex].fecha = fecha_nuevaStr
  301. $("#errorBox").collapse('hide');
  302. }
  303. },
  304. error: function(jqXHR, textStatus, errorThrown ){
  305. $("#errorBox").collapse('show');
  306. $("#errorBox_text").html("Error al guardar el evento");
  307. $('#messageBox')[0].scrollIntoView({ block: "end" });
  308. }
  309. });//ajax
  310. }//fin no error
  311. }//fin fechas diferentes
  312. }
  313. });
  314. $("#agrega-atributo").click(function(){
  315. var cloned = $("#atributo-list >tr:first-child").clone(true).appendTo("#atributo-list");
  316. cloned.find('select').get(0).selectedIndex = 0;
  317. hideBorraAtributo();
  318. });
  319. $(".borra-atributo").click(function(){//quita profesor
  320. $(this).parents("tr").remove();
  321. hideBorraAtributo();
  322. });
  323. });
  324. function hideBorraAtributo(){
  325. var total = $("#atributo-list >tr").length;//cuenta renglones actuales
  326. if(total == 1){
  327. $('.borra-atributo').hide();
  328. }else{
  329. $('.borra-atributo').show();
  330. }
  331. }
  332. $(document).on( "click", ".calendario_edita", function(event){
  333. $("#submitBtn").data("nuevo", 0);
  334. $("#programacion").hide();
  335. //Carga datos previos para edición
  336. var btn = $(event.target);
  337. var thisIndex = getIndexClase(btn.parents('.bloque-evento').data("id_obj"));
  338. $('#id_db').val(clasesObj[thisIndex].id_db);
  339. $('#insignia_id').val(clasesObj[thisIndex].insignia_id);
  340. $('#titulo').val(clasesObj[thisIndex].titulo);
  341. //$('#desc').val(clasesObj[thisIndex].desc);
  342. tinymce.get('desc').setContent(clasesObj[thisIndex].desc);
  343. setDatalist("#categoria", clasesObj[thisIndex].insignia_tipo);
  344. $("#categoria_color").css("color", clasesObj[thisIndex].color );
  345. setDatalist("#puesto", clasesObj[thisIndex].puesto);
  346. $("#fecha_original").val(clasesObj[thisIndex].fecha_orig);
  347. $("#fecha_nueva").val(clasesObj[thisIndex].fecha);
  348. $("#todo_dia_nueva").val(clasesObj[thisIndex].todo_dia);
  349. if(clasesObj[thisIndex].todo_dia){
  350. $("#divHoras_nueva").hide();
  351. }else{
  352. $("#divHoras_nueva").show();
  353. $("#hora_inicial_nueva").val(clasesObj[thisIndex].hora_ini);
  354. $("#hora_final_nueva").val(clasesObj[thisIndex].hora_fin);
  355. }
  356. $("#fecha_cambio").show();
  357. $("#cambio_fecha_no").prop("checked", true).change();
  358. //Atributos
  359. //$.each($('#atributo-list tr'),
  360. while($('#atributo-list tr').length > 1){
  361. $("#atributo-list tr:last-child").remove();
  362. }
  363. if(clasesObj[thisIndex].atributos.length > 0){
  364. for(var i=0; i<clasesObj[thisIndex].atributos.length; i++){
  365. var cloned;
  366. if(i==0){
  367. cloned = $("#atributo-list tr:first-child");
  368. }else{
  369. cloned = $("#atributo-list tr:first-child").clone(true).appendTo("#atributo-list");
  370. }
  371. cloned.find(".atributo_select").val(clasesObj[thisIndex].atributos[i].id);
  372. cloned.find(".nivel_select").val(clasesObj[thisIndex].atributos[i].nivel);
  373. }
  374. $("#avanzadoBox").collapse('show');
  375. }else{
  376. $("#avanzadoBox").collapse('hide');
  377. }
  378. hideBorraAtributo();
  379. //inscripciones y evidencias
  380. if(clasesObj[thisIndex].insc_ini.length > 0 && clasesObj[thisIndex].insc_fin.length > 0){
  381. $('#tiene_inscripciones').bootstrapToggle('on');
  382. $("#fecha_insc_ini").val(clasesObj[thisIndex].insc_ini);
  383. $("#fecha_insc_fin").val(clasesObj[thisIndex].insc_fin);
  384. $("#hora_final_insc").val(clasesObj[thisIndex].insc_hora_fin);
  385. }else{
  386. $('#tiene_inscripciones').bootstrapToggle('off');
  387. $("#fecha_insc_ini").val("");
  388. $("#fecha_insc_fin").val("");
  389. $("#hora_final_insc").val("23:59");
  390. }
  391. if(clasesObj[thisIndex].tiene_evidencia){
  392. $('#tiene_evidencias').bootstrapToggle('on');
  393. $('#evidencias').val(clasesObj[thisIndex].evidencia);
  394. }else{
  395. $('#tiene_evidencias').bootstrapToggle('off');
  396. $('#evidencias').val("");
  397. }
  398. $("#errorBox").collapse('hide');
  399. $('#modal').modal('show');
  400. });
  401. function cambiaRepeticion(val){
  402. switch(parseInt(val)){
  403. case 0://unico
  404. $(".rep-diario").hide();
  405. $(".rep-semana").hide();
  406. $(".rep-mes").hide();
  407. break;
  408. case 1://diario
  409. $(".rep-semana").hide();
  410. $(".rep-mes").hide();
  411. $(".rep-diario").show();
  412. //$("#cada_texto").html("Día(s)");
  413. break;
  414. case 2://semanal
  415. $(".rep-diario").hide();
  416. $(".rep-mes").hide();
  417. $(".rep-semana").show();
  418. //$("#cada_texto").html("Semana(s)");
  419. break;
  420. case 3://mensual
  421. $(".rep-diario").hide();
  422. $(".rep-semana").hide();
  423. $(".rep-mes").show();
  424. //$("#cada_texto").html("Mes(es)");
  425. break;
  426. }
  427. }
  428. function insertaEvento(){
  429. if(validaEvento(true)){
  430. //Carga la información a un objeto de JS
  431. var rruleObj = {
  432. rep: $("#repetir").val(),
  433. intervalo: 1,
  434. dias: getDiasStr(),
  435. semana: $("#de_semana").val(),
  436. fecha_fin: $("#fecha_final").val()
  437. };
  438. var periodo = 0;
  439. if($("#periodo_actual").prop("checked")){
  440. periodo = parseInt($("#periodo_actual").val());
  441. }
  442. var atributosArr = [];
  443. $.each($('#atributo-list tr'), function(){
  444. atributosArr.push({"id": $(this).find(".atributo_select").val(), "nivel": $(this).find(".nivel_select").val()});
  445. });
  446. var eventoObj = {
  447. id_obj: id_obj,
  448. id_db: 0,
  449. periodo: periodo,
  450. tipo: parseInt($("#categoria").val()),
  451. titulo: trim($("#titulo").val()),
  452. desc: tinymce.get("desc").getContent(),//trim($("#desc").val()),
  453. fecha_ini: $("#fecha_inicial").val(),
  454. todo_dia: $("#todo_dia").prop("checked"),
  455. hora_ini: $("#hora_inicial").val(),
  456. hora_fin: $("#hora_final").val(),
  457. icono: "",
  458. puesto: $("#puesto").val(),
  459. tiene_evidencia: $("#tiene_evidencias").prop("checked"),
  460. evidencia: trim($("#evidencias").val()),
  461. tiene_inscripciones: $("#tiene_inscripciones").prop("checked"),
  462. insc_ini: $("#fecha_insc_ini").val(),
  463. insc_fin: $("#fecha_insc_fin").val(),
  464. insc_hora_fin: $("#hora_final_insc").val(),
  465. //tiene_evidencia: false,
  466. //tiene_inscripciones: false,
  467. atributos: atributosArr
  468. };
  469. if(parseInt($("#repetir").val()) != 0){
  470. eventoObj.rrule = rruleObj;
  471. }
  472. console.log(eventoObj);
  473. //Manda objeto JS por ajax a insertar
  474. if(insertEvento(eventoObj, true)){
  475. //id_obj++;
  476. loadCalendario();//recarga todo
  477. }
  478. $('#modal').modal('hide');
  479. }
  480. }
  481. function actualizaEvento(){
  482. if(validaEvento(false)){
  483. //Carga la información a un objeto de JS
  484. var perfilesArr = [];
  485. $.each($('#modal .perfil'), function(){
  486. if($(this).prop("checked")){
  487. perfilesArr.push($(this).val());
  488. }
  489. });
  490. var periodo = 0;
  491. if($("#periodo_actual").prop("checked")){
  492. periodo = parseInt($("#periodo_actual").val());
  493. }
  494. var atributosArr = [];
  495. $.each($('#atributo-list tr'), function(){
  496. atributosArr.push({"id": $(this).find(".atributo_select").val(), "nivel": $(this).find(".nivel_select").val()});
  497. });
  498. var eventoObj = {
  499. id_db: parseInt($("#id_db").val()),
  500. periodo: periodo,
  501. tipo: parseInt($("#categoria").val()),
  502. titulo: trim($("#titulo").val()),
  503. desc: trim(tinymce.get("desc").getContent()), //trim($("#desc").val()),
  504. cambio_fecha: $("#cambio_fecha_si").prop("checked"),
  505. fecha_nueva: $("#fecha_nueva").val(),
  506. fecha_orig: $("#fecha_original").val(),
  507. todo_dia: $("#todo_dia_nueva").val(),
  508. hora_ini: $("#hora_inicial_nueva").val(),
  509. hora_fin: $("#hora_final_nueva").val(),
  510. color: $("#categoria_color").css("color"),
  511. icono: "",
  512. insignia_id: $("#insignia_id").val(),
  513. puesto: $("#puesto").val(),
  514. tiene_evidencia: $("#tiene_evidencias").prop("checked"),
  515. evidencia: trim($("#evidencias").val()),
  516. tiene_inscripciones: $("#tiene_inscripciones").prop("checked"),
  517. insc_ini: $("#fecha_insc_ini").val(),
  518. insc_fin: $("#fecha_insc_fin").val(),
  519. insc_hora_fin: $("#hora_final_insc").val(),
  520. //tiene_evidencia: false,
  521. //tiene_inscripciones: false,
  522. atributos: atributosArr,
  523. };
  524. console.log(eventoObj);
  525. //Manda objeto JS por ajax a insertar
  526. if(insertEvento(eventoObj, false)){
  527. if(eventoObj.cambio_fecha)
  528. loadCalendario();//recarga todo
  529. else{
  530. var id = getObjID(eventoObj.id_db);
  531. if(id>=0){
  532. $("#bloque_"+id).find(".title").text(eventoObj.titulo);
  533. if( eventoObj.todo_dia == true || eventoObj.todo_dia == "true" ){
  534. $("#bloque_"+id).css({"background-color":eventoObj.color});
  535. }else{
  536. $("#bloque_"+id).find(".cat_ico .ing-bullet").css({"color":eventoObj.color});
  537. }
  538. }
  539. var index = getIndexClase(id);
  540. clasesObj[index].titulo = eventoObj.titulo;
  541. clasesObj[index].desc = eventoObj.desc;
  542. clasesObj[index].color = eventoObj.color;
  543. clasesObj[index].insignia_tipo = eventoObj.tipo;
  544. clasesObj[index].periodo = eventoObj.periodo;
  545. clasesObj[index].perfiles = [];
  546. $.each($('#modal .perfil'), function(){
  547. if($(this).prop("checked")){
  548. clasesObj[index].perfiles.push({id:$(this).val(), desc: $(this).siblings("label").text()});
  549. }
  550. });
  551. atributosArr = [];
  552. $.each($('#atributo-list tr'), function(){
  553. if($(this).find(".atributo_select").val() != 0)
  554. atributosArr.push({"id": $(this).find(".atributo_select").val(), "nivel": $(this).find(".nivel_select").val()});
  555. });
  556. clasesObj[index].atributos = atributosArr;
  557. /*
  558. clasesObj[index].puesto = ;
  559. clasesObj[index].tiene_evidencia = ;
  560. clasesObj[index].evidencia = ;
  561. clasesObj[index].insc_ini = ;
  562. clasesObj[index].insc_fin = ;
  563. clasesObj[index].insc_hora_fin = ;*/
  564. }
  565. }else{
  566. console.log("No insertado");
  567. }
  568. $('#modal').modal('hide');
  569. }
  570. }
  571. function validaEvento(nuevo){
  572. var error = false;
  573. $("#modal").find(".is-invalid").removeClass("is-invalid");
  574. if(trim($("#titulo").val()) == ""){
  575. error = true;
  576. $("#titulo").addClass("is-invalid");
  577. }
  578. if(trim(tinymce.get("desc").getContent()) == ""){
  579. error = true;
  580. $("#descHelp").removeClass("d-none");
  581. }
  582. if(nuevo){
  583. if(!validaFecha($("#fecha_inicial").val())){
  584. error = true;
  585. $("#fecha_inicial").addClass("is-invalid");
  586. }
  587. if(!($("#todo_dia").prop("checked"))){
  588. if( trim($("#hora_inicial").val()) == "") {
  589. error = true;
  590. $("#hora_inicial").addClass("is-invalid");
  591. }
  592. if(trim($("#hora_final").val()) == "" ) {
  593. error = true;
  594. $("#hora_final").addClass("is-invalid");
  595. }
  596. if(!error && cuentaMinutosStr( trim($("#hora_inicial").val()), trim($("#hora_final").val()) ) <= 0 ){
  597. error = true;
  598. //$("#hora_inicial").addClass("is-invalid");
  599. $("#hora_final").addClass("is-invalid");
  600. }
  601. }
  602. if($("#repetir").val() > 0){//no diario
  603. if(!validaFecha($("#fecha_final").val())){
  604. error = true;
  605. $("#fecha_final").addClass("is-invalid");
  606. }
  607. if(!error && fechaMayor($('#fecha_inicial').val(), $('#fecha_final').val()) >= 0){
  608. error = true;
  609. $("#fecha_final").addClass("is-invalid");
  610. }
  611. }
  612. if($("#repetir").val() >= 2){//semanal o mensual
  613. if($("#modal").find(".dias:checked").length == 0){
  614. error = true;
  615. $("#dias_error").removeClass("d-none");
  616. }else{
  617. $("#dias_error").addClass("d-none");
  618. }
  619. }
  620. }
  621. if($("#tiene_inscripciones").prop("checked")){
  622. if(!validaFecha($("#fecha_insc_ini").val())){
  623. error = true;
  624. $("#fecha_insc_ini").addClass("is-invalid");
  625. }
  626. if(!validaFecha($("#fecha_insc_fin").val())){
  627. error = true;
  628. $("#fecha_insc_fin").addClass("is-invalid");
  629. }
  630. if(!error && fechaMayor($('#fecha_insc_ini').val(), $('#fecha_insc_fin').val()) >= 0){
  631. error = true;
  632. $("#fecha_insc_fin").addClass("is-invalid");
  633. }
  634. }
  635. if($("#tiene_evidencias").prop("checked")){
  636. //if(tinyMCE.get('evidencias').getContent() == ""){
  637. if(trim($('#evidencias').val()) == ""){
  638. error = true;
  639. $("#evidencias").addClass("is-invalid");
  640. }
  641. }
  642. return !error;
  643. }
  644. function getDiasStr(){
  645. var str = "";
  646. $.each($('#dias_block .dias'), function(){
  647. if($(this).prop("checked")){
  648. str+=$(this).val()+",";
  649. }
  650. });
  651. if(str.length > 0){
  652. str = str.substr(0, str.length-1)
  653. }
  654. return str;
  655. }
  656. //funcion para guardar por ajax información
  657. function insertEvento(objClase, insert){
  658. _editable = false;
  659. //console.log(objClase);
  660. var page = './action/calendario_insert.php';
  661. if(!insert)
  662. page = './action/calendario_update.php';
  663. var state = false;
  664. $.ajax({
  665. url: page,
  666. type: 'POST',
  667. dataType: 'json',
  668. async: false,
  669. data: {json: JSON.stringify(objClase)},
  670. beforeSend: function(x) {
  671. if (x && x.overrideMimeType) {
  672. x.overrideMimeType("application/j-son;charset=UTF-8");
  673. }
  674. },
  675. success: function(result) {
  676. if(result["error"]!= "" && result["error"] !== undefined){
  677. $("#errorBox").collapse('show');
  678. $("#errorBox_text").html("Error al guardar el evento.<br>"+result["error"]);
  679. $('#messageBox')[0].scrollIntoView({ block: "end" });
  680. state = false;
  681. }else{
  682. state = true;
  683. //objClase.id_db = result["id"];
  684. $("#errorBox").collapse('hide');
  685. }
  686. },
  687. error: function(jqXHR, textStatus, errorThrown ){
  688. $("#errorBox").collapse('show');
  689. $("#errorBox_text").html("Error al guardar el evento");
  690. $('#messageBox')[0].scrollIntoView({ block: "end" });
  691. state = false;
  692. }
  693. });//ajax
  694. _editable = true;
  695. return state;
  696. }
  697. function makeDraggable() {
  698. $(".bloque-draggable").draggable({
  699. cursor: "move",
  700. containment:".area-horario",
  701. scroll:false,
  702. grid: [_w, _h],
  703. revert : true,
  704. helper: "clone",
  705. revertDuration: 0,
  706. start: function( event, ui ) {
  707. _drag = true;
  708. $(this).css("opacity", "0.35");
  709. },
  710. stop: function( event, ui ) {
  711. $(this).css("opacity", "");
  712. _drag = false;
  713. }
  714. });
  715. }
  716. function loadCalendario(){
  717. $('.bloque-evento').remove();
  718. clasesObj = [];
  719. id_obj = 0;
  720. loadHorario();//carga horarios editables del grupo
  721. }
  722. function loadHorario(){
  723. //carga horarios y crea bloques}
  724. //console.log("loadHorario");
  725. $.ajax({
  726. url: './action/calendario_select.php',
  727. type: 'POST',
  728. dataType: 'json',
  729. data: { mes: $("#mes").val(), anho: $("#anho").val(), perfiles: _perfiles},
  730. success: function(result) {
  731. if(result["error"]!= "" && result["error"] !== undefined){
  732. //console.log("Ocurrió un error de load");
  733. $("#errorBox").collapse('show');
  734. $("#errorBox_text").html(result["error"]);
  735. $('#messageBox')[0].scrollIntoView({ block: "end" });
  736. }else{
  737. var i;
  738. for(i = 0; i< result["eventos"].length; i++){
  739. var evento = {
  740. id_obj: id_obj,
  741. id_db: parseInt(result["eventos"][i]["id_db"]),
  742. titulo: result["eventos"][i]["titulo"],
  743. desc: result["eventos"][i]["desc"],
  744. insignia_tipo: result["eventos"][i]["insignia"]["tipo"],
  745. insignia_desc: result["eventos"][i]["insignia"]["tipo_desc"],
  746. color: result["eventos"][i]["insignia"]["tipo_color"],
  747. dia: parseInt(result["eventos"][i]["dia"]),
  748. dia_orig: parseInt(result["eventos"][i]["dia"]),
  749. fechas_total: result["eventos"][i]["fechas_total"],
  750. fecha_orig: result["eventos"][i]["fecha_orig"],
  751. fecha: result["eventos"][i]["fecha"],
  752. todo_dia: result["eventos"][i]["todo_dia"],
  753. hora_ini_orig: result["eventos"][i]["hora_ini_orig"],
  754. hora_ini: result["eventos"][i]["hora_ini"],
  755. hora_fin: result["eventos"][i]["hora_fin"],
  756. editable: result["eventos"][i]["editable"],
  757. inscripciones: result["eventos"][i]["inscripciones"],
  758. periodo: result["eventos"][i]["periodo"],
  759. perfiles: result["eventos"][i]["perfiles"],//arreglo
  760. insignia_id: result["eventos"][i]["insignia"]["insignia_id"],
  761. puesto: result["eventos"][i]["insignia"]["puesto_desc"],
  762. tiene_evidencia: result["eventos"][i]["insignia"]["tiene_evidencia"],
  763. evidencia: result["eventos"][i]["insignia"]["evidencia"],
  764. insc_ini: result["eventos"][i]["insignia"]["insc_ini"],
  765. insc_fin: result["eventos"][i]["insignia"]["insc_fin"],
  766. insc_hora_fin: result["eventos"][i]["insignia"]["insc_hora_fin"],
  767. atributos: result["eventos"][i]["atributos"], //arreglo
  768. insignias_total: result["eventos"][i]["insignias_total"],
  769. };
  770. clasesObj.push(evento);
  771. var editable = true;
  772. if(/*evento.inscripciones ||*/ !evento.editable){
  773. editable = false;
  774. }
  775. //creaEventoHTML(id_obj, getX(evento.dia), getY(evento.dia), evento.color, evento.titulo, evento.todo_dia, editable, evento.fechas_total);
  776. var eventoHTML = creaEventoHTML(id_obj, getX(evento.dia), getY(evento.dia), evento.color, evento.titulo, evento.todo_dia, editable, evento.fechas_total, evento.hora_ini, evento.insignias_total);
  777. $("#dia"+evento.dia).find(".calendario_eventos").append(eventoHTML);
  778. id_obj++;
  779. $("#dia"+evento.dia).find(".bloque-evento").sort(function (a, b) {
  780. var contentA =parseInt( $(a).data('sort'));
  781. var contentB =parseInt( $(b).data('sort'));
  782. return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;
  783. }).appendTo($("#dia"+evento.dia).find(".calendario_eventos"));
  784. }
  785. makeDraggable();
  786. }//fin else
  787. },
  788. error: function(jqXHR, textStatus, errorThrown ){
  789. $("#errorBox").collapse('show');
  790. $("#errorBox_text").html("Error al cargar horario.<br>"+errorThrown);
  791. $('#messageBox')[0].scrollIntoView({ block: "end" });
  792. //alert("ERROR! " + textStatus+ " - "+errorThrown);
  793. _editable = true;
  794. }
  795. });//ajax
  796. }