Lista de Datos Avanzada con Filtrado y Ordenamiento
Un componente completo de lista de datos con filtrado avanzado, ordenamiento multi-columna, búsqueda inteligente, paginación, selección de filas, funcionalidad de exportación y gestión de columnas.
Diseño Responsivo
Sí
Soporte para Modo Oscuro
No
líneas
1819
Compatibilidad del Navegador
No
Vista Previa en Vivo
Interactúa con el componente sin salir de la página.
Resumen
Un componente completo de lista de datos con filtrado avanzado, ordenamiento multi-columna, búsqueda inteligente, paginación, selección de filas, funcionalidad de exportación y gestión de columnas.
Cómo usarlo
- Copia el marcado HTML en tu página.
- Pega el CSS en tu hoja de estilos y verifica que los selectores coincidan con el HTML.
- Pega el JavaScript y cárgalo después del HTML.
- Ajusta espaciados, colores y textos para tu sistema de diseño.
Consejos de personalización
- Renombra las clases para evitar conflictos con tu CSS existente.
- Reemplaza colores fijos por variables CSS para facilitar el tema.
- Comprueba el diseño en 320px, 768px y 1024px.
HTML
386
líneas
CSS
706
líneas
JavaScript
727
líneas
<div class="data-list-container">
<div class="data-list-header">
<div class="header-content">
<h2 class="list-title">Directorio de Empleados</h2>
<p class="list-description">Gestiona y visualiza información de empleados con filtrado y ordenamiento avanzado</p>
</div>
<div class="header-actions">
<button class="btn btn-secondary" id="columnToggle">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
<line x1="9" y1="9" x2="15" y2="9"></line>
<line x1="9" y1="15" x2="15" y2="15"></line>
</svg>
Columnas
</button>
<button class="btn btn-secondary" id="exportData">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
<polyline points="7,10 12,15 17,10"></polyline>
<line x1="12" y1="15" x2="12" y2="3"></line>
</svg>
Exportar
</button>
<button class="btn btn-primary" id="addNew">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<line x1="12" y1="5" x2="12" y2="19"></line>
<line x1="5" y1="12" x2="19" y2="12"></line>
</svg>
Agregar Empleado
</button>
</div>
</div>
<div class="filters-section">
<div class="search-container">
<div class="search-input-wrapper">
<svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<circle cx="11" cy="11" r="8"></circle>
<path d="m21 21-4.35-4.35"></path>
</svg>
<input
type="text"
id="globalSearch"
class="search-input"
placeholder="Buscar empleados..."
aria-label="Buscar empleados"
>
<button class="search-clear" id="searchClear" aria-label="Limpiar búsqueda">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
</div>
</div>
<div class="advanced-filters">
<div class="filter-group">
<label for="departmentFilter">Departamento</label>
<select id="departmentFilter" class="filter-select">
<option value="">Todos los Departamentos</option>
<option value="engineering">Ingeniería</option>
<option value="marketing">Marketing</option>
<option value="sales">Ventas</option>
<option value="hr">Recursos Humanos</option>
<option value="finance">Finanzas</option>
</select>
</div>
<div class="filter-group">
<label for="statusFilter">Estado</label>
<select id="statusFilter" class="filter-select">
<option value="">Todos los Estados</option>
<option value="active">Activo</option>
<option value="inactive">Inactivo</option>
<option value="pending">Pendiente</option>
</select>
</div>
<div class="filter-group">
<label for="locationFilter">Ubicación</label>
<select id="locationFilter" class="filter-select">
<option value="">Todas las Ubicaciones</option>
<option value="madrid">Madrid</option>
<option value="barcelona">Barcelona</option>
<option value="valencia">Valencia</option>
<option value="remoto">Remoto</option>
</select>
</div>
<div class="filter-group">
<label for="hireDateFrom">Fecha de Contratación Desde</label>
<input type="date" id="hireDateFrom" class="filter-input">
</div>
<div class="filter-group">
<label for="hireDateTo">Fecha de Contratación Hasta</label>
<input type="date" id="hireDateTo" class="filter-input">
</div>
<button class="btn btn-secondary" id="clearFilters">
Limpiar Filtros
</button>
</div>
</div>
<div class="results-info">
<div class="results-count">
<span id="resultsText">Mostrando 1-10 de 150 empleados</span>
</div>
<div class="results-actions">
<div class="page-size-selector">
<label for="pageSize">Mostrar:</label>
<select id="pageSize" class="page-size-select">
<option value="10">10</option>
<option value="25" selected>25</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
<span>por página</span>
</div>
<div class="bulk-actions" id="bulkActions" style="display: none;">
<span class="selected-count" id="selectedCount">2 seleccionados</span>
<button class="btn btn-sm btn-secondary" id="bulkEdit">Editar</button>
<button class="btn btn-sm btn-danger" id="bulkDelete">Eliminar</button>
</div>
</div>
</div>
<div class="table-container">
<div class="table-wrapper">
<table class="data-table" id="dataTable">
<thead>
<tr>
<th class="select-column">
<input type="checkbox" id="selectAll" aria-label="Seleccionar todas las filas">
</th>
<th class="sortable" data-column="name" data-type="string">
<div class="th-content">
<span>Nombre</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="email" data-type="string">
<div class="th-content">
<span>Email</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="department" data-type="string">
<div class="th-content">
<span>Departamento</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="position" data-type="string">
<div class="th-content">
<span>Posición</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="location" data-type="string">
<div class="th-content">
<span>Ubicación</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="hireDate" data-type="date">
<div class="th-content">
<span>Fecha de Contratación</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="sortable" data-column="status" data-type="string">
<div class="th-content">
<span>Estado</span>
<div class="sort-indicators">
<svg class="sort-icon sort-asc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="18,15 12,9 6,15"></polyline>
</svg>
<svg class="sort-icon sort-desc" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="6,9 12,15 18,9"></polyline>
</svg>
</div>
</div>
</th>
<th class="actions-column">Acciones</th>
</tr>
</thead>
<tbody id="tableBody">
</tbody>
</table>
</div>
<div class="loading-state" id="loadingState" style="display: none;">
<div class="loading-spinner"></div>
<p>Cargando datos...</p>
</div>
<div class="empty-state" id="emptyState" style="display: none;">
<svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<circle cx="11" cy="11" r="8"></circle>
<path d="m21 21-4.35-4.35"></path>
</svg>
<h3>No se encontraron empleados</h3>
<p>Intenta ajustar tus criterios de búsqueda o filtros</p>
<button class="btn btn-primary" onclick="clearAllFilters()">Limpiar Todos los Filtros</button>
</div>
</div>
<div class="pagination-container">
<div class="pagination-info">
<span id="paginationInfo">Mostrando 1 a 25 de 150 entradas</span>
</div>
<nav class="pagination" aria-label="Paginación de tabla de datos">
<button class="pagination-btn" id="firstPage" aria-label="Primera página">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="11,17 6,12 11,7"></polyline>
<polyline points="18,17 13,12 18,7"></polyline>
</svg>
</button>
<button class="pagination-btn" id="prevPage" aria-label="Página anterior">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="15,18 9,12 15,6"></polyline>
</svg>
</button>
<div class="pagination-numbers" id="paginationNumbers">
</div>
<button class="pagination-btn" id="nextPage" aria-label="Página siguiente">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="9,18 15,12 9,6"></polyline>
</svg>
</button>
<button class="pagination-btn" id="lastPage" aria-label="Última página">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<polyline points="13,17 18,12 13,7"></polyline>
<polyline points="6,17 11,12 6,7"></polyline>
</svg>
</button>
</nav>
</div>
<div class="modal" id="columnModal">
<div class="modal-content">
<div class="modal-header">
<h3>Gestionar Columnas</h3>
<button class="modal-close" id="closeColumnModal">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
</div>
<div class="modal-body">
<p>Selecciona qué columnas mostrar en la tabla:</p>
<div class="column-toggles" id="columnToggles">
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="resetColumns">Restablecer por Defecto</button>
<button class="btn btn-primary" id="applyColumns">Aplicar Cambios</button>
</div>
</div>
</div>
<div class="modal" id="exportModal">
<div class="modal-content">
<div class="modal-header">
<h3>Exportar Datos</h3>
<button class="modal-close" id="closeExportModal">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
</div>
<div class="modal-body">
<p>Elige el formato de exportación y opciones:</p>
<div class="export-options">
<div class="export-format">
<label>Formato de Exportación:</label>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="exportFormat" value="csv" checked>
<span>CSV</span>
</label>
<label class="radio-option">
<input type="radio" name="exportFormat" value="json">
<span>JSON</span>
</label>
<label class="radio-option">
<input type="radio" name="exportFormat" value="print">
<span>Imprimir</span>
</label>
</div>
</div>
<div class="export-scope">
<label>Alcance de Exportación:</label>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="exportScope" value="current" checked>
<span>Página Actual</span>
</label>
<label class="radio-option">
<input type="radio" name="exportScope" value="filtered">
<span>Todos los Resultados Filtrados</span>
</label>
<label class="radio-option">
<input type="radio" name="exportScope" value="all">
<span>Todos los Datos</span>
</label>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="cancelExport">Cancelar</button>
<button class="btn btn-primary" id="confirmExport">Exportar</button>
</div>
</div>
</div>
</div>