calendario.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /*
  2. * Funciones generales de horario
  3. * Necesita variables globales: _w, _h, _hora_min, _frac
  4. */
  5. //$("#dia1").position().top
  6. //$("#dia1").position().left
  7. var toast = {
  8. timer : null,
  9. show : function (message) {
  10. // SET MESSAGE + SHOW BOX
  11. document.getElementById("copy-box").innerHTML = message;
  12. document.getElementById("copy-box").style.display = "block";
  13. // RESET TIMER IF STILL RUNNING
  14. if (toast.timer != null) {
  15. clearTimeout(toast.timer);
  16. toast.timer = null;
  17. }
  18. // SET DISPLAY TIME HERE
  19. toast.timer = setTimeout(toast.hide, 1500);
  20. },
  21. hide : function () {
  22. document.getElementById("copy-box").style.display = "none";
  23. clearTimeout(toast.timer);
  24. toast.timer = null;
  25. }
  26. };
  27. function getX(dia){//recibe dia devuelve pos en la que está la celda
  28. return Math.ceil($("#dia"+dia).position().left);
  29. }
  30. function getY(dia){//recibe dia devuelve pos en la que está la celda
  31. return Math.ceil($("#dia"+dia).position().top + 30);
  32. }
  33. function getDia(x,y){//dice qué día del mes es con base a las coordenadas
  34. var col = Math.ceil(x / _w);
  35. var row = Math.ceil(y / _h);
  36. var col_1 = Math.ceil(getX(1) / _w);//pos del día 1
  37. return (7 * row) + col - col_1+1; //+1 porque no empieza en 0
  38. }
  39. function getAlto(alto){//calcula alto del bloque html
  40. return alto * _h / (60/_frac);
  41. }
  42. $(document).on( "mouseenter", ".menu-wrapper", function(){
  43. $(this).find('.menu-flotante').removeClass('d-none');
  44. });
  45. $(document).on( "mouseleave", ".menu-wrapper", function(){
  46. $(this).find('.menu-flotante').addClass('d-none');
  47. });
  48. function getIndexClase(idobj){//busca en qué posición del arreglo está el id del horario
  49. for(var i=0; i < clasesObj.length; i++){
  50. if(clasesObj[i].id_obj == idobj){
  51. return i;
  52. }
  53. }
  54. return -1;
  55. }
  56. function getObjID(id_db){//busca en qué posición del arreglo está el id del horario
  57. for(var i=0; i < clasesObj.length; i++){
  58. if(clasesObj[i].id_db == id_db){
  59. return clasesObj[i].id_obj;
  60. }
  61. }
  62. return -1;
  63. }
  64. $(document).on( "click", ".bloque-ver", function(event){
  65. var btn = $(event.target);
  66. var thisIndex = getIndexClase(btn.parents('.bloque-evento').data("id_obj"));
  67. $('#modal_ver').find('.titulo').text(clasesObj[thisIndex].titulo);
  68. $('#modal_ver').find('.fecha').text(clasesObj[thisIndex].dia);
  69. $('#modal_ver').find('.fechas_total').text(clasesObj[thisIndex].fechas_total);
  70. if(clasesObj[thisIndex].todo_dia)
  71. $('#modal_ver').find('.hora').text("Todo el día");
  72. else
  73. $('#modal_ver').find('.hora').text(clasesObj[thisIndex].hora_ini+" a "+clasesObj[thisIndex].hora_fin);
  74. if(clasesObj[thisIndex].desc != ""){
  75. $('#modal_ver').find('.desc').html(clasesObj[thisIndex].desc);
  76. $('#modal_ver').find('.desc').removeClass("d-none");
  77. }else{
  78. $('#modal_ver').find('.desc').addClass("d-none");
  79. }
  80. if(clasesObj[thisIndex].tiene_evidencia){
  81. $('#modal_ver').find('.evidencia').html(clasesObj[thisIndex].evidencia);
  82. $('#modal_ver').find('#ver_evidencia').removeClass("d-none");
  83. }else{
  84. $('#modal_ver').find('#ver_evidencia').addClass("d-none");
  85. }
  86. if(clasesObj[thisIndex].insc_ini.length > 0 && clasesObj[thisIndex].insc_fin.length > 0){
  87. $('#modal_ver').find('#ver_inscripciones').removeClass("d-none");
  88. $('#modal_ver').find('.insc_ini').text(clasesObj[thisIndex].insc_ini);
  89. $('#modal_ver').find('.insc_fin').text(clasesObj[thisIndex].insc_fin);
  90. }else{
  91. $('#modal_ver').find('#ver_inscripciones').addClass("d-none");
  92. }
  93. $('#modal_ver').find('.categoria').text(clasesObj[thisIndex].categoria_desc);
  94. $('#modal_ver').find('.categoria_color').css({color: clasesObj[thisIndex].color});
  95. var rows = $("#datos_perfil .perfil").length;//cuenta renglones actuales
  96. if(rows > 0){//existe el área de perfil
  97. if(clasesObj[thisIndex].perfiles.length == 0){
  98. $("#datos_perfil").hide();
  99. }else{
  100. $("#datos_perfil").show();
  101. //borrar renglones extra pero dejar al menos 1
  102. while(rows > 1){
  103. $("#datos_perfil .perfil:last-child").remove();
  104. rows--;
  105. }
  106. for(var i=0; i<clasesObj[thisIndex].perfiles.length; i++){
  107. var cloned = $("#datos_perfil .perfil:first-child").clone(true).appendTo("#datos_perfil");
  108. cloned.text(clasesObj[thisIndex].perfiles[i].desc);
  109. }
  110. }
  111. }
  112. $('#modal_ver').modal('show');
  113. return false;
  114. });
  115. $(document).ready(function(){
  116. //-- Calendario
  117. $('.cambia-mes').click(function(){//abre modal para crear
  118. var new_month = (parseInt($("#mes").val())+11 + $(this).data("mes"))%12 + 1; //no se puede poner % con negativos
  119. var new_year = $("#anho").val();
  120. if($(this).data("mes") < 0 && new_month == 12){//quita mes
  121. new_year--;
  122. }
  123. if($(this).data("mes") > 0 && new_month == 1){//suma mes
  124. new_year++;
  125. }
  126. $("#mes").val(new_month);
  127. $("#anho").val(new_year);
  128. $("#formaCalendario").submit();
  129. });
  130. //-- Fin calendario
  131. $('#modal_exportar').on('show.bs.modal', function (event) {
  132. changeURL();
  133. });
  134. $('#modal_exportar .perfil').change(function() {
  135. changeURL();
  136. });
  137. $('.btn-exportar').click(function(){//enviar evento nuevo
  138. if(validaExportar()){
  139. var perfilesArr = [];
  140. if($("#modal_exportar").find(".perfil").length > 0){
  141. $.each($('#modal_exportar .perfil'), function(){
  142. if($(this).prop("checked")){
  143. perfilesArr.push($(this).val());
  144. }
  145. });
  146. }else{
  147. $.each($('#modal_exportar .perfil_hidden'), function(){
  148. perfilesArr.push($(this).val());
  149. });
  150. }
  151. $('#modal_exportar').modal('hide');
  152. $("#perfiles_exportar").val(perfilesArr.toString());
  153. $("#forma_exportar").attr("action", "./export/ical_calendario.php");
  154. $("#forma_exportar").submit();
  155. }
  156. });
  157. $('.btn-pdf').click(function(){//enviar evento nuevo
  158. if(validaExportar()){
  159. var perfilesArr = [];
  160. if($("#modal_exportar").find(".perfil").length > 0){
  161. $.each($('#modal_exportar .perfil'), function(){
  162. if($(this).prop("checked")){
  163. perfilesArr.push($(this).val());
  164. }
  165. });
  166. }else{
  167. $.each($('#modal_exportar .perfil_hidden'), function(){
  168. perfilesArr.push($(this).val());
  169. });
  170. }
  171. $('#modal_exportar').modal('hide');
  172. $("#perfiles_exportar").val(perfilesArr.toString());
  173. $("#forma_exportar").attr("action", "./export/pdf_calendario.php");
  174. $("#forma_exportar").submit();
  175. }
  176. });
  177. $(".btn-copiar").click(function(){
  178. var textoCopiar = $(this).parents(".input-group").find('.texto-copiar');
  179. textoCopiar.select();
  180. document.execCommand("copy");
  181. window.getSelection().removeAllRanges();
  182. toast.show("URL copiada!");
  183. //textoCopiar.blur();
  184. });
  185. });
  186. function validaExportar(){
  187. var error = false;
  188. if($("#modal_exportar").find(".perfil").length > 0){
  189. if($("#modal_exportar").find(".perfil:checked").length == 0){
  190. error = true;
  191. $("#modal_exportar .perfil").addClass("is-invalid");
  192. $("#perfil_exportar_error").removeClass("d-none");
  193. }else{
  194. $("#perfil_exportar_error").addClass("d-none");
  195. }
  196. }
  197. return !error;
  198. }
  199. function changeURL(){
  200. var base = "http://200.13.89.48/ical.php?";
  201. if(validaExportar()){
  202. var perfilesArr = [];
  203. if($("#modal_exportar").find(".perfil").length > 0){//admon
  204. $.each($('#modal_exportar .perfil'), function(){
  205. if($(this).prop("checked")){
  206. perfilesArr.push($(this).val());
  207. }
  208. });
  209. $("#suscripcion_url").val("");
  210. $.ajax({
  211. url: './action/calendario_hash.php',
  212. type: 'POST',
  213. dataType: 'json',
  214. data: {per: $("#suscripcion_url").data("periodo"), perf: perfilesArr.toString()},
  215. success: function(result) {
  216. if(result["error"]!= "" && result["error"] !== undefined){
  217. $('#modal_categoria').modal("hide");
  218. $("#errorBox").collapse('show');
  219. $("#errorBox_text").html(result["error"]);
  220. $('#messageBox')[0].scrollIntoView({ block: "end" });
  221. }else{
  222. base = base+"valida="+result["hash"]+"&per="+$("#suscripcion_url").data("periodo")+"&perf="+perfilesArr.toString();
  223. $("#suscripcion_url").val(base)
  224. }
  225. },
  226. error: function(jqXHR, textStatus, errorThrown ){
  227. $('#modal_categoria').modal("hide");
  228. $("#errorBox").collapse('show');
  229. $("#errorBox_text").html("Error al guardar la categoría");
  230. $('#messageBox')[0].scrollIntoView({ block: "end" });
  231. }
  232. });//ajax
  233. }else{//usuario
  234. if( $("#suscripcion_url").val() == ""){
  235. $.each($('#modal_exportar .perfil_hidden'), function(){
  236. perfilesArr.push($(this).val());
  237. });
  238. $.ajax({
  239. url: './action/calendario_hash.php',
  240. type: 'POST',
  241. dataType: 'json',
  242. data: {per: $("#suscripcion_url").data("periodo"), perf: perfilesArr.toString()},
  243. success: function(result) {
  244. if(result["error"]!= "" && result["error"] !== undefined){
  245. $('#modal_categoria').modal("hide");
  246. $("#errorBox").collapse('show');
  247. $("#errorBox_text").html(result["error"]);
  248. $('#messageBox')[0].scrollIntoView({ block: "end" });
  249. }else{
  250. base = base+"valida="+result["hash"]+"&per="+$("#suscripcion_url").data("periodo")+"&perf="+perfilesArr.toString();
  251. $("#suscripcion_url").val(base)
  252. }
  253. },
  254. error: function(jqXHR, textStatus, errorThrown ){
  255. $('#modal_categoria').modal("hide");
  256. $("#errorBox").collapse('show');
  257. $("#errorBox_text").html("Error al guardar la categoría");
  258. $('#messageBox')[0].scrollIntoView({ block: "end" });
  259. }
  260. });//ajax
  261. }
  262. }
  263. $("#suscripcion_block").show();
  264. }else{
  265. $("#suscripcion_block").hide();
  266. }
  267. }
  268. function creaEventoHTML(id, posX, posY, color, texto, todo_dia, editable, total, hora_ini, insignias_total){//crea bloque HTML
  269. var edit_class = "";
  270. var repiteHTML ="";
  271. var completo_class ="";
  272. var completo_color ="";
  273. var hora_class ="";
  274. var sort=2;
  275. var hora = "";
  276. if(parseInt(todo_dia) == 1 || todo_dia == true){
  277. sort = -1;
  278. completo_color = 'background-color:'+color;
  279. completo_class = 'evento-completo';
  280. }
  281. else{
  282. var hora_arr = hora_ini.split(":");
  283. hora_class = '<span class="ing-bullet" style="color:'+color+'; margin-top:2px; font-size:80%"></span>' ;
  284. sort = parseInt(hora_arr[0]);
  285. if(sort >12){
  286. hora = sort-12;
  287. }else if(sort == 0){
  288. hora = 12;
  289. }else
  290. hora = sort;
  291. if(sort >= 12)
  292. hora = hora+"pm";
  293. else
  294. hora = hora+"am";
  295. hora = '<span class="evento-hora">'+hora+'</span>';
  296. }
  297. if(parseInt(total) > 1){ repiteHTML = '<span style="right: 4px; top:3px; position: absolute;"><span class="ing-link"></span></span>'; }
  298. if(editable === true ){edit_class = "bloque-draggable ui-draggable ui-draggable-handle";}
  299. var nuevoHorario = '<div class="bloque-evento '+edit_class+' '+completo_class+'" id="bloque_'+id+'" data-id_obj="'+id+'" data-sort="'+sort+'"\
  300. style="height:'+_block_h+'px; '+completo_color+'" >\
  301. <div class="menu-wrapper">\
  302. <p><span class="cat_ico" style="left: 4px;position: absolute;">'+hora_class+'</span>\
  303. '+hora+'<span class="title px-1" style="margin-right:13px">'+texto+'</span>'+repiteHTML+'</p>\
  304. <div class="menu-flotante d-none">\
  305. <span class="float-right iconos" >\
  306. <span class="ing-buscar ing-fw bloque-ver mx-1" aria-hidden="true" title="Ver detalle"></span>';
  307. if(editable === true /*&& insignias_total == 0*/){
  308. nuevoHorario +='<span class="ing-editar ing-fw calendario_edita mx-1" aria-hidden="true" title="Editar"></span>\
  309. <span class="ing-basura ing-fw mx-1" aria-hidden="true" data-toggle="modal" data-target="#modal_confirm" title="Borrar"></span>';
  310. }
  311. nuevoHorario +='</span>\
  312. </div>\
  313. </div>\
  314. </div>';
  315. return $(nuevoHorario);
  316. }