avances de hoy

This commit is contained in:
imnavajas
2024-07-06 22:44:29 +02:00
parent 26f3057bbe
commit f46a03e66d
9 changed files with 720 additions and 30 deletions

View File

@ -0,0 +1,138 @@
/**
* App Chat
*/
// Seleccionar elementos del DOM
const chatContactsBody = $('.app-chat-contacts .sidebar-body'),
chatContactListItems = $('.chat-contact-list-item:not(.chat-contact-list-item-title)'),
chatHistoryBody = $('.chat-history-body'),
chatSidebarLeftUserAbout = $('.chat-sidebar-left-user-about'),
messageInput = $('.message-input'),
searchInput = $('.chat-search-input'),
sendMsgBtn = $('.send-msg-btn'); // Seleccionar el botón de envío de mensaje
// Inicializar PerfectScrollbar
if (chatContactsBody.length) {
new PerfectScrollbar(chatContactsBody[0], {
wheelPropagation: false,
suppressScrollX: true
});
}
if (chatHistoryBody.length) {
new PerfectScrollbar(chatHistoryBody[0], {
wheelPropagation: false,
suppressScrollX: true
});
}
// Función para desplazar el scroll al final
function scrollToBottom() {
if (chatHistoryBody.length) {
chatHistoryBody.scrollTop(chatHistoryBody[0].scrollHeight);
}
}
scrollToBottom();
// Seleccionar chat o contacto
chatContactListItems.on('click', function () {
chatContactListItems.removeClass('active');
$(this).addClass('active');
});
// Filtrar chats
if (searchInput.length) {
searchInput.on('keyup', function () {
const searchValue = $(this).val().toLowerCase(),
chatListItem0 = $('.chat-list-item-0'),
contactListItem0 = $('.contact-list-item-0'),
searchChatListItems = $('#chat-list li:not(.chat-contact-list-item-title)'),
searchContactListItems = $('#contact-list li:not(.chat-contact-list-item-title)');
// Buscar en chats
const chatListItemsCount = searchChatContacts(searchChatListItems, searchValue);
// Mostrar u ocultar mensaje de "No se encontraron resultados" en chats
if (chatListItem0.length) {
chatListItem0.toggleClass('d-none', chatListItemsCount === 0);
}
// Buscar en contactos
const contactListItemsCount = searchChatContacts(searchContactListItems, searchValue);
// Mostrar u ocultar mensaje de "No se encontraron resultados" en contactos
if (contactListItem0.length) {
contactListItem0.toggleClass('d-none', contactListItemsCount === 0);
}
});
}
// Función para buscar en chats y contactos
function searchChatContacts(searchListItems, searchValue) {
let searchListItemsCount = 0;
searchListItems.each(function () {
const searchListItemText = $(this).text().toLowerCase();
const matchesSearch = searchListItemText.indexOf(searchValue) !== -1;
$(this).toggleClass('d-flex', matchesSearch);
$(this).toggleClass('d-none', !matchesSearch);
if (matchesSearch) {
searchListItemsCount++;
}
});
return searchListItemsCount;
}
// Enviar mensaje
if (sendMsgBtn.length) {
sendMsgBtn.on('click', function (e) {
e.preventDefault();
if (messageInput.val()) {
const renderMsg = $('<div>').addClass('chat-message-text mt-2').html(`<p class="mb-0">${messageInput.val()}</p>`);
const lastChatMessageWrapper = $('li:last-child .chat-message-wrapper');
if (lastChatMessageWrapper.length) {
lastChatMessageWrapper.append(renderMsg);
}
messageInput.val('');
scrollToBottom();
}
});
}
// Seleccionar los elementos <p> con la clase .chat-contact-status
$('.chat-contact-status').on('click', function () {
// Obtener el id de la conversación desde el atributo id del elemento <p>
var conversationId = $(this).attr('id');
console.log(conversationId)
// Realizar la llamada AJAX
$.ajax({
url: 'internos/chat/' + conversationId, // Cambia esta URL por la ruta correcta a tu API
type: 'GET',
dataType: 'json',
success: function (data) {
// Manejar la respuesta exitosa de la llamada AJAX
console.log('Datos recibidos:', data);
// Aquí puedes actualizar el DOM o realizar otras acciones con los datos recibidos
if (Array.isArray(data.people) && data.people.length > 0) {
// Limpiar el contenedor donde se mostrarán los participantes
$('#participants-container').empty();
data.people.forEach(person => {
// Crear el HTML para cada participante y agregarlo al contenedor
var participantHtml = `
<div class="avatar d-block flex-shrink-0 me-2">
<span class="avatar-initial rounded-circle bg-label-primary ">${person.user_id}</span>
</div>`;
$('#participants-container').append(participantHtml);
});
}
},
error: function (jqXHR, textStatus, errorThrown) {
// Manejar errores en la llamada AJAX
console.error('Error en la llamada AJAX:', textStatus, errorThrown);
}
});
})
;

View File

@ -0,0 +1,364 @@
<?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
<?= $this->include("themes/_commonPartialsBs/datatables") ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<!--Content Body-->
<div class="container-xxl flex-grow-1 container-p-y">
<div class="app-chat card overflow-hidden">
<div class="row g-0">
<!-- Chat & Contacts -->
<div
class="col app-chat-contacts app-sidebar flex-grow-0 overflow-hidden border-end"
id="app-chat-contacts">
<div class="sidebar-header">
<div class="d-flex align-items-center me-3 me-lg-0">
<div class="flex-shrink-0 avatar me-3">
<span class="avatar-initial rounded-circle bg-label-success">U</span>
</div>
<div class="flex-grow-1 input-group input-group-merge rounded-pill">
<span class="input-group-text" id="basic-addon-search31">
<i class="ti ti-search"></i>
</span>
<input
type="text"
class="form-control chat-search-input"
placeholder="Buscar..."
aria-label="Buscar..."
aria-describedby="basic-addon-search31"/>
</div>
</div>
<i
class="ti ti-x cursor-pointer d-lg-none d-block position-absolute mt-2 me-1 top-0 end-0"
data-overlay
data-bs-toggle="sidebar"
data-target="#app-chat-contacts"></i>
</div>
<hr class="container-m-nx m-0"/>
<div class="sidebar-body">
<div class="chat-contact-list-item-title">
<h5 class="text-primary mb-0 px-4 pt-3 pb-2">Conversaciones</h5>
</div>
<!-- Chats -->
<ul class="list-unstyled chat-contact-list" id="chat-list">
<li class="chat-contact-list-item chat-list-item-0 d-none">
<h6 class="text-muted mb-0">No hay conversaciones</h6>
</li>
<?php foreach ($conversaciones as $conversacion): ?>
<li class="chat-contact-list-item">
<a class="d-flex align-items-center">
<div class="flex-shrink-0 avatar">
<span class="avatar-initial rounded-circle bg-label-secondary">SK</span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">Safekat Interno</h6>
<p
id="<?= $conversacion->id ?>"
class="chat-contact-status text-muted text-truncate mb-0"
title="<?= $conversacion->asunto ?>"
>
<?= $conversacion->asunto ?>
</p>
</div>
</a>
</li>
<?php endforeach; ?>
</ul>
<!-- Contacts -->
<ul class="list-unstyled chat-contact-list mb-0" id="contact-list">
<li class="chat-contact-list-item chat-contact-list-item-title">
<h5 class="text-primary mb-0">Contacts</h5>
</li>
<li class="chat-contact-list-item contact-list-item-0 d-none">
<h6 class="text-muted mb-0">No Contacts Found</h6>
</li>
<li class="chat-contact-list-item">
<a class="d-flex align-items-center">
<div class="avatar d-block flex-shrink-0">
<span class="avatar-initial rounded-circle bg-label-primary">IM</span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">Ignacio Martinez</h6>
</div>
</a>
</li>
<li class="chat-contact-list-item">
<a class="d-flex align-items-center">
<div class="avatar d-block flex-shrink-0">
<span class="avatar-initial rounded-circle bg-label-primary">JJ</span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">Jaime Jimenez</h6>
</div>
</a>
</li>
</ul>
</div>
</div>
<!-- /Chat contacts -->
<!-- Chat History -->
<div class="col app-chat-history bg-body">
<div class="chat-history-wrapper">
<div class="chat-history-header border-bottom">
<div class="d-flex justify-content-between align-items-center">
<div id="participants-container" class="d-flex overflow-hidden align-items-center">
<div class="avatar d-block flex-shrink-0">
<span class="avatar-initial rounded-circle bg-label-primary">P</span>
</div>
</div>
<div class="d-flex align-items-center">
<div class="dropdown d-flex align-self-center">
<button
class="btn p-0"
type="button"
id="chat-header-actions"
data-bs-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">
<i class="ti ti-dots-vertical"></i>
</button>
<div class="dropdown-menu dropdown-menu-end"
aria-labelledby="chat-header-actions">
<a class="dropdown-item" href="javascript:void(0);">Silenciar
Conversacion</a>
<a class="dropdown-item" href="javascript:void(0);">Limpiar Conversacion</a>
</div>
</div>
</div>
</div>
</div>
<div class="chat-history-body bg-body">
<ul class="list-unstyled chat-history">
<li class="chat-message chat-message-right">
<div class="d-flex overflow-hidden">
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">How can we help? We're here for you! 😄</p>
</div>
<div class="text-end text-muted mt-1">
<i class="ti ti-checks ti-xs me-1 text-success"></i>
<small>10:00 AM</small>
</div>
</div>
<div class="user-avatar flex-shrink-0 ms-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/1.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
</div>
</li>
<li class="chat-message">
<div class="d-flex overflow-hidden">
<div class="user-avatar flex-shrink-0 me-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/2.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Hey John, I am looking for the best admin template.</p>
<p class="mb-0">Could you please help me to find it out? 🤔</p>
</div>
<div class="chat-message-text mt-2">
<p class="mb-0">It should be Bootstrap 5 compatible.</p>
</div>
<div class="text-muted mt-1">
<small>10:02 AM</small>
</div>
</div>
</div>
</li>
<li class="chat-message chat-message-right">
<div class="d-flex overflow-hidden">
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Vuexy has all the components you'll ever need in a
app.</p>
</div>
<div class="text-end text-muted mt-1">
<i class="ti ti-checks ti-xs me-1 text-success"></i>
<small>10:03 AM</small>
</div>
</div>
<div class="user-avatar flex-shrink-0 ms-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/1.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
</div>
</li>
<li class="chat-message">
<div class="d-flex overflow-hidden">
<div class="user-avatar flex-shrink-0 me-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/2.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Looks clean and fresh UI. 😃</p>
</div>
<div class="chat-message-text mt-2">
<p class="mb-0">It's perfect for my next project.</p>
</div>
<div class="chat-message-text mt-2">
<p class="mb-0">How can I purchase it?</p>
</div>
<div class="text-muted mt-1">
<small>10:05 AM</small>
</div>
</div>
</div>
</li>
<li class="chat-message chat-message-right">
<div class="d-flex overflow-hidden">
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Thanks, you can purchase it.</p>
</div>
<div class="text-end text-muted mt-1">
<i class="ti ti-checks ti-xs me-1 text-success"></i>
<small>10:06 AM</small>
</div>
</div>
<div class="user-avatar flex-shrink-0 ms-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/1.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
</div>
</li>
<li class="chat-message">
<div class="d-flex overflow-hidden">
<div class="user-avatar flex-shrink-0 me-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/2.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">I will purchase it for sure. 👍</p>
</div>
<div class="chat-message-text mt-2">
<p class="mb-0">Thanks.</p>
</div>
<div class="text-muted mt-1">
<small>10:08 AM</small>
</div>
</div>
</div>
</li>
<li class="chat-message chat-message-right">
<div class="d-flex overflow-hidden">
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Great, Feel free to get in touch.</p>
</div>
<div class="text-end text-muted mt-1">
<i class="ti ti-checks ti-xs me-1 text-success"></i>
<small>10:10 AM</small>
</div>
</div>
<div class="user-avatar flex-shrink-0 ms-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/1.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
</div>
</li>
<li class="chat-message">
<div class="d-flex overflow-hidden">
<div class="user-avatar flex-shrink-0 me-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/2.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
<div class="chat-message-wrapper flex-grow-1">
<div class="chat-message-text">
<p class="mb-0">Do you have design files for Vuexy?</p>
</div>
<div class="text-muted mt-1">
<small>10:15 AM</small>
</div>
</div>
</div>
</li>
<li class="chat-message chat-message-right">
<div class="d-flex overflow-hidden">
<div class="chat-message-wrapper flex-grow-1 w-50">
<div class="chat-message-text">
<p class="mb-0">
Yes that's correct documentation file, Design files are included
with
the template.
</p>
</div>
<div class="text-end text-muted mt-1">
<i class="ti ti-checks ti-xs me-1"></i>
<small>10:15 AM</small>
</div>
</div>
<div class="user-avatar flex-shrink-0 ms-3">
<div class="avatar avatar-sm">
<img src="../../assets/img/avatars/1.png" alt="Avatar"
class="rounded-circle"/>
</div>
</div>
</div>
</li>
</ul>
</div>
<!-- Chat message form -->
<div class="chat-history-footer shadow-sm">
<div class="form-send-message d-flex justify-content-between align-items-center">
<input
class="form-control message-input border-0 me-3 shadow-none"
placeholder="Type your message here"
/>
<div class="message-actions d-flex align-items-center">
<a class="btn btn-primary d-flex send-msg-btn">
<i class="ti ti-send me-md-1 me-0"></i>
<span class="align-middle d-md-inline-block d-none">Send</span>
</a>
</div>
</div>
</div>
</div>
</div>
<!-- /Chat History -->
</div>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('additionalInlineJs') ?>
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/css/pages/app-chat.css') ?>">
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script src="<?= site_url('themes/vuexy/vendor/libs/perfect-scrollbar/perfect-scrollbar.js') ?>"></script>
<script src="<?= site_url('js_loader/chat_js') ?>"></script>
<?= $this->endSection() ?>

View File

@ -6,7 +6,7 @@ if (auth()->user()->inGroup('beta')) {
?>
<!-- Messages -->
<li class="menu-item">
<a href="<?= site_url("servicios/mensajes") ?>" class="menu-link">
<a href="<?= route_to('mensajeriaView') ?>" class="menu-link">
<i class="menu-icon tf-icons ti ti-message"></i>
<?= lang("App.menu_mensajes") ?>
</a>