first commit
This commit is contained in:
174
Livewire/Table/AbstractIndexComponent.php
Normal file
174
Livewire/Table/AbstractIndexComponent.php
Normal file
@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
namespace Koneko\VuexyAdmin\Livewire\Table;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Component;
|
||||
|
||||
/**
|
||||
* Clase base abstracta para la creación de componentes tipo "Index" con Livewire.
|
||||
*
|
||||
* Provee una estructura general para:
|
||||
* - Configurar y renderizar tablas con Bootstrap Table.
|
||||
* - Definir columnas y formatos de manera estándar.
|
||||
* - Manejar búsquedas, filtros, o catálogos necesarios.
|
||||
* - Centralizar la lógica de montaje (mount).
|
||||
*
|
||||
* @package Koneko\VuexyAdmin\Livewire\Table
|
||||
*/
|
||||
abstract class AbstractIndexComponent extends Component
|
||||
{
|
||||
/**
|
||||
* Configuración principal para la tabla con Bootstrap Table.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $bt_datatable = [];
|
||||
|
||||
/**
|
||||
* Tag identificador del componente, derivado del modelo.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $tagName;
|
||||
|
||||
/**
|
||||
* Nombre singular del modelo (para mensajes, etiquetado, etc.).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $singularName;
|
||||
|
||||
/**
|
||||
* Identificador único del formulario (vinculado al Offcanvas o Modal).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $formId;
|
||||
|
||||
/**
|
||||
* Método para obtener la instancia del modelo asociado.
|
||||
*
|
||||
* Debe retornarse una instancia (o la clase) del modelo Eloquent que maneja este Index.
|
||||
*
|
||||
* @return Model|string
|
||||
*/
|
||||
abstract protected function model(): string;
|
||||
|
||||
/**
|
||||
* Define las columnas (header) de la tabla. Este array se fusionará
|
||||
* o se inyectará en la configuración principal $bt_datatable.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function columns(): array;
|
||||
|
||||
/**
|
||||
* Define el formato (formatter) de las columnas.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function format(): array;
|
||||
|
||||
/**
|
||||
* Retorna la ruta de la vista Blade que renderizará el componente.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function viewPath(): string;
|
||||
|
||||
/**
|
||||
* Método que define la configuración base del DataTable.
|
||||
* Aquí puedes poner ajustes comunes (exportFileName, paginación, etc.).
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function bootstraptableConfig(): array
|
||||
{
|
||||
return [
|
||||
'sortName' => 'id', // Campo por defecto para ordenar
|
||||
'exportFileName' => 'Listado', // Nombre de archivo para exportar
|
||||
'showFullscreen' => false,
|
||||
'showPaginationSwitch'=> false,
|
||||
'showRefresh' => false,
|
||||
'pagination' => false,
|
||||
// Agrega aquí cualquier otra configuración por defecto que uses
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Se ejecuta al montar el componente Livewire.
|
||||
* Configura $tagName, $singularName, $formId y $bt_datatable.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function mount(): void
|
||||
{
|
||||
// Obtenemos el modelo
|
||||
$model = $this->model();
|
||||
if (is_string($model)) {
|
||||
// Si se retornó la clase en abstract protected function model(),
|
||||
// instanciamos manualmente
|
||||
$model = new $model;
|
||||
}
|
||||
|
||||
// Usamos las propiedades definidas en el modelo
|
||||
// (tagName, singularName, etc.), si existen en el modelo.
|
||||
// Ajusta nombres según tu convención.
|
||||
$this->tagName = $model->tagName ?? Str::snake(class_basename($model));
|
||||
$this->singularName = $model->singularName ?? class_basename($model);
|
||||
$this->formId = Str::kebab($this->tagName) . '-form';
|
||||
|
||||
// Inicia la configuración principal de la tabla
|
||||
$this->setupDataTable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Combina la configuración base de la tabla con las columnas y formatos
|
||||
* definidos en las clases hijas.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function setupDataTable(): void
|
||||
{
|
||||
$baseConfig = $this->bootstraptableConfig();
|
||||
|
||||
$this->bt_datatable = array_merge($baseConfig, [
|
||||
'header' => $this->columns(),
|
||||
'format' => $this->format(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renderiza la vista definida en viewPath().
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return view($this->viewPath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Ejemplo de método para la lógica de filtrado que podrías sobreescribir en la clase hija.
|
||||
*
|
||||
* @param array $criteria
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
protected function applyFilters($criteria = [])
|
||||
{
|
||||
// Aplica tu lógica de filtros, búsquedas, etc.
|
||||
// La clase hija podría sobrescribir este método o llamarlo desde su propia lógica.
|
||||
$query = $this->model()::query();
|
||||
|
||||
// Por ejemplo:
|
||||
/*
|
||||
if (!empty($criteria['store_id'])) {
|
||||
$query->where('store_id', $criteria['store_id']);
|
||||
}
|
||||
*/
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user