calendario.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  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. $('#modal_ver').find('.categoria').text(clasesObj[thisIndex].categoria_desc);
  81. $('#modal_ver').find('.categoria_color').css({color: clasesObj[thisIndex].color});
  82. var rows = $("#datos_perfil .perfil").length;//cuenta renglones actuales
  83. if(rows > 0){//existe el área de perfil
  84. if(clasesObj[thisIndex].perfiles.length == 0){
  85. $("#datos_perfil").hide();
  86. }else{
  87. $("#datos_perfil").show();
  88. //borrar renglones extra pero dejar al menos 1
  89. while(rows > 1){
  90. $("#datos_perfil .perfil:last-child").remove();
  91. rows--;
  92. }
  93. for(var i=0; i<clasesObj[thisIndex].perfiles.length; i++){
  94. var cloned = $("#datos_perfil .perfil:first-child").clone(true).appendTo("#datos_perfil");
  95. cloned.text(clasesObj[thisIndex].perfiles[i].desc);
  96. }
  97. }
  98. }
  99. $('#modal_ver').modal('show');
  100. return false;
  101. });
  102. $(document).ready(function(){
  103. //-- Calendario
  104. $('.cambia-mes').click(function(){//abre modal para crear
  105. var new_month = (parseInt($("#mes").val())+11 + $(this).data("mes"))%12 + 1; //no se puede poner % con negativos
  106. var new_year = $("#anho").val();
  107. if($(this).data("mes") < 0 && new_month == 12){//quita mes
  108. new_year--;
  109. }
  110. if($(this).data("mes") > 0 && new_month == 1){//suma mes
  111. new_year++;
  112. }
  113. $("#mes").val(new_month);
  114. $("#anho").val(new_year);
  115. $("#formaCalendario").submit();
  116. });
  117. //-- Fin calendario
  118. $('#modal_exportar').on('show.bs.modal', function (event) {
  119. changeURL();
  120. });
  121. $('#modal_exportar .perfil').change(function() {
  122. changeURL();
  123. });
  124. $('.btn-exportar').click(function(){//enviar evento nuevo
  125. if(validaExportar()){
  126. var perfilesArr = [];
  127. if($("#modal_exportar").find(".perfil").length > 0){
  128. $.each($('#modal_exportar .perfil'), function(){
  129. if($(this).prop("checked")){
  130. perfilesArr.push($(this).val());
  131. }
  132. });
  133. }else{
  134. $.each($('#modal_exportar .perfil_hidden'), function(){
  135. perfilesArr.push($(this).val());
  136. });
  137. }
  138. $('#modal_exportar').modal('hide');
  139. $("#perfiles_exportar").val(perfilesArr.toString());
  140. $("#forma_exportar").attr("action", "./export/ical_calendario.php");
  141. $("#forma_exportar").submit();
  142. }
  143. });
  144. $('.btn-pdf').click(function(){//enviar evento nuevo
  145. if(validaExportar()){
  146. var perfilesArr = [];
  147. if($("#modal_exportar").find(".perfil").length > 0){
  148. $.each($('#modal_exportar .perfil'), function(){
  149. if($(this).prop("checked")){
  150. perfilesArr.push($(this).val());
  151. }
  152. });
  153. }else{
  154. $.each($('#modal_exportar .perfil_hidden'), function(){
  155. perfilesArr.push($(this).val());
  156. });
  157. }
  158. $('#modal_exportar').modal('hide');
  159. $("#perfiles_exportar").val(perfilesArr.toString());
  160. $("#forma_exportar").attr("action", "./export/pdf_calendario.php");
  161. $("#forma_exportar").submit();
  162. }
  163. });
  164. $(".btn-copiar").click(function(){
  165. var textoCopiar = $(this).parents(".input-group").find('.texto-copiar');
  166. textoCopiar.select();
  167. document.execCommand("copy");
  168. window.getSelection().removeAllRanges();
  169. toast.show("URL copiada!");
  170. //textoCopiar.blur();
  171. });
  172. });
  173. function validaExportar(){
  174. var error = false;
  175. if($("#modal_exportar").find(".perfil").length > 0){
  176. if($("#modal_exportar").find(".perfil:checked").length == 0){
  177. error = true;
  178. $("#modal_exportar .perfil").addClass("is-invalid");
  179. $("#perfil_exportar_error").removeClass("d-none");
  180. }else{
  181. $("#perfil_exportar_error").addClass("d-none");
  182. }
  183. }
  184. return !error;
  185. }
  186. function changeURL(){
  187. var base = "http://200.13.89.48/ical.php?";
  188. if(validaExportar()){
  189. var perfilesArr = [];
  190. if($("#modal_exportar").find(".perfil").length > 0){//admon
  191. $.each($('#modal_exportar .perfil'), function(){
  192. if($(this).prop("checked")){
  193. perfilesArr.push($(this).val());
  194. }
  195. });
  196. $("#suscripcion_url").val("");
  197. $.ajax({
  198. url: './action/calendario_hash.php',
  199. type: 'POST',
  200. dataType: 'json',
  201. data: {per: $("#suscripcion_url").data("periodo"), perf: perfilesArr.toString()},
  202. success: function(result) {
  203. if(result["error"]!= "" && result["error"] !== undefined){
  204. $('#modal_categoria').modal("hide");
  205. $("#errorBox").collapse('show');
  206. $("#errorBox_text").html(result["error"]);
  207. $('#messageBox')[0].scrollIntoView({ block: "end" });
  208. }else{
  209. base = base+"valida="+result["hash"]+"&per="+$("#suscripcion_url").data("periodo")+"&perf="+perfilesArr.toString();
  210. $("#suscripcion_url").val(base)
  211. }
  212. },
  213. error: function(jqXHR, textStatus, errorThrown ){
  214. $('#modal_categoria').modal("hide");
  215. $("#errorBox").collapse('show');
  216. $("#errorBox_text").html("Error al guardar la categoría");
  217. $('#messageBox')[0].scrollIntoView({ block: "end" });
  218. }
  219. });//ajax
  220. }else{//usuario
  221. if( $("#suscripcion_url").val() == ""){
  222. $.each($('#modal_exportar .perfil_hidden'), function(){
  223. perfilesArr.push($(this).val());
  224. });
  225. $.ajax({
  226. url: './action/calendario_hash.php',
  227. type: 'POST',
  228. dataType: 'json',
  229. data: {per: $("#suscripcion_url").data("periodo"), perf: perfilesArr.toString()},
  230. success: function(result) {
  231. if(result["error"]!= "" && result["error"] !== undefined){
  232. $('#modal_categoria').modal("hide");
  233. $("#errorBox").collapse('show');
  234. $("#errorBox_text").html(result["error"]);
  235. $('#messageBox')[0].scrollIntoView({ block: "end" });
  236. }else{
  237. base = base+"valida="+result["hash"]+"&per="+$("#suscripcion_url").data("periodo")+"&perf="+perfilesArr.toString();
  238. $("#suscripcion_url").val(base)
  239. }
  240. },
  241. error: function(jqXHR, textStatus, errorThrown ){
  242. $('#modal_categoria').modal("hide");
  243. $("#errorBox").collapse('show');
  244. $("#errorBox_text").html("Error al guardar la categoría");
  245. $('#messageBox')[0].scrollIntoView({ block: "end" });
  246. }
  247. });//ajax
  248. }
  249. }
  250. $("#suscripcion_block").show();
  251. }else{
  252. $("#suscripcion_block").hide();
  253. }
  254. }
  255. function creaEventoHTML(id, posX, posY, color, texto, todo_dia, editable, total, hora_ini){//crea bloque HTML
  256. var edit_class = "";
  257. var repiteHTML ="";
  258. var completo_class ="";
  259. var completo_color ="";
  260. var hora_class ="";
  261. var sort=2;
  262. var hora = "";
  263. if(parseInt(todo_dia) == 1 || todo_dia == true){
  264. sort = -1;
  265. completo_color = 'background-color:'+color;
  266. completo_class = 'evento-completo';
  267. }
  268. else{
  269. var hora_arr = hora_ini.split(":");
  270. hora_class = '<span class="ing-bullet" style="color:'+color+'; margin-top:2px; font-size:80%"></span>' ;
  271. sort = parseInt(hora_arr[0]);
  272. if(sort >12){
  273. hora = sort-12;
  274. }else if(sort == 0){
  275. hora = 12;
  276. }else
  277. hora = sort;
  278. if(sort >= 12)
  279. hora = hora+"pm";
  280. else
  281. hora = hora+"am";
  282. hora = '<span class="evento-hora">'+hora+'</span>';
  283. }
  284. if(parseInt(total) > 1){ repiteHTML = '<span style="right: 4px; top:3px; position: absolute;"><span class="ing-link"></span></span>'; }
  285. if(editable === true ){edit_class = "bloque-draggable ui-draggable ui-draggable-handle";}
  286. var nuevoHorario = '<div class="bloque-evento '+edit_class+' '+completo_class+'" id="bloque_'+id+'" data-id_obj="'+id+'" data-sort="'+sort+'"\
  287. style="height:'+_block_h+'px; '+completo_color+'" >\
  288. <div class="menu-wrapper">\
  289. <p><span class="cat_ico" style="left: 4px;position: absolute;">'+hora_class+'</span>\
  290. '+hora+'<span class="title px-1" style="margin-right:13px">'+texto+'</span>'+repiteHTML+'</p>\
  291. <div class="menu-flotante d-none">\
  292. <span class="float-right iconos" >\
  293. <span class="ing-buscar ing-fw bloque-ver mx-1" aria-hidden="true" title="Ver detalle"></span>';
  294. if(editable === true ){
  295. nuevoHorario +='<span class="ing-editar ing-fw calendario_edita mx-1" aria-hidden="true" title="Editar"></span>\
  296. <span class="ing-basura ing-fw mx-1" aria-hidden="true" data-toggle="modal" data-target="#modal_confirm" title="Borrar"></span>';
  297. }
  298. nuevoHorario +='</span>\
  299. </div>\
  300. </div>\
  301. </div>';
  302. return $(nuevoHorario);
  303. }