Saltar al contenido

Tablas de datos con menús desplegables de filtro de columna y selección de casillas de verificación múltiples

Solución:

Pruebe esto, que no usa ninguna biblioteca JS / jQuery adicional:

// This code has been beautified via http://jsbeautifier.org/ with 2 spaces indentation.
$(document).ready(function() 
  function cbDropdown(column) 
    return $('
    ', 'class': 'cb-dropdown' ).appendTo($('
    ', 'class': 'cb-dropdown-wrap' ).appendTo(column)); $('#example').DataTable( initComplete: function() this.api().columns().every(function() var column = this; var ddmenu = cbDropdown($(column.header())) .on('change', ':checkbox', function() '); column .search(vals.length > 0 ? '^(' + vals + ')$' : '', true, false) .draw(); // Highlight the current item if selected. if (this.checked) $(this).closest('li').addClass('active'); else $(this).closest('li').removeClass('active'); // Highlight the current filter if selected. var active2 = ddmenu.parent().is('.active'); if (active && !active2) ddmenu.parent().addClass('active'); else if (!active && active2) ddmenu.parent().removeClass('active'); ); column.data().unique().sort().each(function(d, j) var // wrapped $label = $('
  • ').append($label)); ); ); ); );

CSS

/* Styles for the drop-down. Feel free to change the styles to suit your website. :-) */

.cb-dropdown-wrap 
  max-height: 80px; /* At most, around 3/4 visible items. */
  position: relative;
  height: 19px;


.cb-dropdown,
.cb-dropdown li 
  margin: 0;
  padding: 0;
  list-style: none;


.cb-dropdown 
  position: absolute;
  z-index: 1;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #fff;
  border: 1px solid #888;


/* For selected filter. */
.active .cb-dropdown 
  background: pink;


.cb-dropdown-wrap:hover .cb-dropdown 
  height: 80px;
  overflow: auto;
  transition: 0.2s height ease-in-out;


/* For selected items. */
.cb-dropdown li.active 
  background: #ff0;


.cb-dropdown li label 
  display: block;
  position: relative;
  cursor: pointer;
  line-height: 19px; /* Match height of .cb-dropdown-wrap */


.cb-dropdown li label > input 
  position: absolute;
  right: 0;
  top: 0;
  width: 16px;


.cb-dropdown li label > span 
  display: block;
  margin-left: 3px;
  margin-right: 20px; /* At least, width of the checkbox. */
  font-family: sans-serif;
  font-size: 0.8em;
  font-weight: normal;
  text-align: left;


/* This fixes the vertical aligning of the sorting icon. */
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled 
  background-position: 100% 10px;

Manifestación

https://jsfiddle.net/41vgefnf/1/
https://jsfiddle.net/41vgefnf/6/
https://jsfiddle.net/41vgefnf/8/
https://jsfiddle.net/41vgefnf/9/

https://jsfiddle.net/41vgefnf/10/

ACTUALIZAR

Moví los menús desplegables de filtro al encabezado y diseñé los menús desplegables para que se parecieran más a menús desplegables. (No JS o jQuery involucrados en la funcionalidad desplegable; solo CSS puro con animación básica – CSS3 transition.)

ACTUALIZACIÓN # 2

Lo siento, olvidé aplicar el CSS “activo” class a los elementos seleccionados.

ACTUALIZACIÓN # 3

Igual que Actualización n. ° 2 caso, pero para el envoltorio del menú desplegable. (Perdón por seguir olvidándome de cosas … y edité solo para cumplir / cumplir con los requisitos / cambios que realmente solicitaste. 🙂 Pero creo que esta actualización sería la revisión final.)

ACTUALIZACIÓN # 4

Se corrigió el “activo” cambio de estado del contenedor del menú desplegable.

CREDITOS

Gracias @Giacomo por tu violín. =)

Creo que lo que está buscando en términos de interfaz de usuario es una selección múltiple.

En realidad, no existe un elemento desplegable con selección múltiple usando una casilla de verificación (la selección múltiple ya existe para ese tipo de necesidad de interacción).

Creo que necesita una selección múltiple personalizada con una mejor experiencia de usuario (no la predeterminada como en el ejemplo proporcionado).

Aquí hay un violín con mi propósito, entiendo que esto no es exactamente lo que estaba pidiendo, pero creo que esto se adaptará a su solicitud en un nivel más abstracto.

Todo lo que hice fue usar un complemento de jquery llamado select2, muy útil para mejorar ux y ui en varios elementos de entrada.

Consulte los comentarios del código para conocer los aspectos técnicos.

https://jsfiddle.net/p1261jby/3/

/*added as resources
https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js
https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css
*/

$(document).ready(function() 
  $('#example').DataTable(
    initComplete: function() 
      this.api().columns().every(function() 
        var column = this;
        //added class "mymsel"
        var select = $('')
          .appendTo($(column.footer()).empty())
          .on('change', function() ');

            column
              .search(vals.length > 0 ? '^(' + vals + ')$' : '', true, false)
              .draw();
          );

        column.data().unique().sort().each(function(d, j) 
          select.append('')
        );
      );
      //select2 init for .mymsel class
      $(".mymsel").select2();
    
  );
);

Aquí están los documentos de Select2 en caso de que necesite personalizar algunos parámetros. https://select2.org/selections

Aquí hay otro sabor. Está usando código modificado de Elmahdi Mahmoud para la selección múltiple, así que lo dejé en su mensaje de derechos de autor del MIT.

Te lo advierto ahora, el código no es bonito, pero el resultado es efectivo, así que pensé que valía la pena agregarlo al montón de opciones. Un violín en vivo está aquí.

El JS es

    /* Plugin API method to determine is a column is sortable */
$.fn.dataTable.Api.register('column().searchable()', function() 
  var ctx = this.context[0];
  return ctx.aoColumns[this[0]].bSearchable;
);


$(document).ready(function() 
  // Create the DataTable
  var table = $('#example').DataTable(
    fixedHeader: true,
    pageLength: 25,
    orderCellsTop: true,
    columnDefs: [
      searchable: false,
      targets: [0, 4]
    ],
  );

  // Add filtering
  table.columns().every(function() 
    if (this.searchable()) 
      var that = this;


      var myList = $('
    '); var myMulti = $('
    '); myList.appendTo(myMulti); var myDd = $('
    '); myMulti.appendTo(myDd); var myDropdown = $('

Recuerda algo, que tienes la opción de explicar si encontraste tu disgusto justo a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *