Configuración Inicial: Dependencias y Entorno
Para integrar SlickGrid con Select2, incluye las bibliotecas necesarias en tu proeycto:
<!-- Estilos SlickGrid -->
<link rel="stylesheet" href="styles/css/slick.grid.css"/>
<!-- Estilos Select2 -->
<link rel="stylesheet" href="assets/select2.min.css"/>
<!-- jQuery -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>
<!-- Select2 -->
<script src="assets/select2.min.js"></script>
<!-- SlickGrid -->
<script src="dist/slick.core.min.js"></script>
<script src="dist/slick.grid.min.js"></script>
Creación de una Tabla Básica
Define la estructura enicial del grid:
<div id="gridContainer" style="width:100%;height:400px;"></div>
<script>
const datos = [];
const columnas = [
{id: "nombre", name: "Nombre", field: "nombre", width: 120},
{id: "region", name: "Región", field: "region", width: 150}
];
const opcionesGrid = {
editable: true,
enableCellNavigation: true
};
const grid = new Slick.Grid("#gridContainer", datos, columnas, opcionesGrid);
</script>
Editor Personlaizado para Select2
Crea un editor personalizado para integrar Select2:
function EditorSelect2(config) {
let elemento;
this.init = function() {
elemento = $('<select></select>');
elemento.appendTo(config.contenedor);
elemento.select2({
placeholder: 'Seleccione',
data: config.columna.opciones
});
};
this.destroy = function() {
elemento.select2('destroy');
elemento.remove();
};
this.focus = function() {
elemento.focus();
};
}
Configuración de Columnas con Select2
Asigna el editor personalizado a una columna específica:
const columnas = [
{
id: "ubicacion",
name: "Ubicación",
field: "ubicacion",
editor: EditorSelect2,
opciones: [
{id: 'ES', texto: 'España'},
{id: 'FR', texto: 'Francia'},
{id: 'DE', texto: 'Alemania'}
]
}
];
Soporte para Selección Múltiple
Modifica el editor para permitir múltiples selecciones:
function EditorSelect2Multi(config) {
let elemento;
this.init = function() {
elemento = $('<select multiple></select>');
elemento.appendTo(config.contenedor);
elemento.select2({
placeholder: 'Seleccione opciones',
data: config.columna.opciones
});
};
// Implementar métodos para manejar valores múltiples
this.serializeValue = function() {
return elemento.val() || [];
};
}
Carga Remota de Datos
Optimiza para grandes conjuntos de datos con carga remota:
elemento.select2({
ajax: {
url: '/api/ubicaciones',
dataType: 'json',
delay: 300,
data: function(params) {
return { busqueda: params.term };
},
processResults: function(respuesta) {
return { results: respuesta.datos };
}
}
});
Personalización de Estilos y Eventos
Ajusta la apariencia y comportamientos:
/* CSS personalizado */
.select2-container {
min-width: 200px;
}
.select2-selection {
padding: 5px 8px;
}
// Manejo de eventos
elemento.on('select2:select', function(e) {
const seleccion = e.params.data;
console.log('Elemento seleccionado:', seleccion.texto);
});