From 40bccd49fee35b18cc74eeaacde709d245cda87f Mon Sep 17 00:00:00 2001 From: imnavajas Date: Wed, 9 Aug 2023 08:22:48 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20datatables=20editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Clientes/Clientecontactos.php | 65 ++++++++++- .../Models/Clientes/ClienteContactoModel.php | 27 +---- .../clientes/cliente/_clienteFormItems.php | 109 +++++++++++++++++- 3 files changed, 173 insertions(+), 28 deletions(-) diff --git a/ci4/app/Controllers/Clientes/Clientecontactos.php b/ci4/app/Controllers/Clientes/Clientecontactos.php index 2ae5cdef..3bc2f19a 100644 --- a/ci4/app/Controllers/Clientes/Clientecontactos.php +++ b/ci4/app/Controllers/Clientes/Clientecontactos.php @@ -10,6 +10,9 @@ use App\Entities\Clientes\ClienteContactoEntity; use App\Models\Clientes\ClienteModel; use App\Models\Clientes\ClienteContactoModel; +use DataTables\Editor; +use DataTables\Editor\Field; +use DataTables\Editor\Validate; class Clientecontactos extends \App\Controllers\GoBaseResourceController { @@ -206,7 +209,7 @@ class Clientecontactos extends \App\Controllers\GoBaseResourceController $length = $reqData['length'] ?? 5; $search = $reqData['search']['value']; $requestedOrder = $reqData['order']['0']['column'] ?? 1; - $order = ClienteContactoModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 1]; + $order = ClienteContactoModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 1]; $dir = $reqData['order']['0']['dir'] ?? 'asc'; $id_C = $reqData['id_cliente'] ?? -1; @@ -223,13 +226,71 @@ class Clientecontactos extends \App\Controllers\GoBaseResourceController return $this->respond(Collection::datatable( $resourceData, $this->model->getResource()->countAllResults(), - $this->model->getResource($search, $id_C)->countAllResults() + $this->model->getResource("", $id_C)->countAllResults() )); } else { return $this->failUnauthorized('Invalid request', 403); } } + public function datatable_editor() { + if ($this->request->isAJAX()) { + + include(APPPATH . "ThirdParty/DatatablesEditor/DataTables.php"); + + // Build our Editor instance and process the data coming from _POST + $response = Editor::inst( $db, 'cliente_contactos' ) + ->fields( + Field::inst( 'nombre' ) + ->validator( 'Validate::notEmpty',array( + 'message' => 'Falta nombre' ) + ), + Field::inst( 'apellidos' ) + ->validator( 'Validate::notEmpty',array( + 'message' => 'Falta apellidos' ) + ), + Field::inst( 'cargo' ) + ->validator( 'Validate::notEmpty',array( + 'message' => 'Falta cargp' ) + ), + Field::inst( 'telefono' ) + ->validator( 'Validate::notEmpty',array( + 'message' => 'Falta telefono' ) + ), + Field::inst( 'email' ) + ->validator( 'Validate::notEmpty',array( + 'message' => 'Falta email' ) + ), + + Field::inst( 'cliente_id' ), + + ) + ->validator( function($editor, $action, $data){ + if ($action === Editor::ACTION_CREATE || $action === Editor::ACTION_EDIT){ + /*foreach ($data['data'] as $pkey => $values ){ + // No se pueden duplicar valores al crear o al editar + if (!empty($response)){ + return $response; + } + }*/ + } + }) + ->debug(true) + ->process( $_POST ) + ->data(); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $response[$csrfTokenName] = $newTokenHash; + + echo json_encode($response); + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function allItemsSelect() { if ($this->request->isAJAX()) { diff --git a/ci4/app/Models/Clientes/ClienteContactoModel.php b/ci4/app/Models/Clientes/ClienteContactoModel.php index 9ef38f39..5f4c6f68 100644 --- a/ci4/app/Models/Clientes/ClienteContactoModel.php +++ b/ci4/app/Models/Clientes/ClienteContactoModel.php @@ -14,12 +14,11 @@ class ClienteContactoModel extends \App\Models\GoBaseModel protected $useAutoIncrement = true; const SORTABLE = [ - 0 => "t1.cargo", - 1 => "t1.nombre", - 2 => "t1.apellidos", + 0 => "t1.nombre", + 1 => "t1.apellidos", + 2 => "t1.cargo", 3 => "t1.telefono", 4 => "t1.email", - 5 => "t2.nombre", ]; protected $allowedFields = ["cliente_id", "cargo", "nombre", "apellidos", "telefono", "email"]; @@ -109,36 +108,22 @@ class ClienteContactoModel extends \App\Models\GoBaseModel $builder = $this->db ->table($this->table . " t1") ->select( - "t1.id AS id, t1.cargo AS cargo, t1.nombre AS nombre, t1.apellidos AS apellidos, t1.telefono AS telefono, t1.email AS email, t2.nombre AS cliente_id" + "t1.id AS id, t1.cargo AS cargo, t1.nombre AS nombre, t1.apellidos AS apellidos, t1.telefono AS telefono, t1.email AS email, t1.cliente_id AS cliente_id" ); - // IMN - if ($cliente_id != -1) { - $builder->where('cliente_id', $cliente_id); - } + $builder->where('t1.cliente_id', $cliente_id); $builder->where("t1.is_deleted", 0); - $builder->join("clientes t2", "t1.cliente_id = t2.id", "left"); return empty($search) ? $builder : $builder ->groupStart() - ->like("t1.id", $search) - ->orLike("t1.cargo", $search) + ->like("t1.cargo", $search) ->orLike("t1.nombre", $search) ->orLike("t1.apellidos", $search) ->orLike("t1.telefono", $search) ->orLike("t1.email", $search) - ->orLike("t2.id", $search) - ->orLike("t1.id", $search) - ->orLike("t1.cliente_id", $search) - ->orLike("t1.cargo", $search) - ->orLike("t1.nombre", $search) - ->orLike("t1.apellidos", $search) - ->orLike("t1.telefono", $search) - ->orLike("t1.email", $search) - ->orLike("t2.nombre", $search) ->groupEnd(); } } diff --git a/ci4/app/Views/themes/backend/vuexy/form/clientes/cliente/_clienteFormItems.php b/ci4/app/Views/themes/backend/vuexy/form/clientes/cliente/_clienteFormItems.php index 7d3c025b..346f4c91 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/clientes/cliente/_clienteFormItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/clientes/cliente/_clienteFormItems.php @@ -495,7 +495,7 @@ - + @@ -663,12 +663,110 @@ const actionBtns = function(data) { return ` - + + - `; }; + editor = new $.fn.dataTable.Editor( { + ajax: { + url: "", + headers: { + : v, + }, + }, + table : "#tableOfClienteContactos", + idSrc: 'id', + fields: [ { + name: "nombre" + }, { + name: "apellidos" + }, { + name: "cargo" + }, { + name: "telefono" + }, { + name: "email" + }, { + "name": "cliente_id", + "type": "hidden" + },{ + "name": "deleted_at", + "type": "hidden" + },{ + "name": "is_deleted", + "type": "hidden" + }, + ] + } ); + + editor.on( 'preSubmit', function ( e, d, type ) { + if ( type === 'create'){ + d.data[0]['cliente_id'] = id; + } + else if(type === 'edit' ) { + for (v in d.data){ + d.data[v]['cliente_id'] = id; + } + } + }); + + + editor.on( 'postSubmit', function ( e, json, data, action ) { + + yeniden(json.); + }); + + editor.on( 'submitSuccess', function ( e, json, data, action ) { + + theTable.clearPipeline(); + theTable.draw(); + }); + + // Activate an inline edit on click of a table cell + $('#tableOfClienteContactos').on( 'click', 'tbody span.edit', function (e) { + editor.inline( + theTable.cells(this.parentNode.parentNode, '*').nodes(), + { + cancelHtml: '', + cancelTrigger: 'span.cancel', + submitHtml: '', + submitTrigger: 'span.edit', + submit: 'allIfChanged' + } + ); + } ); + + + // Delete row + $('#tableOfClienteContactos').on( 'click', 'tbody span.remove', function (e) { + + Swal.fire({ + title: '', + text: '', + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + confirmButtonText: '', + cancelButtonText: '', + cancelButtonColor: '#d33' + }) + .then((result) => { + const dataId = $(this).data('id'); + const row = $(this).closest('tr'); + if (result.value) { + editor + .create( false ) + .edit( this.parentNode, false) + .set( 'deleted_at', new Date().toISOString().slice(0, 19).replace('T', ' ') ) + .set( 'is_deleted', 1 ) + .submit(); + + } + }); + }); + var theTable = $('#tableOfClienteContactos').DataTable( { serverSide: true, processing: true, @@ -717,7 +815,7 @@ language: { url: "//cdn.datatables.net/plug-ins/1.13.4/i18n/i18n ?>.json" }, - /*buttons: [ { + buttons: [ { className: 'btn btn-primary float-end me-sm-3 me-1', extend: "createInline", editor: editor, @@ -725,7 +823,7 @@ submitTrigger: -1, submitHtml: '' } - } ]*/ + } ] } ); @@ -733,6 +831,7 @@ section('css') ?> + endSection() ?> section('additionalExternalJs') ?>