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>

Snippet Features

Responsive Design: Yes
Dark Mode Support: No
Category: feature-sections
Difficulty Level: Advanced