laravel-vuexy-admin-old/Livewire/Table/AbstractIndexComponent.php
2025-03-05 20:28:54 -06:00

175 lines
4.8 KiB
PHP

<?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;
}
}