templates/chat/base_chat.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block stylesheets %}
  3.     <style>
  4.         .panel {
  5.             width: 100%;
  6.             position: absolute;
  7.             bottom: 0;
  8.             z-index: 999;
  9.         }
  10.         .panel-search {
  11.             display: none;
  12.             padding: 10px;
  13.             background-color: #dfdfdf;
  14.             height: 500px;
  15.         }
  16.         .panel::after {
  17.             content: '';
  18.             background-color: red;
  19.             opacity: 0.5;
  20.         }
  21.         #list-pacientes-search {
  22.             height: 540px;
  23.             overflow-y: scroll;
  24.         }
  25.     </style>
  26. {% endblock %}
  27. {% block body %}
  28.     <div class="body-chat">
  29.         <div class="container-fluid">
  30.             <div class="row clearfix">
  31.                 <div class="col-lg-12">
  32.                     <div class="card chat-app mt-4">
  33.                         <div id="plist" class="people-list">
  34.                 <div class="row mb-1">
  35.                                 <div class="col-lg-12">
  36.                 <div class="list-button-container">
  37.                   <div class="text-left btn btn-secundario btn-sm">
  38.                   <i class="fa fa-external-link-square mr-1"></i>
  39.                     <a target="_blank" href="{{ path('chat', { afiliadoId: afiliadoId, whabaId: whabaOrigen }) }}" style="cursor: pointer; color:inherit; text-decoration: none;" class="">Abrir en navegador web</a>
  40.                   </div>
  41.                   <div class="text-right">
  42.                     <button id="btnNewConversation" class="btn btn-corporativo btn-sm">
  43.                       <i class="fa fa-pencil mr-1"></i>
  44.                       Nuevo chat
  45.                     </button>
  46.                   </div>
  47.                 </div>
  48.                                 </div>
  49.                             </div>
  50.                             <div class="row mb-1">
  51.                                 <div class="col-lg-12">
  52.                                     <div class="input-group">
  53.                                         <div class="input-group-prepend">
  54.                                             <span class="input-group-text">
  55.                                                 <i class="fa fa-search"></i>
  56.                                             </span>
  57.                                         </div>
  58.                                         <input id="txtSearch" type="text" class="form-control" placeholder="Buscar chat activos..."/>
  59.                                     </div>
  60.                                 </div>
  61.                             </div>
  62.                             <ul class="list-unstyled chat-list mt-2 mb-0" id="listUserConversation">
  63.                                 {% include 'chat/listado-chat.html.twig' %}
  64.                             </ul>
  65.                         </div>
  66.                         <div class="chat">
  67.                             <div class="chat-header clearfix">
  68.                                 {% include 'chat/conversacion-header.html.twig' %}
  69.                             </div>
  70.                             <div class="chat-history">
  71.                   {% if oHistorialMensajes is defined %}
  72.                     {% include 'chat/conversacion.html.twig' %}
  73.                   {% endif %}
  74.                             </div>
  75.                             <div class="chat-message clearfix">
  76.                                 <div class="input-group d-flex no-gutters flex-row align-items-stretch " >
  77.                   <div class="flex-grow-1">
  78.                     <input type="text" class="form-control" placeholder="Introduce el texto aquí..." id="txtText"/>
  79.                   </div>
  80.                                     <div class="input-group-append col-md-auto">
  81.                                         <button id="btnAcction" disabled class="btn btn-corporativo" data-whabadestino="" data-centroid="" data-numtelefono="" data-template="false">
  82.                                             <i class="fa fa-plus"></i>
  83.                                         </button>
  84.                                         <button type="button" class="btn btn-corporativo btnSendMessage" disabled id="btnSendMessage" data-whabadestino="" data-centroid="" data-numtelefono="" data-template="false">
  85.                                             <i class="fa fa-send"></i>
  86.                                         </button>
  87.                                     </div>
  88.                                 </div>
  89.                             </div>
  90.                         </div>
  91.                         <div class="panel">
  92.                             <div class="panel-search">
  93.                                 <div class="row">
  94.                                     <div class="col-lg-12">
  95.                                         <div class="input-group">
  96.                                             <input type="text" class="form-control txtSearchPacienteNombre" placeholder="Nombre paciente" aria-label="Nombre paciente" aria-describedby="basic-addon2"/>
  97.                                             <input type="text" class="form-control txtSearcPacienteApellido" placeholder="Apellido paciente" aria-label="Apellido paciente" aria-describedby="basic-addon2"/>
  98.                                             <div class="input-group-append">
  99.                                                 <button id="btnSearchPaciente" class="btn btn-corporativo" type="button">Buscar</button>
  100.                                             </div>
  101.                                         </div>
  102.                                     </div>
  103.                                 </div>
  104.                                 <div class="row">
  105.                                     <div class="col-lg-12">
  106.                                         <div id="loadSearch" class="spinner-border" role="status" style="display: none">
  107.                                             <span class="sr-only">Loading...</span>
  108.                                         </div>
  109.                                         <ul id="list-pacientes-search" class="list-group"></ul>
  110.                                     </div>
  111.                                 </div>
  112.                             </div>
  113.                         </div>
  114.                     </div>
  115.                 </div>
  116.             </div>
  117.         </div>
  118.     </div>
  119. <div id="loading-overlay">
  120.   <div id="loading-icon"></div>
  121. </div>
  122.     {% include 'chat/componentes/modal-detail-paciente.html.twig' %}
  123.     {% include 'chat/componentes/modal-action-chat.html.twig' %}
  124. {% endblock %}
  125. {% block javascripts %}
  126.     <script type="text/javascript">
  127. var isOpenSearch = false;
  128. var emojioneAreaInstance;
  129. $(document).keyup(function(e) {
  130.   if (e.which === 27) {
  131.     if (isOpenSearch) {
  132.       $(".panel-search").slideToggle('slow');
  133.       isOpenSearch = false;
  134.     }
  135.   }
  136. });
  137. $(document).click(function(e) {
  138.   if (isOpenSearch) {
  139.     if ($(e.target).is('div') || $(e.target).is('ul')) {
  140.       $(".panel-search").slideToggle('slow');
  141.       isOpenSearch = false;
  142.     }
  143.   }
  144. });
  145. // $("#txtSearch").on('keyup')
  146. $(document).on('keyup', '#txtSearch', function() {
  147.   var li = $("li.listado-conversaciones");
  148.   var val = $(this).val().toLowerCase();
  149.   li.removeClass('hidden')
  150.   if (val && val.length > 0) {
  151.     li.each(function() {
  152.       var that = $(this);
  153.       var txt = that.text().toLowerCase();
  154.       // If searched term is not found into li's text
  155.       if (txt.indexOf(val) == -1) {
  156.         // Add .hidden class to the specific element
  157.         that.addClass('hidden');
  158.       }
  159.     });
  160.   }
  161. });
  162. $(document).on('click', '#btnNewConversation', function() {
  163.   if (!isOpenSearch) {
  164.     $(".panel-search").slideToggle('slow');
  165.     isOpenSearch = true;
  166.   }
  167. });
  168. $(document).on('click', '#btnSearchPaciente', function() {
  169.   var txtPacienteNombre = $(".txtSearchPacienteNombre").val();
  170.   var txtPacienteApellido = $(".txtSearcPacienteApellido").val()
  171.   var centroId = '{{ centroId }}';
  172.   var datos = {
  173.     pacienteNombre: txtPacienteNombre,
  174.     pacienteApellido: txtPacienteApellido,
  175.     centroId: centroId
  176.   };
  177.   $("#loadSearch").css({
  178.     'display': 'inline-block'
  179.   });
  180.   $("#list-pacientes-search").empty();
  181.   var html = '';
  182.   $.ajax({
  183.     url: '{{ path('get_search_pacientes') }}',
  184.     dataType: 'json',
  185.     type: 'POST',
  186.     data: datos,
  187.     success: function(data) {
  188.       if (data.aPacientes.length > 0) {
  189.         data.aPacientes.forEach(function(element) {
  190.           html += '<li class="list-group-item selecte-pacient-conversation" data-numtelefono="' + element.telefono + '" data-vcid="' + element.id + '" data-centroid="' + centroId + '">';
  191.           html += '<a style="cursor: pointer">' + element.nombre + ' ' + element.apellidos + ' - ' + element.telefono + ' - ' + element.categoryTelefono + '</a>';
  192.           html += '</li>';
  193.         });
  194.         $("#list-pacientes-search").empty().append(html);
  195.         $("#loadSearch").css({
  196.           'display': 'none'
  197.         });
  198.       }
  199.     }
  200.   })
  201. });
  202. /* $(document).on('click', '.selecte-pacient-conversation', function() {
  203.   var centroid = $(this).data('centroid');
  204.   var numtelefono = $(this).data('numtelefono');
  205.   forceDatabaseUpdate(centroid, numtelefono);
  206.   initConversation(centroid, numtelefono);
  207.   $(".panel-search").slideToggle('slow');
  208.   isOpenSearch = false;
  209. }); */
  210. $(document).on('click', '.selecte-pacient-conversation', async function() {
  211.   var centroid = $(this).data('centroid');
  212.   var numtelefono = $(this).data('numtelefono');
  213.   await forceDatabaseUpdate(centroid, numtelefono);
  214.   initConversation(centroid, numtelefono);
  215.   $(".panel-search").slideToggle('slow');
  216.   isOpenSearch = false;
  217. });
  218. $(document).on('click', '.listado-conversaciones', function() {
  219.   var centroId = $(this).data('centroid');
  220.   var numTelefono = $(this).data('numtelefono');
  221.   $(".listado-conversaciones").removeClass('active-chat');
  222.   $(this).addClass('active-chat');
  223.   initConversation(centroId, numTelefono);
  224. });
  225. /* function forceDatabaseUpdate(centroid, numtelefono) {
  226.   $.ajax({
  227.     url: '{{ path('force_database_update') }}'+ '/' + numtelefono + '/' + centroid,
  228.     dataType: 'json',
  229.     success: function(data) {
  230.       // Handle successful response here
  231.     },
  232.     error: function(xhr, status, error) {
  233.       // Handle error response here
  234.     }
  235.   });
  236. } */
  237. function forceDatabaseUpdate(centroid, numtelefono) {
  238.   // Show the loading overlay and disable all clicks
  239.   $('#loading-overlay').show();
  240.   $('body').addClass('disable-clicks');
  241.   
  242.   return new Promise(function(resolve, reject) {
  243.     $.ajax({
  244.       url: '{{ path('force_database_update') }}'+ '/' + numtelefono + '/' + centroid,
  245.       dataType: 'json',
  246.       success: function(data) {
  247.         // Hide the loading overlay and re-enable clicks on success
  248.         $('#loading-overlay').hide();
  249.         $('body').removeClass('disable-clicks');
  250.         $(".listado-conversaciones").removeClass('active-chat');
  251.         // Call the resolve function with the returned data
  252.         resolve(data);
  253.       },
  254.       error: function(xhr, status, error) {
  255.         // Hide the loading overlay and re-enable clicks on error
  256.         $('#loading-overlay').hide();
  257.         $('body').removeClass('disable-clicks');
  258.         // Call the reject function with the error information
  259.         reject(error);
  260.       }
  261.     });
  262.   });
  263. }
  264. function initConversation(centroId, numTelefono) {
  265.   var whabaOrigen = '{{ whabaOrigen }}';
  266.   $.ajax({
  267.     url: '{{ path('get_conversacion', {'whabaOrigenId': whabaOrigen}) }}/' + numTelefono + '/' + centroId,
  268.     dataType: 'json',
  269.     success: function(data) {
  270.       $(".chat-header").empty().append(data.viewCabecera);
  271.       $(".chat-history").empty().append(data.viewConversacion);
  272.       /*$(".chat-history").animate({
  273.         scrollTop: $(".chat-history").get(0).scrollHeight
  274.       }, 2000);*/
  275.       $(".chat-history").scrollTop($(".chat-history").get(0).scrollHeight);
  276.       $(".btnSendMessage").data('whabadestino', whabaOrigen).data('centroid', centroId).data('numtelefono', numTelefono);
  277.       $(".badge-" + numTelefono + '-' + centroId).remove();
  278.       // Forzamos a colocar el "Hola", para la plantilla generica
  279.       // var valorPlantillaGenerica = (data.isTemplateSend) ? 'Hola' : '';
  280.       // $("#txtText").val(valorPlantillaGenerica);
  281.       $(".btnSendMessage").data('template', data.isTemplateSend);
  282.       /*if (!data.isTemplateSend) {
  283.         $("#btnAcction").prop('disabled', false);
  284.       }*/
  285.       $("#btnAcction").data('whabadestino', whabaOrigen) /* .data('vcid', vcId) */ .data('centroid', centroId).data('numtelefono', numTelefono).prop('disabled', false);
  286.     }
  287.   })
  288. }
  289. $(document).on('click', '#upload_link_document', function() {
  290.   $("#uploadFile").trigger('click');
  291. });
  292. $(document).on('change', '#uploadFile', function() {
  293.     console.log(this.files[0]);
  294.     var file = this.files[0];
  295.     var typeFile = file.type;
  296.     console.log(typeFile);
  297.     var aFormatsDocs = ['application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/msword'];
  298.     var aFormatsImage = ['image/jpeg', 'image/png'];
  299.     var aFormatsVideo = ['video/mp4'];
  300.     var fileTipo = '';
  301.     var maxMbVideo = 16 * 1024 * 1024;
  302.     
  303.     if (aFormatsDocs.indexOf(typeFile) !== -1) {
  304.         fileTipo = 'document';
  305.     } else if (aFormatsImage.indexOf(typeFile) !== -1) {
  306.         fileTipo = 'image';
  307.     } else if (aFormatsVideo.indexOf(typeFile) !== -1) {
  308.         fileTipo = 'video';
  309.         if (file.size > maxMbVideo) {
  310.             alert('Vídeo superior a tamaño soportado 16mb');
  311.             return false;
  312.         }
  313.     }
  314.     
  315.     var centroid = $("#btnAcction").data('centroid');
  316.     var numTelefono = $("#btnAcction").data('numtelefono');
  317.     var formData = new FormData();
  318.     formData.append('file', file);
  319.     formData.append('typeFile', fileTipo);
  320.     formData.append('fileExtensionType', typeFile)
  321.     formData.append('whabadestino', $("#btnAcction").data('whabadestino'));
  322.     formData.append('centroId', $("#btnAcction").data('centroid'));
  323.     formData.append('numtelefono', $("#btnAcction").data('numtelefono'));
  324.     $("#actionSheet").modal('hide');
  325.     $.ajax({
  326.         url: '{{ path('upload_file_and_send') }}',
  327.         data: formData,
  328.         type: 'POST',
  329.         contentType: false,
  330.         processData: false,
  331.         async: true,
  332.         success: function(data) {
  333.             console.log(data)
  334.             $("ul[data-id='" + numTelefono + '_' + centroid + "']").append(data.view);
  335.             /*$(".chat-history").animate({
  336.                 scrollTop: $(".chat-history").get(0).scrollHeight
  337.             }, 2000);*/
  338.             $(".chat-history").scrollTop($(".chat-history").get(0).scrollHeight);
  339.             $("#uploadFile").val(null);
  340.         }
  341.     })
  342. });
  343. let isSending2 = false;
  344. $(document).ready(function() {
  345.   // Initialize emojioneArea for the txtText element
  346.   emojioneAreaInstance = $("#txtText").emojioneArea({
  347.     inline: true,
  348.     searchPlaceholder: "Buscar",
  349.     pickerPosition: "top"
  350.   })[0].emojioneArea;
  351.   var valor = ''; // Define the 'valor' variable outside the 'updateDisabledState' function
  352.   function updateDisabledState() {
  353.     var disabledButton = (valor.length > 0 && numtelefono !== '') ? false : true;
  354.     var numtelefono = $(".btnSendMessage").data('numtelefono');
  355.     $(".btnSendMessage").prop('disabled', disabledButton);
  356.   }
  357.   emojioneAreaInstance.val = function() {
  358.     return this.getText();
  359.   };
  360.   // Bind the keyup event to the emojioneArea instance
  361.   emojioneAreaInstance.on("keyup", function(editor, event) {
  362.     if (isSending2) {
  363.       return;
  364.     }
  365.     
  366.     valor = emojioneAreaInstance.getText(); // Update the 'valor' variable within the keyup event handler
  367.     var charCode = (event.which) ? event.which : event.keyCode;
  368.     var numtelefono = $(".btnSendMessage").data('numtelefono');
  369.     updateDisabledState();
  370.     
  371.     if (valor.length > 0 && numtelefono !== '') {
  372.       if (charCode === 13) {
  373.         isSending2 = true;
  374.         var whabaOrigen = $(".btnSendMessage").data('whabadestino');
  375.         var centroid = $(".btnSendMessage").data('centroid');
  376.         var isTemplate = $(".btnSendMessage").data('template');
  377.         var numTelefono = $(".btnSendMessage").data('numtelefono');
  378.         sendMessage(whabaOrigen, centroid, isTemplate, numTelefono);
  379.         
  380.         setTimeout(() => {
  381.           isSending2 = false;
  382.         }, 3000); // Adjust the debounce time as needed
  383.       }
  384.     }
  385.   });
  386.   // Bind the emojibtn.click event to update the disabled state of the button
  387.   emojioneAreaInstance.on("emojibtn.click", function() {
  388.     updateDisabledState();
  389.   });
  390. });
  391.   function setText(text) {
  392.     emojioneAreaInstance.setText(text);
  393.     updateDisabledState();
  394.   }
  395. let isSending = false;
  396. $(document).on('click', '.btnSendMessage', function() {
  397.     if (isSending) {
  398.         return;
  399.     }
  400.     isSending = true;
  401.     var whabaOrigen = $(this).data('whabadestino');
  402.     var centroid = $(this).data('centroid');
  403.     var isTemplate = $(this).data('template');
  404.     var numTelefono = $(this).data('numtelefono');
  405.     sendMessage(whabaOrigen, centroid, isTemplate, numTelefono);
  406.     setTimeout(() => {
  407.         isSending = false;
  408.     }, 3000); // Adjust the debounce time as needed
  409. });
  410. function sendMessage(whabaOrigen, centroid, isTemplate, numTelefono) {
  411.     var typeSend = '';
  412.     /*
  413.     if (isTemplate) {
  414.         typeSend = 'template';
  415.     } else {
  416.         typeSend = 'text';
  417.     }
  418.     */
  419.     typeSend = 'text';
  420.     var datos = {
  421.         whabaOrigen: whabaOrigen,
  422.         centroid: centroid,
  423.         texto: emojioneAreaInstance.val(),
  424.         typeSend: typeSend,
  425.         telefonoDestino: numTelefono
  426.     };
  427.     $.ajax({
  428.         url: '{{ path('send_mensaje') }}',
  429.         type: 'POST',
  430.         data: datos,
  431.         dataType: 'json',
  432.         success: function(data) {
  433.             $("ul[data-id='" + numTelefono + '_' + centroid + "']").append(data.view);
  434.             /*
  435.             $(".chat-history").animate({
  436.                 scrollTop: $(".chat-history").get(0).scrollHeight
  437.             }, 2000);
  438.             */
  439.             $(".chat-history").scrollTop($(".chat-history").get(0).scrollHeight);
  440.             /* $("#txtText").val(''); */
  441.             emojioneAreaInstance.setText('');
  442.             $(".btnSendMessage").prop('disabled', true);
  443.             $("#btnAcction").prop('disabled', false);
  444.             /*
  445.             if (isTemplate) {
  446.                 $(".btnSendMessage").data('template', false);
  447.             }
  448.             */
  449.         }
  450.     });
  451. }
  452. $(document).on('click', '.btnDetailPaciente', function() {
  453.   var pacienteId = $(this).data('pacienteid');
  454.   var centroId = $(this).data('centroid');
  455.   $.ajax({
  456.     url: '{{ path('get_datos_paciente') }}/' + centroId + '/' + pacienteId,
  457.     dataType: 'html',
  458.     success: function(data) {
  459.       $("#modalDatosPaciente .modal-body").empty().append(data);
  460.       $("#modalDatosPaciente").modal('show');
  461.     }
  462.   });
  463. });
  464. $(document).on('click', '#btnAcction', function() {
  465.   $("#actionSheet").modal('show');
  466. });
  467. setInterval(callListadoPacientesChat, 30000);
  468. function callListadoPacientesChat() { // Obtaining started chat
  469.   var numTelefono = (typeof $(".chat-listado").data('numtelefono') !== "undefined") ? $(".chat-listado").data('numtelefono') : '';
  470.   var url = (numTelefono !== '') ? '{{ path('get_listado_conversaciones', {'whabaOrigen': whabaOrigen}) }}/' + numTelefono : '{{ path('get_listado_conversaciones', {'whabaOrigen': whabaOrigen}) }}';
  471.   $.ajax({
  472.     url: url,
  473.     dataType: 'html',
  474.     success: function(data) {
  475.       $("#listUserConversation").empty().append(data);
  476.     }
  477.   });
  478. }
  479. setInterval(callLastMessage, 600);
  480. function callLastMessage() {
  481.   var idenChat = $(".chat-listado").data('id');
  482.   var whabaid = $(".chat-listado").data('whabaid');
  483.   var extract = idenChat.split("_");
  484.   if (idenChat !== '') {
  485.     $.ajax({
  486.       url: '{{ path('get_last_message_chat') }}/' + extract[0] + '/' + extract[1],
  487.       type: 'POST',
  488.       data: {
  489.         whabaid: whabaid
  490.       },
  491.       dataType: 'json',
  492.       success: function(data) {
  493.         if (data.totalItems > 0) {
  494.           $("ul[data-id='" + idenChat + "']").append(data.view);
  495.           $(".chat-history").animate({
  496.             scrollTop: $(".chat-history").get(0).scrollHeight
  497.           }, 2000);
  498.         }
  499.       }
  500.     });
  501.   }
  502. }
  503. function downloadFile(conversacionId, classComponente, type) {
  504.   $.ajax({
  505.     url: '{{ path('get_content_media') }}/' + conversacionId,
  506.     dataType: 'json',
  507.     success: function(data) {
  508.       if (type === 'image') {
  509.         $("." + classComponente).attr('src', data.urlMedia);
  510.         $("." + classComponente + "-download").hide();
  511.       } else if (type === 'audio') {
  512.         var htmlAudio = '<audio controls>';
  513.         htmlAudio += '<source src="' + data.urlMedia + '" type="audio/ogg" >';
  514.         htmlAudio += '</audio>';
  515.         $(".audiodownloaded-" + conversacionId).empty().append(htmlAudio);
  516.         $("." + classComponente + "-download").hide();
  517.       } else if (type === 'video') {
  518.         var htmlVideo = '<video controls autoplay>';
  519.         htmlVideo += '<source src="' + data.urlMedia + '" type="video/mp4">';
  520.         htmlVideo += '</video>';
  521.         $(".videodownload-" + conversacionId).empty().append(htmlVideo);
  522.         $("." + classComponente + "-download").hide();
  523.       } else if (type === 'documento') {
  524.         var downloadLink = document.createElement('a');
  525.         window.open(data.urlMedia);
  526.       }
  527.     }
  528.   });
  529. }
  530.     </script>
  531. {% endblock %}