Implementación de Menús Desplegables Avanzados con SlickGrid y Select2

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

Etiquetas: SlickGrid Select2 jQuery JavaScript Desplegables

Publicado el 7-30 09:37