feat: chat module

This commit is contained in:
amazuecos
2024-09-23 09:19:45 +02:00
parent bfea4aa67c
commit 766347ad81
28 changed files with 1598 additions and 801 deletions

View File

@ -1,4 +1,4 @@
<div class="container-xxl flex-grow-1 container-p-y">
<div class="container-xxl flex-grow-1 container-p-y" id="chat-presupuesto" data-id="<?=$presupuestoId ?>">
<div class="app-chat card overflow-hidden">
<div class="row g-0">
@ -33,56 +33,14 @@
<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">Chats</h5>
<h5 class="text-primary mb-0 px-4 pt-3 pb-2">Departamentos</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 Chats Found</h6>
</li>
<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-success">P</span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">Producción</h6>
<p class="chat-contact-status text-muted text-truncate mb-0">
Descripcion dpto. produccion
</p>
</div>
</a>
</li>
<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-success"><small>POD</small></span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">POD</h6>
<p class="chat-contact-status text-muted text-truncate mb-0">
Descripcion dpto. POD
</p>
</div>
</a>
</li>
<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-success">M</span>
</div>
<div class="chat-contact-info flex-grow-1 ms-2">
<h6 class="chat-contact-name text-truncate m-0">Maquetación</h6>
<p class="chat-contact-status text-muted text-truncate mb-0">
Descripcion dpto. Maquetación
</p>
</div>
</a>
</li>
<!-- CHAT LIST -->
</ul>
<!-- Contacts -->
@ -93,17 +51,7 @@
<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">
<!-- <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>
@ -112,7 +60,7 @@
<h6 class="chat-contact-name text-truncate m-0">Jaime Jimenez</h6>
</div>
</a>
</li>
</li> -->
</ul>
</div>
@ -121,7 +69,7 @@
<!-- Chat History -->
<div class="col app-chat-history bg-body">
<div class="chat-history-wrapper">
<div class="chat-history-wrapper ">
<div class="chat-history-header border-bottom">
<div class="d-flex justify-content-between align-items-center">
<div class="d-flex overflow-hidden align-items-center">
@ -157,191 +105,10 @@
</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>
<div class="chat-history-body bg-body ">
<ul class="list-unstyled chat-history" id="chat-conversation">
</ul>
</div>
<!-- Chat message form -->
@ -352,9 +119,10 @@
placeholder="Type your message here"
/>
<div class="message-actions d-flex align-items-center">
<a class="btn btn-primary d-flex send-msg-btn">
<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>
<span class="align-middle d-md-inline-block d-none">Enviar</span>
</a>
</div>
</div>
@ -368,131 +136,17 @@
</div>
</div>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/css/pages/app-chat.css') ?>">
<?= $this->endSection() ?>
<!------------------------------------------------------->
<!-- Código JS logica -->
<!------------------------------------------------------->
<?= $this->section("additionalInlineJs") ?>
/**
* App Chat
*/
// Seleccionar elementos del DOM
const chatContactsBody = document.querySelector('.app-chat-contacts .sidebar-body'),
chatContactListItems = [].slice.call(
document.querySelectorAll('.chat-contact-list-item:not(.chat-contact-list-item-title)')
),
chatHistoryBody = document.querySelector('.chat-history-body'),
chatSidebarLeftUserAbout = document.querySelector('.chat-sidebar-left-user-about'),
messageInput = document.querySelector('.message-input'),
searchInput = document.querySelector('.chat-search-input'),
sendMsgBtn = document.querySelector('.send-msg-btn'); // Seleccionar el botón de envío de mensaje
// Inicializar PerfectScrollbar
if (chatContactsBody) {
new PerfectScrollbar(chatContactsBody, {
wheelPropagation: false,
suppressScrollX: true
});
}
if (chatHistoryBody) {
new PerfectScrollbar(chatHistoryBody, {
wheelPropagation: false,
suppressScrollX: true
});
}
// Función para desplazar el scroll al final
function scrollToBottom() {
if (chatHistoryBody) {
chatHistoryBody.scrollTo(0, chatHistoryBody.scrollHeight);
}
}
scrollToBottom();
// Seleccionar chat o contacto
chatContactListItems.forEach(chatContactListItem => {
chatContactListItem.addEventListener('click', e => {
chatContactListItems.forEach(item => {
item.classList.remove('active');
});
e.currentTarget.classList.add('active');
});
});
// Filtrar chats
if (searchInput) {
searchInput.addEventListener('keyup', e => {
const searchValue = e.currentTarget.value.toLowerCase(),
chatListItem0 = document.querySelector('.chat-list-item-0'),
contactListItem0 = document.querySelector('.contact-list-item-0'),
searchChatListItems = [].slice.call(
document.querySelectorAll('#chat-list li:not(.chat-contact-list-item-title)')
),
searchContactListItems = [].slice.call(
document.querySelectorAll('#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) {
chatListItem0.classList.toggle('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) {
contactListItem0.classList.toggle('d-none', contactListItemsCount !== 0);
}
});
}
// Función para buscar en chats y contactos
function searchChatContacts(searchListItems, searchValue) {
let searchListItemsCount = 0;
searchListItems.forEach(searchListItem => {
const searchListItemText = searchListItem.textContent.toLowerCase();
const matchesSearch = searchListItemText.indexOf(searchValue) !== -1;
searchListItem.classList.toggle('d-flex', matchesSearch);
searchListItem.classList.toggle('d-none', !matchesSearch);
if (matchesSearch) {
searchListItemsCount++;
}
});
return searchListItemsCount;
}
// Enviar mensaje
if (sendMsgBtn) {
sendMsgBtn.addEventListener('click', e => {
e.preventDefault();
if (messageInput.value) {
const renderMsg = document.createElement('div');
renderMsg.className = 'chat-message-text mt-2';
renderMsg.innerHTML = `<p class="mb-0">${messageInput.value}</p>`;
const lastChatMessageWrapper = document.querySelector('li:last-child .chat-message-wrapper');
if (lastChatMessageWrapper) {
lastChatMessageWrapper.appendChild(renderMsg);
}
messageInput.value = '';
scrollToBottom();
}
});
}
<?= $this->section("additionalExternalJs") ?>
<script type="module" src="<?= site_url('assets/js/safekat/pages/chatPresupuesto.js') ?>"></script>
<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

@ -34,9 +34,9 @@
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems") ?>
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios") ?>
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_comentariosItems") ?>
<?= view("themes/vuexy/components/chat_presupuesto",data:["modelId" => $presupuestoId]) ?>
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems") ?>
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems") ?>
<?= view("themes/vuexy/form/presupuestos/cosidotapablanda/_mensajeria") ?>
<?php else: ?>
<input type="hidden" name="total_presupuesto" id="total_presupuesto" class="form-control"
value="0.0"></input>