diff --git a/ci4/app/Controllers/GoBaseController.php b/ci4/app/Controllers/GoBaseController.php index 04a9709c..61dc5e64 100644 --- a/ci4/app/Controllers/GoBaseController.php +++ b/ci4/app/Controllers/GoBaseController.php @@ -103,6 +103,24 @@ abstract class GoBaseController extends Controller { */ public $viewData; + + /** + * JJO: Variable para indicar si el controlador hace soft_delete o no + * + * @var bool + */ + public $soft_delete = false; + /** + * JJO: Variable quién puede ver los registros borrados + * + * 0 -> Not Deleted + * 1 -> Soft Deleted, shows up in lists of deleted items for management users + * 2 -> Soft Deleted, does not show up for any user except admin users + * 3 -> Only shows up for developers. + * @var int + */ + public $delete_flag = 0; + public $currentAction; /** @@ -208,7 +226,12 @@ abstract class GoBaseController extends Controller { } if (isset($this->primaryModel) && isset(static::$singularObjectNameCc) && !empty(static::$singularObjectNameCc) && !isset($this->viewData[(static::$singularObjectNameCc) . 'List'])) { - $this->viewData[(static::$singularObjectNameCc) . 'List'] = $this->primaryModel->asObject()->findAll(); + //JJO + if ($this->soft_delete): + $this->viewData[(static::$singularObjectNameCc) . 'List'] = $this->primaryModel->asObject()->where('is_deleted', 0)->findAll(); + else: + $this->viewData[(static::$singularObjectNameCc) . 'List'] = $this->primaryModel->asObject()->findAll(); + endif; } // if $this->currentView is assigned a view name, use it, otherwise assume the view something like 'viewSingleObjectList' @@ -323,12 +346,19 @@ abstract class GoBaseController extends Controller { if (!isset($error)) : try { - if ($deletePermanently) : - if (is_numeric($id)) : + if ($deletePermanently && !$this->soft_delete) : + if (is_numeric($id)) : $rawResult = $this->primaryModel->delete($id); else: $rawResult = $this->primaryModel->where($this->primaryModel->getPrimaryKeyName(), $id)->delete(); endif; + elseif ($this->soft_delete): + $datetime = (new \CodeIgniter\I18n\Time("now")); + $rawResult = $this->primaryModel->where('id',$id) + ->set(['deleted_at' => $datetime->format('Y-m-d H:i:s'), + 'is_deleted' => $this->delete_flag]) + ->update(); + else: $rawResult = $this->primaryModel->update($id, ['deleted' => true]); endif; diff --git a/ci4/app/Controllers/Tarifas/Tarifaacabado.php b/ci4/app/Controllers/Tarifas/Tarifaacabado.php index 3f5e3940..52713db3 100644 --- a/ci4/app/Controllers/Tarifas/Tarifaacabado.php +++ b/ci4/app/Controllers/Tarifas/Tarifaacabado.php @@ -21,6 +21,10 @@ class Tarifaacabado extends \App\Controllers\GoBaseController { public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { $this->viewData['pageTitle'] = lang('Tarifaacabado.moduleTitle'); + // Se indica que este controlador trabaja con soft_delete + $this->soft_delete = true; + // Se indica el flag para los ficheros borrados + $this->delete_flag = 1; parent::initController($request, $response, $logger); } @@ -101,6 +105,7 @@ class Tarifaacabado extends \App\Controllers\GoBaseController { public function edit($requestedId = null) { + // JJO $session = session(); if ($requestedId == null) : @@ -123,7 +128,11 @@ class Tarifaacabado extends \App\Controllers\GoBaseController { $postData = $this->request->getPost(); $sanitizedData = $this->sanitized($postData, $nullIfEmpty); - $sanitizedData['user_update_id'] = $session->id_user; + // JJO + if(isset($this->model->user_update_id)){ + $sanitizedData['user_update_id'] = $session->id_user; + } + $noException = true; if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : @@ -224,81 +233,5 @@ class Tarifaacabado extends \App\Controllers\GoBaseController { } else { return $this->failUnauthorized('Invalid request', 403); } - } - - public function delete($requestedId, bool $deletePermanently = false) { - - if (is_string($requestedId)) : - if (is_numeric($requestedId)) : - $id = filter_var($requestedId, FILTER_SANITIZE_NUMBER_INT); - else: - $onlyAlphaNumeric = true; - $fromGetRequest = true; - $idSanitization = goSanitize($requestedId, $onlyAlphaNumeric, $fromGetRequest); // filter_var(trim($requestedId), FILTER_SANITIZE_FULL_SPECIAL_CHARS); - $id = $idSanitization[0]; - endif; - else: - $id = intval($requestedId); - endif; - - if (empty($id) || $id === 0) : - $error = 'Invalid identifier provided to delete the object.'; - endif; - - $rawResult = null; - - if (!isset($error)) : - try { - if ($deletePermanently) : - if (is_numeric($id)) : - $rawResult = $this->primaryModel->delete($id); - else: - $rawResult = $this->primaryModel->where($this->primaryModel->getPrimaryKeyName(), $id)->delete(); - endif; - else: - $datetime = (new \CodeIgniter\I18n\Time("now")); - $rawResult = $this->primaryModel->where('id',$id) - ->set(['deleted_at' => $datetime->format('Y-m-d H:i:s')]) - ->update(); - endif; - } catch (\Exception $e) { - log_message('error', "Exception: Error deleting object named '".(static::$singularObjectName ?? 'unknown')."' with $id :\r\n".$e->getMessage()); - } - endif; - - $ar = $this->primaryModel->db->affectedRows(); - - try { - $dbError = $this->primaryModel->db->error(); - } catch (\Exception $e2) { - if ($e2->getMessage() != "Trying to get property 'errno' of non-object") { - log_message('error', $e2->getCode() . ' : ' . $e2->getMessage()) ; - } - } - if (isset($dbError['code']) && isset($dbError['message'])) { - log_message('error', $dbError['code'].' '.$dbError['message']); - } else { - $dbError = ['code' => '', 'message'=>'']; - } - - $result = ['persisted'=>$ar>0, 'ar'=>$ar, 'persistedId'=>null, 'affectedRows'=>$ar, 'errorCode'=>$dbError['code'], 'error'=>$dbError['message']]; - - $nameOfDeletedObject = static::$singularObjectNameCc; - - if ($ar < 1) : - $errorMessage = lang('Basic.global.deleteError', [$nameOfDeletedObject]); // 'No ' . static::$singularObjectName . ' was deleted now, because it probably had already been deleted.'; - $fdKey = isset($this->viewData['usingSweetAlert'] ) && $this->viewData['usingSweetAlert'] ? 'sweet-error' : 'errorMessage'; - $errorMessage = str_replace("'", "\'", $errorMessage); - return $this->redirect2listView($fdKey, str_replace("'", '', $errorMessage)); - else: - $message = lang('Basic.global.deleteSuccess', [$nameOfDeletedObject]); // 'The ' . static::$singularObjectName . ' was successfully deleted.'; - $fdKey = isset($this->viewData['usingSweetAlert'] ) && $this->viewData['usingSweetAlert'] ? 'sweet-success' : 'successMessage'; - if ($result['affectedRows']>1) : - log_message('warning', "More than one row has been deleted in attempt to delete row for object named '".(static::$singularObjectName ?? 'unknown')."' with id: $id"); - endif; - $message = str_replace("'", "\'", $message); - return $this->redirect2listView($fdKey, $message); - endif; - } - + } } diff --git a/ci4/app/Controllers/Tarifas/Tarifamanipulado.php b/ci4/app/Controllers/Tarifas/Tarifamanipulado.php index 4f29e7a8..7b28b845 100644 --- a/ci4/app/Controllers/Tarifas/Tarifamanipulado.php +++ b/ci4/app/Controllers/Tarifas/Tarifamanipulado.php @@ -22,6 +22,10 @@ class Tarifamanipulado extends \App\Controllers\GoBaseController { public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { $this->viewData['pageTitle'] = lang('Tarifamanipulado.moduleTitle'); + // Se indica que este controlador trabaja con soft_delete + $this->soft_delete = true; + // Se indica el flag para los ficheros borrados + $this->delete_flag = 1; parent::initController($request, $response, $logger); } @@ -101,6 +105,9 @@ class Tarifamanipulado extends \App\Controllers\GoBaseController { public function edit($requestedId = null) { + // JJO + $session = session(); + if ($requestedId == null) : return $this->redirect2listView(); endif; @@ -119,9 +126,12 @@ class Tarifamanipulado extends \App\Controllers\GoBaseController { $nullIfEmpty = true; // !(phpversion() >= '8.1'); $postData = $this->request->getPost(); - $sanitizedData = $this->sanitized($postData, $nullIfEmpty); - + $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + // JJO + if(isset($this->model->user_update_id)){ + $sanitizedData['user_update_id'] = $session->id_user; + } $noException = true; if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : diff --git a/ci4/app/Controllers/Tarifas/Tarifapreimpresion.php b/ci4/app/Controllers/Tarifas/Tarifapreimpresion.php index b8c2e9a2..000066c4 100644 --- a/ci4/app/Controllers/Tarifas/Tarifapreimpresion.php +++ b/ci4/app/Controllers/Tarifas/Tarifapreimpresion.php @@ -22,6 +22,10 @@ class Tarifapreimpresion extends \App\Controllers\GoBaseController { public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { $this->viewData['pageTitle'] = lang('Preimpresions.moduleTitle'); + // Se indica que este controlador trabaja con soft_delete + $this->soft_delete = true; + // Se indica el flag para los ficheros borrados + $this->delete_flag = 1; parent::initController($request, $response, $logger); } @@ -100,7 +104,10 @@ class Tarifapreimpresion extends \App\Controllers\GoBaseController { } // end function add() public function edit($requestedId = null) { - + + // JJO + $session = session(); + if ($requestedId == null) : return $this->redirect2listView(); endif; @@ -119,9 +126,12 @@ class Tarifapreimpresion extends \App\Controllers\GoBaseController { $nullIfEmpty = true; // !(phpversion() >= '8.1'); $postData = $this->request->getPost(); - $sanitizedData = $this->sanitized($postData, $nullIfEmpty); - + $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + // JJO + if(isset($this->model->user_update_id)){ + $sanitizedData['user_update_id'] = $session->id_user; + } $noException = true; if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : diff --git a/ci4/app/Entities/Tarifas/TarifaacabadoEntity.php b/ci4/app/Entities/Tarifas/TarifaacabadoEntity.php index b4b85a2e..93e46dbc 100644 --- a/ci4/app/Entities/Tarifas/TarifaacabadoEntity.php +++ b/ci4/app/Entities/Tarifas/TarifaacabadoEntity.php @@ -17,6 +17,7 @@ class TarifaacabadoEntity extends Entity "user_created_id" => 1, "user_update_id" => 1, "deleted_at" => null, + "is_deleted" => 0, "created_at" => null, "updated_at" => null, ]; diff --git a/ci4/app/Entities/Tarifas/TarifamanipuladoEntity.php b/ci4/app/Entities/Tarifas/TarifamanipuladoEntity.php index c1c852dd..22c1969e 100644 --- a/ci4/app/Entities/Tarifas/TarifamanipuladoEntity.php +++ b/ci4/app/Entities/Tarifas/TarifamanipuladoEntity.php @@ -17,6 +17,8 @@ class TarifamanipuladoEntity extends \CodeIgniter\Entity\Entity "formula_price" => null, "user_created_id" => 1, "user_update_id" => 1, + "deleted_at" => null, + "is_deleted" => 0, "created_at" => null, "updated_at" => null, ]; diff --git a/ci4/app/Entities/Tarifas/TarifapreimpresionEntity.php b/ci4/app/Entities/Tarifas/TarifapreimpresionEntity.php index f1a11d29..65534647 100644 --- a/ci4/app/Entities/Tarifas/TarifapreimpresionEntity.php +++ b/ci4/app/Entities/Tarifas/TarifapreimpresionEntity.php @@ -11,6 +11,8 @@ class TarifapreimpresionEntity extends \CodeIgniter\Entity\Entity "precio" => null, "user_created_id" => 1, "user_update_id" => 1, + "deleted_at" => null, + "is_deleted" => 0, "created_at" => null, "updated_at" => null, ]; diff --git a/ci4/app/Models/Tarifas/TarifaacabadoModel.php b/ci4/app/Models/Tarifas/TarifaacabadoModel.php index f835b09e..73a359a2 100644 --- a/ci4/app/Models/Tarifas/TarifaacabadoModel.php +++ b/ci4/app/Models/Tarifas/TarifaacabadoModel.php @@ -26,12 +26,13 @@ class TarifaacabadoModel extends \App\Models\GoBaseModel "ajuste", "formula_price", "deleted_at", + "is_deleted", "user_created_id", "user_update_id", ]; protected $returnType = "App\Entities\Tarifas\TarifaacabadoEntity"; - public static $labelField = "Select a field..."; + public static $labelField = "nombre"; protected $validationRules = [ "ajuste" => [ diff --git a/ci4/app/Models/Tarifas/TarifamanipuladoModel.php b/ci4/app/Models/Tarifas/TarifamanipuladoModel.php index 4e653e79..640325ec 100644 --- a/ci4/app/Models/Tarifas/TarifamanipuladoModel.php +++ b/ci4/app/Models/Tarifas/TarifamanipuladoModel.php @@ -21,6 +21,8 @@ class TarifamanipuladoModel extends \App\Models\GoBaseModel "ajuste", "ajuste_total_pedido", "formula_price", + "deleted_at", + "is_deleted", "user_created_id", "user_update_id", ]; @@ -28,10 +30,9 @@ class TarifamanipuladoModel extends \App\Models\GoBaseModel protected $useTimestamps = true; protected $useSoftDeletes = false; - protected $createdField = "created_at"; - protected $updatedField = "updated_at"; + protected $deletedField = 'deleted_at'; public static $labelField = "nombre"; @@ -68,14 +69,6 @@ class TarifamanipuladoModel extends \App\Models\GoBaseModel "label" => "Manipuladoes.tiradaMin", "rules" => "required|integer", ], - "user_created_id" => [ - "label" => "Manipuladoes.userCreatedId", - "rules" => "required|integer", - ], - "user_update_id" => [ - "label" => "Manipuladoes.userUpdateId", - "rules" => "required|integer", - ], ]; protected $validationMessages = [ @@ -110,14 +103,6 @@ class TarifamanipuladoModel extends \App\Models\GoBaseModel "tirada_min" => [ "integer" => "Manipuladoes.validation.tirada_min.integer", "required" => "Manipuladoes.validation.tirada_min.required", - ], - "user_created_id" => [ - "integer" => "Manipuladoes.validation.user_created_id.integer", - "required" => "Manipuladoes.validation.user_created_id.required", - ], - "user_update_id" => [ - "integer" => "Manipuladoes.validation.user_update_id.integer", - "required" => "Manipuladoes.validation.user_update_id.required", - ], + ] ]; } diff --git a/ci4/app/Models/Tarifas/TarifapreimpresionModel.php b/ci4/app/Models/Tarifas/TarifapreimpresionModel.php index 8d1e319f..4d99f487 100644 --- a/ci4/app/Models/Tarifas/TarifapreimpresionModel.php +++ b/ci4/app/Models/Tarifas/TarifapreimpresionModel.php @@ -12,15 +12,21 @@ class TarifapreimpresionModel extends \App\Models\GoBaseModel */ protected $useAutoIncrement = true; - protected $allowedFields = ["nombre", "precio", "user_created_id", "user_update_id"]; + protected $allowedFields = [ + "nombre", + "precio", + "deleted_at", + "is_deleted", + "user_created_id", + "user_update_id"]; protected $returnType = "App\Entities\Tarifas\TarifapreimpresionEntity"; protected $useTimestamps = true; protected $useSoftDeletes = false; protected $createdField = "created_at"; - protected $updatedField = "updated_at"; + protected $deletedField = 'deleted_at'; public static $labelField = "nombre"; @@ -32,15 +38,7 @@ class TarifapreimpresionModel extends \App\Models\GoBaseModel "precio" => [ "label" => "Tarifapreimpresion.precio", "rules" => "required|decimal", - ], - "user_created_id" => [ - "label" => "Tarifapreimpresion.userCreatedId", - "rules" => "required|integer", - ], - "user_update_id" => [ - "label" => "Tarifapreimpresion.userUpdateId", - "rules" => "required|integer", - ], + ] ]; protected $validationMessages = [ @@ -52,13 +50,5 @@ class TarifapreimpresionModel extends \App\Models\GoBaseModel "decimal" => "Tarifapreimpresion.validation.precio.decimal", "required" => "Tarifapreimpresion.validation.precio.required", ], - "user_created_id" => [ - "integer" => "Tarifapreimpresion.validation.user_created_id.integer", - "required" => "Tarifapreimpresion.validation.user_created_id.required", - ], - "user_update_id" => [ - "integer" => "Tarifapreimpresion.validation.user_update_id.integer", - "required" => "Tarifapreimpresion.validation.user_update_id.required", - ], ]; } diff --git a/ci4/app/Views/themes/backend/vuexy/form/tarifas/acabado/_tarifaacabadoFormItems.php b/ci4/app/Views/themes/backend/vuexy/form/tarifas/acabado/_tarifaacabadoFormItems.php index 758e3ab7..8fe282b7 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/tarifas/acabado/_tarifaacabadoFormItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/tarifas/acabado/_tarifaacabadoFormItems.php @@ -14,13 +14,6 @@ -
- - -
-
+
+ + +
+
-
- - -
-
+
+ + +
+
- + - + */ ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/tarifas/manipulado/viewTarifamanipuladoList.php b/ci4/app/Views/themes/backend/vuexy/form/tarifas/manipulado/viewTarifamanipuladoList.php index 93954ca2..e783cb53 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/tarifas/manipulado/viewTarifamanipuladoList.php +++ b/ci4/app/Views/themes/backend/vuexy/form/tarifas/manipulado/viewTarifamanipuladoList.php @@ -15,28 +15,34 @@ + + */ ?> - + + + */ ?> + id ?> + */ ?> @@ -44,10 +50,10 @@ tirada_min) ?> + user_created_id) ?> @@ -73,6 +80,7 @@ + */ ?>
nombre) || strlen($item->nombre) < 51 ? esc($item->nombre) : character_limiter(esc($item->nombre), 50) ?> - precio_min) ?> + tirada_max) ?> - tirada_max) ?> + precio_min) ?> precio_max) ?> @@ -61,6 +67,7 @@ formula_price) || strlen($item->formula_price) < 51 ? esc($item->formula_price) : character_limiter(esc($item->formula_price), 50) ?> updated_at) ? '' : date('d/m/Y H:m:s', strtotime($item->updated_at)) ?> id), lang('Basic.global.edit'), ['class'=>'btn btn-sm btn-warning btn-edit me-1', 'data-id'=>$item->id,]); ?> 'btn btn-sm btn-danger btn-delete ms-1', 'data-href'=>route_to('deleteTarifamanipulado', $item->id), 'data-bs-toggle'=>'modal', 'data-bs-target'=>'#confirm2delete']); ?> @@ -136,7 +144,7 @@ "scrollX": true, "stateSave": true, "language": { - url: "/assets/dt/languages[$currentLocale] ?? config('Basics')->i18n ?>.json" + url: "//cdn.datatables.net/plug-ins/1.13.4/i18n/i18n ?>.json" }, "columnDefs": [ { diff --git a/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/_tarifapreimpresionFormItems.php b/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/_tarifapreimpresionFormItems.php index 94ef4d53..1b02eb61 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/_tarifapreimpresionFormItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/_tarifapreimpresionFormItems.php @@ -13,7 +13,7 @@ - + - + */ ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/viewTarifapreimpresionList.php b/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/viewTarifapreimpresionList.php index 845df211..90483867 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/viewTarifapreimpresionList.php +++ b/ci4/app/Views/themes/backend/vuexy/form/tarifas/preimpresion/viewTarifapreimpresionList.php @@ -15,28 +15,35 @@ + + */ ?> + + */ ?> + id ?> + */ ?> + user_created_id) ?> @@ -49,6 +56,7 @@ + */ ?> + + + +7.- Modificar las fechas de esto: date('mm/dd/YYYY H:i' a esto date('d/m/Y H:m:s' +8.- Cambiar los botones de exportar de sitio: "dom": 'lfrtipB' por "dom": 'lfBrtip' +9.- Poner el botón de añadir debajo del h3 del card header en lugar del footer +10.- Copiar las nuevas rutas + + + + + + + +Pasos para añadir el soft delete a una tabla +1.- En la bbdd añadir la columna is_deleted (TINYINT, 4 bits, sin signo, valor predeterminado '0') +2.- En la bbdd añadir la columna deleted_at (TIMESTAMP, permitir NULL, valor predeterminado NULL) +3.- En la entidad añadir a los atributos: + "deleted_at" => null, + "is_deleted" => 0, +4.- En el modelo. Añadir en allowedFields: + "deleted_at", + "is_deleted", + También añadir la variable protected $deletedField = 'deleted_at'; +5.- En el controlador: + En el index añadir debajo de $this->view.. + // Se indica que este controlador trabaja con soft_delete + $this->soft_delete = true; + // Se indica el flag para los ficheros borrados + $this->delete_flag = 1; + En el edit: justo al principio + // JJO + $session = session(); + + debajo de $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + + // JJO + if(isset($this->model->user_update_id)){ + $sanitizedData['user_update_id'] = $session->id_user; + } \ No newline at end of file
nombre) || strlen($item->nombre) < 51 ? esc($item->nombre) : character_limiter(esc($item->nombre), 50) ?> precio) ?> updated_at) ? '' : date('d/m/Y H:m:s', strtotime($item->updated_at)) ?> id), lang('Basic.global.edit'), ['class'=>'btn btn-sm btn-warning btn-edit me-1', 'data-id'=>$item->id,]); ?> 'btn btn-sm btn-danger btn-delete ms-1', 'data-href'=>route_to('deleteTarifapreimpresion', $item->id), 'data-bs-toggle'=>'modal', 'data-bs-target'=>'#confirm2delete']); ?> @@ -111,7 +119,7 @@ "scrollX": true, "stateSave": true, "language": { - url: "/assets/dt/languages[$currentLocale] ?? config('Basics')->i18n ?>.json" + url: "//cdn.datatables.net/plug-ins/1.13.4/i18n/i18n ?>.json" }, "columnDefs": [ { diff --git a/from mac to app.txt b/from mac to app.txt new file mode 100644 index 00000000..ac7755ca --- /dev/null +++ b/from mac to app.txt @@ -0,0 +1,53 @@ +Pasos para usar ficheros del mac +1.- Copiar controlador, modelo, vistas y entidad +2.- Copiar los ficheros de idioma. Le pone nombre raro (por ejemplo: Manipuladoes.php en lugar de Tarifamanipulado.php). Buscar y reemplazar en todos los ficheros. En este ejemplo: lang('Manipuladoes -> lang('Tarifamanipulado) +3.- Editar los idiomas +4.- En las vistas (formulario y lista) cambiar la segunda linea + Esto: extend("Themes/" . config("Basics")->theme["name"] . "/AdminLayout/defaultLayout") ?> + por esto: extend('themes/backend/vuexy/main/defaultlayout') ?> +5.- En las vistas cambiar Themes por themes +6.- Quitar de la tabla la primera columna para que no se repitan los botones. Es decir: + + id), lang('Basic.global.edit'), ['class'=>'btn btn-sm btn-warning btn-edit me-1', 'data-id'=>$item->id,]); ?> + 'btn btn-sm btn-danger btn-delete ms-1', 'data-href'=>route_to('deleteTarifamanipulado', $item->id), 'data-bs-toggle'=>'modal', 'data-bs-target'=>'#confirm2delete']); ?> +