mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
avances de hoy
This commit is contained in:
@ -690,6 +690,23 @@ $routes->group(
|
||||
);
|
||||
$routes->resource('buscadorpresupuestos', ['namespace' => 'App\Controllers\Presupuestos', 'controller' => 'Buscador', 'except' => 'show,new,create,update']);
|
||||
|
||||
/* Rutas para mensajeria */
|
||||
$routes->group('mensajes', ['namespace' => 'App\Controllers\Mensajeria'], function ($routes) {
|
||||
|
||||
/* Interna */
|
||||
$routes->group('internos', ['namespace' => 'App\Controllers\Mensajeria'], function ($routes) {
|
||||
|
||||
$routes->get('', 'MensajesDirectos::index', ['as' => 'mensajeriaView']);
|
||||
$routes->get('chat/(:num)', 'MensajesDirectos::getChatInfo/$1', ['as' => 'getChatInfo']);
|
||||
/*$routes->match(['get', 'post'], 'add', 'TarifaAcabados::add', ['as' => 'tarifaAcabadoAdd']);
|
||||
$routes->match(['get', 'post'], 'edit/(:num)', 'TarifaAcabados::edit/$1', ['as' => 'tarifaAcabadoEdit']);
|
||||
$routes->get('delete/(:num)', 'TarifaAcabados::delete/$1', ['as' => 'tarifaAcabadoDelete']);
|
||||
$routes->post('datatable', 'TarifaAcabados::datatable', ['as' => 'tarifaAcabadoDT']);*/
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
|
||||
@ -117,5 +117,13 @@ class Js_loader extends BaseController
|
||||
$this->response->setHeader('Content-Type', 'text/javascript');
|
||||
return view('themes/vuexy/form/presupuestos/cliente/previews.js');
|
||||
}
|
||||
|
||||
function chat_js()
|
||||
{
|
||||
$this->response->setHeader('Content-Type', 'text/javascript');
|
||||
return view('themes/vuexy/form/mensajes/mensajeria.js');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
80
ci4/app/Controllers/Mensajeria/MensajesDirectos.php
Normal file
80
ci4/app/Controllers/Mensajeria/MensajesDirectos.php
Normal file
@ -0,0 +1,80 @@
|
||||
<?php namespace App\Controllers\Mensajeria;
|
||||
|
||||
|
||||
use App\Controllers\BaseResourceController;
|
||||
use App\Entities\Mensajeria\ConversacionEntity;
|
||||
use App\Entities\Sistema\ActivityEntity;
|
||||
use App\Models\CollectionModel;
|
||||
use App\Models\Mensajeria\ConversacionModel;
|
||||
use App\Models\Sistema\ActivityModel;
|
||||
|
||||
class MensajesDirectos extends BaseResourceController
|
||||
{
|
||||
|
||||
protected $modelName = ConversacionModel::class;
|
||||
protected $format = 'json';
|
||||
|
||||
protected static $controllerSlug = 'mensajes-internos';
|
||||
|
||||
protected static $viewPath = 'themes/vuexy/form/mensajes/';
|
||||
|
||||
protected static $indexRoute = 'mensajesView';
|
||||
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
|
||||
{
|
||||
$this->viewData['pageTitle'] = "Mensajeria interna";
|
||||
|
||||
// Breadcrumbs
|
||||
$this->viewData['breadcrumb'] = [
|
||||
['title' => "Home", 'route' => "javascript:void(0);", 'active' => false],
|
||||
['title' => lang("App.menu_mensajes"), 'route' => route_to('mensajeriaView'), 'active' => true]
|
||||
];
|
||||
|
||||
parent::initController($request, $response, $logger);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
|
||||
// Modelos
|
||||
$participantModel = model('App\Models\Mensajeria\ParticipanteModel');
|
||||
|
||||
|
||||
$viewData = [
|
||||
'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Paises.pais')]),
|
||||
'conversacionesEntity' => new ConversacionEntity(),
|
||||
'usingServerSideDataTable' => true,
|
||||
];
|
||||
|
||||
//$viewData['conversaciones'] = $participantModel->getChatsByUser(auth()->user()->id);
|
||||
$viewData['conversaciones'] = $participantModel->getChatsByUser(639);
|
||||
|
||||
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
|
||||
|
||||
return view(static::$viewPath . static::$indexRoute, $viewData);
|
||||
}
|
||||
|
||||
|
||||
public function getChatInfo($conversacionId)
|
||||
{
|
||||
// Modelos
|
||||
$conversacionModel = model('App\Models\Mensajeria\ConversacionModel');
|
||||
|
||||
// Verificar si es una solicitud AJAX
|
||||
if ($this->request->isAJAX()) {
|
||||
// Obtener los datos
|
||||
$data = [
|
||||
'people' => $conversacionModel->getChatParticipants($conversacionId),
|
||||
'messages' => $conversacionModel->getChatMessages($conversacionId)
|
||||
];
|
||||
|
||||
// Devolver respuesta JSON
|
||||
return $this->respond($data, 200, 'Chat information retrieved successfully');
|
||||
} else {
|
||||
return $this->failForbidden('Only AJAX requests are allowed');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -20,27 +20,30 @@ class Test extends BaseController
|
||||
|
||||
public function index()
|
||||
{
|
||||
$model = new PresupuestoModel();
|
||||
$data = $model->generarLineaPedido(123);
|
||||
echo '<pre>';
|
||||
var_dump($data);
|
||||
echo '</pre>';
|
||||
// Modelos
|
||||
$conversacionModel = model('App\Models\Mensajeria\ConversacionModel');
|
||||
|
||||
|
||||
echo "<pre>";
|
||||
echo var_dump($conversacionModel->getChatMessages(190286));
|
||||
echo "</pre>";
|
||||
|
||||
|
||||
}
|
||||
|
||||
private function clonar_tarifa_encuadernacion($teOrigen, $teDestino){
|
||||
private function clonar_tarifa_encuadernacion($teOrigen, $teDestino)
|
||||
{
|
||||
|
||||
$tet_model = model('App\Models\Tarifas\TarifaEncuadernacionTiradaModel');
|
||||
$tel_model = model('App\Models\Tarifas\TarifaEncuadernacionLineaModel');
|
||||
|
||||
$tarifasTiradas = $tet_model->asObject()->where('tarifa_encuadernacion_id',$teOrigen)->findAll();
|
||||
$tarifasTiradas = $tet_model->asObject()->where('tarifa_encuadernacion_id', $teOrigen)->findAll();
|
||||
|
||||
foreach ($tarifasTiradas as $tarifasTirada){
|
||||
foreach ($tarifasTiradas as $tarifasTirada) {
|
||||
|
||||
echo "--->" . $tarifasTirada->id . "<br>";
|
||||
|
||||
$tarifasLineas = $tel_model->asObject()->where('tirada_encuadernacion_id',$tarifasTirada->id)->findAll();
|
||||
$tarifasLineas = $tel_model->asObject()->where('tirada_encuadernacion_id', $tarifasTirada->id)->findAll();
|
||||
|
||||
// Prepare the data
|
||||
unset($tarifasTirada->id);
|
||||
@ -53,7 +56,7 @@ class Test extends BaseController
|
||||
$tet_model->insert($tarifasTirada);
|
||||
$inserted_id = $tet_model->insertID();
|
||||
|
||||
foreach ($tarifasLineas as $tarifasLinea){
|
||||
foreach ($tarifasLineas as $tarifasLinea) {
|
||||
|
||||
echo "------>" . $tarifasLinea->id . "<br>";
|
||||
|
||||
@ -73,11 +76,10 @@ class Test extends BaseController
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function test_get_tirada_alt($tirada, $merma, $tipo_impresion_id,
|
||||
$json_data, $cliente_id, $ancho, $alto,
|
||||
$solapas_cubierta, $solapas_ancho_cubierta, $solapas_sobrecubierta, $solapas_ancho_sobrecubierta, $lomo)
|
||||
{
|
||||
private function test_get_tirada_alt($tirada, $merma, $tipo_impresion_id,
|
||||
$json_data, $cliente_id, $ancho, $alto,
|
||||
$solapas_cubierta, $solapas_ancho_cubierta, $solapas_sobrecubierta, $solapas_ancho_sobrecubierta, $lomo)
|
||||
{
|
||||
$values = [];
|
||||
|
||||
if ($json_data) {
|
||||
@ -160,7 +162,6 @@ class Test extends BaseController
|
||||
}
|
||||
|
||||
|
||||
|
||||
$opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor);
|
||||
|
||||
$datosTipolog = $linea['gotaNegro'] ?? null;
|
||||
@ -214,7 +215,7 @@ class Test extends BaseController
|
||||
|
||||
// Previo a ejecutar, vaciar la tabla clientes_precios (ojo si hay customizaciones)
|
||||
|
||||
$db = \Config\Database::connect();
|
||||
$db = \Config\Database::connect();
|
||||
$builder = $db->table('cliente_precios');
|
||||
|
||||
$plantillaDefectoId = 5;
|
||||
@ -525,7 +526,6 @@ class Test extends BaseController
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static function testLineasIntRotativa()
|
||||
{
|
||||
|
||||
@ -533,7 +533,6 @@ class Test extends BaseController
|
||||
$tipo = 'negro';
|
||||
|
||||
|
||||
|
||||
$datosPedido = (object)array(
|
||||
'paginas' => 240,
|
||||
'tirada' => 100,
|
||||
@ -546,8 +545,8 @@ class Test extends BaseController
|
||||
|
||||
$parametrosRotativa = (object)array(
|
||||
'a_favor_fibra' => 0,
|
||||
'bnPages' => 240,
|
||||
'colorPages' => 0,
|
||||
'bnPages' => 240,
|
||||
'colorPages' => 0,
|
||||
'rotativa_gota_negro' => 0,
|
||||
'rotativa_gota_color' => 0,
|
||||
);
|
||||
@ -579,12 +578,12 @@ class Test extends BaseController
|
||||
var_dump($datosTipologias);
|
||||
echo '</pre>';
|
||||
|
||||
$parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro;
|
||||
$parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color;
|
||||
$parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro;
|
||||
$parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan;
|
||||
$parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta;
|
||||
$parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo;
|
||||
$parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro;
|
||||
$parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color;
|
||||
$parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro;
|
||||
$parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan;
|
||||
$parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta;
|
||||
$parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo;
|
||||
|
||||
echo '-------------------------------';
|
||||
$maquinas = $maquina_model->getMaquinaImpresionForPresupuesto(
|
||||
@ -596,7 +595,6 @@ class Test extends BaseController
|
||||
);
|
||||
|
||||
|
||||
|
||||
foreach ($maquinas as $maquina) {
|
||||
|
||||
echo '----------------------------<br>';
|
||||
|
||||
@ -46,6 +46,69 @@ class ConversacionModel extends Model
|
||||
->get()
|
||||
->getFirstRow();
|
||||
}
|
||||
|
||||
|
||||
public function getConversacion($convesacionId)
|
||||
{
|
||||
$builder = $this->db
|
||||
->table($this->table . " t1")
|
||||
//->select("t1.conversacion_id AS id, t2.asunto AS asunto")
|
||||
->where("t1.id", $convesacionId)
|
||||
->join("chat_participantes t2", "t2.conversacion_id = t1.id", "left")
|
||||
->join("chat_mensajes t3", "t3.conversacion_id = t1.id", "left")
|
||||
->orderBy('t1.created_at', 'DESC')
|
||||
->get()
|
||||
->getResultArray();
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
public function getChatParticipants($chatId)
|
||||
{
|
||||
return $this->db
|
||||
->table($this->table . " t1")
|
||||
->select("t2.usuario_id as user_id, t3.first_name AS nombre, t3.last_name AS apellidos")
|
||||
->where("t1.id", $chatId)
|
||||
->join("chat_participantes t2", "t2.conversacion_id = t1.id", "left")
|
||||
->join("users t3", "t3.id = t2.usuario_id", "left")
|
||||
->get()
|
||||
->getResultArray();
|
||||
}
|
||||
|
||||
public function getChatMessages($chatId)
|
||||
{
|
||||
return $this->db
|
||||
->table($this->table . " t1")
|
||||
->select("t2.mensaje AS mensaje, t2.usuario_id as user_id")
|
||||
->select("t3.first_name AS nombre, t3.last_name AS apellidos")
|
||||
->where("t1.id", intval($chatId))
|
||||
->join("chat_mensajes t2", "t2.conversacion_id = t1.id", "left")
|
||||
->join("users t3", "t3.id = t2.usuario_id", "left")
|
||||
->get()
|
||||
->getResultArray();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Devuelve si la conversacion tiene algún cliente
|
||||
|
||||
@ -20,7 +20,29 @@ class ParticipanteModel extends BaseModel
|
||||
'last_read',
|
||||
];
|
||||
|
||||
protected $useTimestamps = true;
|
||||
public function getPeopleInChat($conversacionId){
|
||||
|
||||
$builder = $this->db
|
||||
->table($this->table . " t1")
|
||||
->where("t1.conversacion_id", $conversacionId);
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
public function getChatsByUser($userId){
|
||||
|
||||
$builder = $this->db
|
||||
->table($this->table . " t1")
|
||||
->select("t1.conversacion_id AS id, t2.asunto AS asunto")
|
||||
->where("t1.usuario_id", $userId)
|
||||
->join("chat_conversaciones t2", "t2.id = conversacion_id", "left")
|
||||
->orderBy('t1.created_at', 'DESC')
|
||||
->get()
|
||||
->getResultObject();
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
|
||||
public function getCustomer()
|
||||
{
|
||||
|
||||
138
ci4/app/Views/themes/vuexy/form/mensajes/mensajeria.js
Normal file
138
ci4/app/Views/themes/vuexy/form/mensajes/mensajeria.js
Normal 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);
|
||||
}
|
||||
});
|
||||
})
|
||||
;
|
||||
364
ci4/app/Views/themes/vuexy/form/mensajes/mensajesView.php
Normal file
364
ci4/app/Views/themes/vuexy/form/mensajes/mensajesView.php
Normal 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() ?>
|
||||
@ -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>
|
||||
|
||||
Reference in New Issue
Block a user