react-smart-table-component
TypeScript icon, indicating that this package has built-in type declarations

1.0.7 • Public • Published

react-smart-table-component

npm version npm npm

A smart and fully dynamic React Component purely build with TypeScript which has inbuilt functionality of infinite scroll and pagination.

CodeSandbox

Features

  • Support of React 18 and Typescript
  • Generic types for table info such as Headings and Body
  • No CSS included, Add your customized styles
  • Infinite scroll feature (Default scroll and UpSide Down Scroll)
  • Pagination feature
  • Scoped fields feature

Installation

NPM

To install the latest stable version:

npm install --save react-smart-table-component
Sample code for infinite scroll
import { useState, useEffect, useRef, useCallback } from "react";

import ReactSmartTableComponent from "react-smart-table-component";

import "./styles.css";

export default function App() {
  const [products, setProducts] = useState([]);
  const [offset, setOffset] = useState(0);
  const [hasMore, setHasMore] = useState(false);
  const [loading, setLoading] = useState(false);

  const offsetRef = useRef(offset);
  const hasMoreRef = useRef(hasMore);
  const productsRef = useRef(products);

  useEffect(() => {
    hasMoreRef.current = hasMore;
    offsetRef.current = offset;
    productsRef.current = products;
  }, [offset, hasMore, products]);

  const fetchProducts = useCallback(
    async (firstLoad) => {
      setLoading(true);
      const data = await fetch(
        `https://dummyjson.com/products?limit=10&skip=${offsetRef.current}&select=title,price,brand,category,thumbnail,rating,description`,
        { headers: { "Accept-Encoding": "gzip,deflate,compress" } }
      ).then((data) => data.json());
      if (data && data.products) {
        if (data.products.length < 10) setHasMore(false);
        else setHasMore(true);

        setOffset(firstLoad ? 10 : offsetRef.current + 10);
        const records = firstLoad
          ? data.products
          : [...productsRef.current, ...data.products];
        setProducts(records);
      }
      setLoading(false);
    },
    [products, offsetRef, productsRef]
  );

  useEffect(() => {
    fetchProducts(true);
  }, []);

  /**
   * Load more records
   */
  const loadMore = () => {
    setTimeout(() => {
      if (hasMoreRef.current) {
        fetchProducts(false);
      }
    }, 500);
  };

  return (
    <ReactSmartTableComponent
      items={products}
      headings={[
        { fieldName: "thumbnail", title: "Thumbnail" },
        { fieldName: "title", title: "Title" },
        { fieldName: "price", title: "Price" },
        { fieldName: "brand", title: "Brand" },
        { fieldName: "category", title: "Category" },
        { fieldName: "rating", title: "Rating" },
        { fieldName: "description", title: "Description" },
        { fieldName: "action_1", title: "Action" }
      ]}
      loading={loading}
      recordsView="infinite-Scroll"
      className="theme-table"
      hasMoreRecords={hasMore}
      loadMore={loadMore}
      scopedFields={{
        thumbnail: (item) => (
          <td>
            <img
              src={item.thumbnail}
              alt="thumbnail"
              height={100}
              width={100}
            />{" "}
          </td>
        ),
        action_1: (item) => (
          <td>
            <button onClick={() => alert(`Item Name: ${item.title}\nItem Price: ${item.price}\nItem Brand: ${item.brand}\nItem Description: ${item.description}`)}>View More</button>
          </td>
        )
      }}
    />
  );
}

Basic usage:

As class component
import React, { Component } from "react";
import SmartTable from "react-smart-table-component";

export default class App extends Component {
  state = { users: [], hasMore: true };

  loadMore = () => {
    this.setState({
      users: this.state.users.concat([...moreData]),
    });
  };

  render() {
    return (
      <SmartTable
        items={this.state.users}
        headings={[
          { fieldName: "name", title: "Name" },
          { fieldName: "email", title: "Email" },
          { fieldName: "phone", title: "Phone" },
          { fieldName: "address", title: "Address" },
          { fieldName: "company", title: "Company" },
        ]}
        loading={loading}
        scopedFields={{
          address: (item) => <td>{`${item.address.street}`}</td>,
          company: (item) => <td>{`${item.company.name}`}</td>,
        }}
        loadMore={this.loadMore}
        hasMoreRecords={this.state.hasMore}
      />
    );
  }
}
As functional component with hooks
import React, { useState } from "react";
import SmartTable from "react-smart-table-component";
export default function Users() {
  const [users, setUsers] = useState([]);
  const [hasMore, setHasMore] = useState(false);

  const loadMore = () => {
    setUsers([...users, ...moreData]);
    setHasMore(true);
  };

  return (
    <SmartTable
      items={users}
      headings={[
        { fieldName: "name", title: "Name" },
        { fieldName: "email", title: "Email" },
        { fieldName: "phone", title: "Phone" },
        { fieldName: "address", title: "Address" },
        { fieldName: "company", title: "Company" },
      ]}
      loading={loading}
      scopedFields={{
        address: (item) => <td>{`${item.address.street}`}</td>,
        company: (item) => <td>{`${item.company.name}`}</td>,
      }}
      loadMore={loadMore}
      hasMoreRecords={hasMore}
    />
  );
}

API

Name
Type Required Default Description
items array true [] Provide the data list which you wanna iterate through
headings object true Table heading info The heads of the table rows
scopedFields object false undefined You can customize the info of a particular cell via using this prop
loading boolean false undefined This provides a loading text
onRowClick function false undefined It provides the row info on which the user clicks
customLoader React Node false undefined You can provide a custom loader of the table
recordsView string false undefined You can provide the data view pattern as either 'infinite-Scroll' or 'pagination'
inverseScroll boolean false undefined The default behaviour of infinite scroll is scroll to down but if you set this flag to true you can also use inverse scroll as well
hasMoreRecords boolean false undefined It is a flag to indicate the component that there are more records to display so that it can trigger loadMore function
loadMore function false undefined This method is called when the table scroll cross the threshold
totalPages number false undefined Total number of pages
currentPage number false undefined Current page value
onPageChange function false undefined It returns the clicked page number

Package Sidebar

Install

npm i react-smart-table-component

Weekly Downloads

18

Version

1.0.7

License

MIT

Unpacked Size

23.4 kB

Total Files

5

Last publish

Collaborators

  • ritikb
  • rawasthi231