Advanced Data List with Filtering & Sorting
Advanced
A comprehensive data list component with advanced filtering, sorting, pagination, and search functionality
Live Preview
Code Implementation
HTML
<div class="data-list-container">
<!-- Header Section -->
<div class="data-list-header">
<div class="header-content">
<h2 class="list-title">Employee Directory</h2>
<p class="list-description">Manage and view employee information with advanced filtering and sorting</p>
</div>
<!-- Action Buttons -->
<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>
Columns
</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>
Export
</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>
Add Employee
</button>
</div>
</div>
<!-- Filters Section -->
<div class="filters-section">
<!-- Search Bar -->
<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="Search employees..."
aria-label="Search employees"
>
<button class="search-clear" id="searchClear" aria-label="Clear search">
<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>
<!-- Advanced Filters -->
<div class="advanced-filters">
<div class="filter-group">
<label for="departmentFilter">Department</label>
<select id="departmentFilter" class="filter-select">
<option value="">All Departments</option>
<option value="engineering">Engineering</option>
<option value="marketing">Marketing</option>
<option value="sales">Sales</option>
<option value="hr">Human Resources</option>
<option value="finance">Finance</option>
</select>
</div>
<div class="filter-group">
<label for="statusFilter">Status</label>
<select id="statusFilter" class="filter-select">
<option value="">All Status</option>
<option value="active">Active</option>
<option value="inactive">Inactive</option>
<option value="pending">Pending</option>
</select>
</div>
<div class="filter-group">
<label for="locationFilter">Location</label>
<select id="locationFilter" class="filter-select">
<option value="">All Locations</option>
<option value="new-york">New York</option>
<option value="san-francisco">San Francisco</option>
<option value="london">London</option>
<option value="remote">Remote</option>
</select>
</div>
<div class="filter-group">
<label for="hireDateFrom">Hire Date From</label>
<input type="date" id="hireDateFrom" class="filter-input">
</div>
<div class="filter-group">
<label for="hireDateTo">Hire Date To</label>
<input type="date" id="hireDateTo" class="filter-input">
</div>
<button class="btn btn-secondary" id="clearFilters">
Clear Filters
</button>
</div>
</div>
<!-- Results Info -->
<div class="results-info">
<div class="results-count">
<span id="resultsText">Showing 1-10 of 150 employees</span>
</div>
<div class="results-actions">
<div class="page-size-selector">
<label for="pageSize">Show:</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>per page</span>
</div>
<div class="bulk-actions" id="bulkActions" style="display: none;">
<span class="selected-count" id="selectedCount">2 selected</span>
<button class="btn btn-sm btn-secondary" id="bulkEdit">Edit</button>
<button class="btn btn-sm btn-danger" id="bulkDelete">Delete</button>
</div>
</div>
</div>
<!-- Data Table -->
<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="Select all rows">
</th>
<th class="sortable" data-column="name" data-type="string">
<div class="th-content">
<span>Name</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>Department</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>Position</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>Location</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>Hire Date</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>Status</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">Actions</th>
</tr>
</thead>
<tbody id="tableBody">
<!-- Data rows will be populated by JavaScript -->
</tbody>
</table>
</div>
<!-- Loading State -->
<div class="loading-state" id="loadingState" style="display: none;">
<div class="loading-spinner"></div>
<p>Loading data...</p>
</div>
<!-- Empty State -->
<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 employees found</h3>
<p>Try adjusting your search criteria or filters</p>
<button class="btn btn-primary" onclick="clearAllFilters()">Clear All Filters</button>
</div>
</div>
<!-- Pagination -->
<div class="pagination-container">
<div class="pagination-info">
<span id="paginationInfo">Showing 1 to 25 of 150 entries</span>
</div>
<nav class="pagination" aria-label="Data table pagination">
<button class="pagination-btn" id="firstPage" aria-label="First page">
<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="Previous page">
<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">
<!-- Page numbers will be populated by JavaScript -->
</div>
<button class="pagination-btn" id="nextPage" aria-label="Next page">
<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="Last page">
<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>
<!-- Column Toggle Modal -->
<div class="modal" id="columnModal">
<div class="modal-content">
<div class="modal-header">
<h3>Manage Columns</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>Select which columns to display in the table:</p>
<div class="column-toggles" id="columnToggles">
<!-- Column toggles will be populated by JavaScript -->
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="resetColumns">Reset to Default</button>
<button class="btn btn-primary" id="applyColumns">Apply Changes</button>
</div>
</div>
</div>
<!-- Export Modal -->
<div class="modal" id="exportModal">
<div class="modal-content">
<div class="modal-header">
<h3>Export Data</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>Choose export format and options:</p>
<div class="export-options">
<div class="export-format">
<label>Export Format:</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>Print</span>
</label>
</div>
</div>
<div class="export-scope">
<label>Export Scope:</label>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="exportScope" value="current" checked>
<span>Current Page</span>
</label>
<label class="radio-option">
<input type="radio" name="exportScope" value="filtered">
<span>All Filtered Results</span>
</label>
<label class="radio-option">
<input type="radio" name="exportScope" value="all">
<span>All Data</span>
</label>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="cancelExport">Cancel</button>
<button class="btn btn-primary" id="confirmExport">Export</button>
</div>
</div>
</div>
</div>