npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@preline/datatable

v4.2.0

Published

Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.

Downloads

983

Readme

Datatables

Datatables solutions for massive datasets.

npm License: MIT Demo

Contents

Overview

The Datatables component provides a powerful data table interface with sorting, searching, pagination, and row selection capabilities. It integrates with DataTables.net for advanced table functionality.

Key Features:

  • Column sorting
  • Search functionality
  • Pagination
  • Row selection (single and multiple)
  • Customizable paging controls
  • Integration with DataTables.net
  • Programmatic control via JavaScript API
  • Event system for table interactions

Installation

To get started, install DataTable plugin via npm, else you can skip this step if you are already using Preline UI as a package.

npm i jquery datatables.net-dt @preline/datatable

CSS

Use @source to register the plugin's JavaScript path for Tailwind CSS scanning, then @import the plugin's CSS files into your Tailwind CSS file.

@import "tailwindcss";

/* @preline/datatable */
@source "../node_modules/@preline/datatable/*.js";
@import "./node_modules/@preline/datatable/variants.css";
@import "./node_modules/@preline/datatable/theme.css";

.dt-layout-row:has(.dt-search),
.dt-layout-row:has(.dt-length),
.dt-layout-row:has(.dt-paging) {
  display: none !important;
}

JavaScript

Include the JavaScript that powers the interactive elements near the end of your </body> tag:

<script src="./node_modules/jquery/dist/jquery.min.js"></script>
<script src="./node_modules/datatables.net-dt/js/dataTables.dataTables.min.js"></script>
<script src="./node_modules/@preline/datatable/index.js"></script>

Manual Initialization

Use the non-auto entry if you need manual initialization. In this mode, automatic initialization on page load is not included, so the component should be initialized explicitly.

<script src="./node_modules/jquery/dist/jquery.min.js"></script>
<script src="./node_modules/datatables.net-dt/js/dataTables.dataTables.min.js"></script>
<script type="module">
  import HSDataTable from "@preline/datatable/non-auto.mjs";

  new HSDataTable(document.querySelector("#datatable"));
</script>

Via Bundler

When using a bundler (Vite, webpack, etc.), import the plugin directly as an ES module. jQuery and DataTable are referenced as globals, so expose them on window before importing the plugin.

@preline/datatable is the auto-init entry: it scans the DOM and initializes matching elements automatically.

import jQuery from "jquery";
window.jQuery = jQuery;
window.$ = jQuery;
import DataTable from "datatables.net";
window.DataTable = DataTable;

import "@preline/datatable";

@preline/datatable/non-auto is the manual entry: use it when you want explicit control over when initialization happens, either via autoInit() or by creating a specific instance yourself.

import jQuery from "jquery";
window.jQuery = jQuery;
window.$ = jQuery;
import DataTable from "datatables.net";
window.DataTable = DataTable;

import HSDataTable from "@preline/datatable/non-auto";

HSDataTable.autoInit();

// Or initialize a specific element manually
const el = document.querySelector("#datatable");
if (el) new HSDataTable(el);

TypeScript

This package ships with TypeScript type definitions. No additional @types/ package is needed.

Basic usage

The following example demonstrates the minimal HTML structure required for a datatable component. This is a base template without custom styling - you can apply your own CSS classes and styles as needed. The table supports sorting, searching, and pagination.

<div data-hs-datatable>
  <table>
    <thead>
      <tr>
        <th scope="col">
          Name
          <svg class="hidden hs-datatable-ordering-desc:block" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>
          <svg class="hidden hs-datatable-ordering-asc:block" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m18 15-6-6-6 6"/></svg>
        </th>
        <th scope="col">
          Age
          <svg class="hidden hs-datatable-ordering-desc:block" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>
          <svg class="hidden hs-datatable-ordering-asc:block" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m18 15-6-6-6 6"/></svg>
        </th>
        <th scope="col" class="--exclude-from-ordering">
          Action
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John Brown</td>
        <td>45</td>
        <td>
          <button type="button">Delete</button>
        </td>
      </tr>
    </tbody>
  </table>

  <div style="display: none;" data-hs-datatable-paging>
    <button type="button" data-hs-datatable-paging-prev>
      <span aria-hidden="true">«</span>
      <span class="sr-only">Previous</span>
    </button>
    <div data-hs-datatable-paging-pages></div>
    <button type="button" data-hs-datatable-paging-next>
      <span class="sr-only">Next</span>
      <span aria-hidden="true">»</span>
    </button>
  </div>
</div>

Structure Requirements:

  • data-hs-datatable: Required on the container element
  • Standard HTML <table> structure with <thead> and <tbody>
  • Optional paging controls with data-hs-datatable-paging
  • Optional search input with data-hs-datatable-search
  • Optional row selection checkboxes

Initial State:

  • Table displays all data
  • Sorting is enabled on columns (unless excluded)
  • Pagination controls are hidden if not needed

CSS

Please add the following CSS to the head. This is necessary because Datatables.net does not allow to add custom markup with options disabled, such as paging: false or searching: false.

<style>
  .dt-layout-row:has(.dt-search),
  .dt-layout-row:has(.dt-length),
  .dt-layout-row:has(.dt-paging) {
    display: none !important;
  }
</style>

Configuration Options

Data Options

Note: Please note that this component requires the use of the Datatables.net plugin. Most options available in the plugin are available in our wrapper.

Data options are specified in the data-hs-datatable attribute as a JSON object.

| Option | Target Element | Type | Default | Description | | --- | --- | --- | --- | --- | | data-hs-datatable | Container | - | - | Activate a Datatable by specifying on an element. Should be added to the container. | | :pageBtnClasses | Inside data-hs-datatable | string | "-" | Sets the specified classes to each paging element inside the data-hs-datatable-paging-pages. | | :rowSelectingOptions.selectAllSelector | Inside data-hs-datatable | string (CSS selector) | "[data-hs-datatable-row-selecting-all]" | A valid CSS selector (the element must be a checkbox or radio button), when the element is changed, all elements specified by rowSelectingOptions.individualSelector (or, if not specified, then data-hs-datatable-row-selecting-individual) on the current page will be changed. | | :rowSelectingOptions.individualSelector | Inside data-hs-datatable | string (CSS selector) | "[data-hs-datatable-row-selecting-individual]" | A valid CSS selector (the element must be a checkbox or radio button), affects the change of the element specified in rowSelectingOptions.selectAllSelector, if not all elements are selected on the current page, then it switches to unchecked state, if vice versa, then in checked. |

Example:

<div data-hs-datatable='{
  "pageBtnClasses": "px-3 py-1 border rounded",
  "rowSelectingOptions": {
    "selectAllSelector": "#hs-select-all",
    "individualSelector": ".hs-row-checkbox"
  }
}'>
  <!-- Table structure -->
</div>

Class Options

CSS class modifiers use -- prefix to control datatable behavior.

| Class Modifier | Target Element | Purpose | | --- | --- | --- | | --exclude-from-ordering | Table header (<th>) | A modifier that allows you to disable the ordering functionality in a column. Should be added to the thead column. |

Required CSS Classes / Data Attributes

These data attributes define the structure and must be present for specific features to function.

| Data Attribute | Required On | Purpose | | --- | --- | --- | | data-hs-datatable-search | Input element | Defines which element will be responsible for searching in the datatable (must be an input). | | data-hs-datatable-page-entities | Select element | Determines which element will be responsible for switching the number of elements on the page (must be a select, depends on the change event). | | data-hs-datatable-paging | Container element | Defines a paging container, that contains pagination, next and previous buttons. | | data-hs-datatable-paging-prev | Button element | Defines a previous button element. | | data-hs-datatable-paging-next | Button element | Defines a next button element. | | data-hs-datatable-row-selecting-all | Checkbox/Radio element | Defines a "Select all" checkbox/radio, if it's not specified in the rowSelectingOptions.selectAllSelector parameter. | | data-hs-datatable-row-selecting-individual | Checkbox/Radio element | Defines a checkbox/radio that will be responsible for selecting a specific row if it is not specified in the rowSelectingOptions.individualSelector parameter. | | data-hs-datatable-info | Container element | Defines an info container. | | data-hs-datatable-info-from | Element | Defines an element that showing start number. | | data-hs-datatable-info-to | Element | Defines an element that showing end number. | | data-hs-datatable-info-length | Element | Defines an element that showing recordsTotal number. |

Tailwind Modifiers

| Name | Description | | --- | --- | | hs-datatable-ordering-asc:* | A modifier that allows you to set Tailwind classes to elements inside thead th or thead td when ordering changes to asc. | | hs-datatable-ordering-desc:* | A modifier that allows you to set Tailwind classes to elements inside thead th or thead td when ordering changes to desc. |

JavaScript API

The HSDataTable object is available in the global window object after the plugin is loaded.

Instance Methods

These methods are called on a datatable instance.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | destroy() | None | void | Destroys the datatable instance, removes all generated markup, classes, and event listeners. Use when removing datatable from DOM. |

Static Methods

These methods are called directly on the HSDataTable class.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | HSDataTable.getInstance(target, isInstance) | target: HTMLElement \| string (CSS selector)isInstance: boolean (optional) | HTMLElement \| { id: string \| number, element: HSDataTable } \| null | Returns the datatable instance or element associated with the target. If isInstance is true, returns collection item object { id, element } where element is the HSDataTable instance. If isInstance is false or omitted, returns the DOM element (HTMLElement). Returns null if datatable instance is not found. |

Usage Examples

Example 1: Accessing DataTables.net instance

// Get the datatable instance
const instance = HSDataTable.getInstance('#hs-datatable', true);

if (instance) {
  const { element } = instance;
  // Access underlying DataTables.net instance
  const { dataTable } = element;

  if (dataTable) {
    // Use DataTables.net methods
    dataTable.search('query').draw();
  }
}

Example 2: Destroying datatable instance

const instance = HSDataTable.getInstance('#hs-datatable', true);

if (instance) {
  const { element } = instance;
  const destroyBtn = document.querySelector('#hs-destroy-btn');

  destroyBtn.addEventListener('click', () => {
    element.destroy();
  });
}

Example 3: Destroying datatable instance

const instance = HSDataTable.getInstance('#hs-datatable', true);

if (instance) {
  const { element } = instance;
  const removeBtn = document.querySelector('#hs-remove-btn');

  removeBtn.addEventListener('click', () => {
    // Clean up before removing from DOM
    element.destroy();
    // Now safe to remove the element
    document.querySelector('#hs-datatable').remove();
  });
}

Events

Note: Please note that this component requires the use of the Datatables.net plugin. Most events available in the plugin are available in our wrapper.

Datatable instances emit events through the underlying DataTables.net instance. Access the DataTables.net instance via element.dataTable to listen to events.

Common DataTables.net Events:

  • draw - When table is redrawn
  • order - When column ordering changes
  • search - When search is performed
  • page - When page changes
  • select - When row is selected
  • deselect - When row is deselected

Event Usage Example

// Get datatable instance
const instance = HSDataTable.getInstance('#hs-datatable', true);

if (instance) {
  const { element } = instance;
  const { dataTable } = element;

  if (dataTable) {
    // Listen to draw event
    dataTable.on('draw.dt', () => {
      console.log('Table redrawn!');
      // Perform actions after table redraws
      // e.g., update UI, reinitialize plugins
    });

    // Listen to order event
    dataTable.on('order.dt', () => {
      console.log('Column ordering changed!');
    });

    // Listen to search event
    dataTable.on('search.dt', () => {
      console.log('Search performed!');
    });
  }
}

Common Patterns

Pattern 1: With Search

Add search functionality to the datatable.

<input type="text" data-hs-datatable-search placeholder="Search...">

<div data-hs-datatable>
  <!-- Table structure -->
</div>

Pattern 2: With Row Selection

Enable row selection with checkboxes.

<div data-hs-datatable>
  <table>
    <thead>
      <tr>
        <th>
          <input type="checkbox" data-hs-datatable-row-selecting-all>
        </th>
        <!-- Other columns -->
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>
          <input type="checkbox" data-hs-datatable-row-selecting-individual>
        </td>
        <!-- Other cells -->
      </tr>
    </tbody>
  </table>
</div>

Pattern 3: Exclude Column from Ordering

Disable sorting on specific columns.

<th scope="col" class="--exclude-from-ordering">
  Actions
</th>

License

Copyright (c) 2026 Preline Labs.

Licensed under the MIT License.