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 🙏

© 2024 – Pkg Stats / Ryan Hefner

ait-reusable-component-react

v0.1.74

Published

A fully-fledged Table module created for React apps. Provides table component, search field, paging mode and more!

Downloads

9

Readme

AIT Reusable Component React

A fully-fledged Table module created for React apps. Provides table component, search field, paging mode and more!

Overview

Introduction

AIT Reusable Component React provide You to use components that adapted to AIT standards. Its fully customizeable, realabel, integrated with Tailwind CSS.

Demo

Installation

System Requirements

| Module | Version | | --- | --- | | Node.js | ^18.19.1 | | React | ^18.2.0 | | Tailwind CSS | ^3.4.1 | | react-router-dom | ^6.22.3 |

Install The Module

With NPM

npm install ait-reusable-component-react

With Yarn

yarn add ait-reusable-component-react

Install Tailwind CSS

This project uses Tailwind CSS for UI Framework. You can refer this link to install Tailwind CSS

Tailwind CSS Configuration

Add the AIT Reusable Component React content path to tailwind.config.js

import { aitTailwindContent } from 'ait-reusable-component-react/utils';

export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
    aitTailwindContent()
  ],
  ...
}

Add extends color primary, secondary, tertiary, danger, success, warning, info to tailwind.config.js

export default {
  theme: {
    extend: {
      colors: {
        primary: {
          DEFAULT: '#7C5BFA',
          light: {
            1: '#F1EBFE',
            2: '#F8F5FF',
          },
          dark: {
            1: '#2D1D90',
            2: '#1D1177',
          },
          //v2 color base template
          25: '#F8F5FF',
          50: '#F1EBFE',
          100: '#E7DEFE',
          200: '#CFBDFE',
          300: '#B59CFD',
          400: '#9F83FB',
          500: '#7C5BFA',
          600: '#5E42D7',
          700: '#432DB3',
          800: '#2D1D90',
          900: '#1D1177',
          //end v2 color base template
        },
        secondary: {
          //v2 color base template
          25: '#F9FDF7',
          50: '#F3FCED',
          100: '#EDFCE4',
          200: '#D8FACA',
          300: '#B9F0AC',
          400: '#9AE191',
          500: '#6FCE6D',
          600: '#4FB156',
          700: '#369444',
          800: '#227736',
          900: '#14622D',
          //end v2 color base template
        },
        tertiary: {
          //v2 color base template
          25: '#f2fffb',
          50: '#e3fcf4',
          100: '#c9fcef',
          200: '#95f9e9',
          300: '#5fede2',
          400: '#37dcdc',
          500: '#00b5c6',
          600: '#008daa',
          700: '#006b8e',
          800: '#004c72',
          900: '#00375f',
          //end v2 color base template
        },
        danger: {
          DEFAULT: '#FF5454',
          light: {
            1: '#FFCCBA',
            2: '#FDEFE8',
          },
          dark: {
            1: '#B72A42',
            2: '#7A1034',
          },
          //v2 color base template
          25: '#FDEFE8',
          50: '#FEEFE7',
          100: '#FFE8DC',
          200: '#FFCCBA',
          300: '#FFAA98',
          400: '#FF897E',
          500: '#FF5454',
          600: '#DB3D4B',
          700: '#B72A42',
          800: '#931A3A',
          900: '#7A1034',
          //end v2 color base template
        },
        success: {
          DEFAULT: '#09c380',
          light: {
            1: '#5ee1b2',
            2: '#cff6e8',
          },
          dark: {
            1: '#069d66',
            2: '#098c5d',
          },
          //v2 color base template
          25: '#f8fff2',
          50: '#effce3',
          100: '#dff9cf',
          200: '#b9f3a2',
          300: '#84dc6d',
          400: '#53ba45',
          500: '#1b8c17',
          600: '#107816',
          700: '#369444',
          800: '#075117',
          900: '#044317',
          //end v2 color base template
        },
        warning: {
          DEFAULT: '#F2D12B',
          light: {
            1: '#FEFAD4',
            2: '#FCFAE8',
          },
          dark: {
            1: '#AE8F15',
            2: '#745A08',
          },
          //v2 color base template
          25: '#FCFAE8',
          50: '#FDFADE',
          100: '#FEFAD4',
          200: '#FDF4AA',
          300: '#FBEA7F',
          400: '#F7E05E',
          500: '#F2D12B',
          600: '#D0AF1F',
          700: '#AE8F15',
          800: '#8C700D',
          900: '#745A08',
          //end v2 color base template
        },
        info: {
          DEFAULT: '#009CF7',
          light: {
            1: '#CBF8FE',
            2: '#E3F9FC',
          },
          dark: {
            1: '#005AB1',
            2: '#002D76',
          },
          //v2 color base template
          25: '#E3F9FC',
          50: '#D9F8FD',
          100: '#CBF8FE',
          200: '#98EBFE',
          300: '#65D7FC',
          400: '#3EC0FA',
          500: '#009CF7',
          600: '#0079D4',
          700: '#005AB1',
          800: '#00408F',
          900: '#002D76',
          //end v2 color base template
        }
      }
    },
  },
  ...
}

Components

Table

import { Table } from 'ait-reusable-component-react'

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | children | ReactNode | Children Component | undefined | No | | classNames | TableClassNames | Class name that apply to Table component | undefined | No | | onUpdateParams | (params: TableContextValueParams) => void | Fired when TableCell with order props was clicked | undefined | No | | params | [x: string]: any | value that apply to TableCell with order props | undefined | No |

All common table props can be apply to this component

TableClassNames

| Name | Type | Required | | --- | --- | :---: | | container | string | No | | table | string | No |

TableContextValueParams

| Name | Type | Required | | --- | --- | :---: | | [x: string] | any | No |


TableRow

import { TableRow } from 'ait-reusable-component-react'

All common tr props can be apply to this component


TableHead

import { TableHead } from 'ait-reusable-component-react'

All common thead props can be apply to this component


TableBody

import { TableBody } from 'ait-reusable-component-react'

All common tbody props can be apply to this component


TableCell

Table > TableHead > TableRow > TableCell

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | children | ReactNode | Children Component | undefined | No | | classNames | TableCellClassNames | Class name that apply to TableCell component | undefined | No | | index | boolean | Set TableCell behavior as index | false | No | | order | string | Can be used to provide sort-order function | undefined | No | | orderPrefix | string | apply prefix to order value, useful if you want to apply multiple sort-order | undefined | No | | action | boolean | Set TableCell behavior as action | false | No |

Table > TableBody > TableRow > TableCell

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | children | ReactNode | Children Component | undefined | No | | classNames | TableCellClassNames | Class name that apply to TableCell component | undefined | No | | index | number | Set TableCell index | undefined | No | | value | any | Set TableCell children with validation. If validation is fail, placeholder will be appear instead, prefer to use this props instead of children if your given children posibly undefined | undefined | No | | validate | (value: T) => boolean | custom validation | undefined | No | | placeholder | string | appear while return validate is false | - | No | | renderValue | (value: T) => ReactNode | Render custom value. Useful if you want to mapping value of Array or Object | undefined | No | | action | boolean | Set TableCell behavior as action | false | No |

All common tbody props can be apply to this component

TableCellClassNames

| Name | Type | Required | | --- | --- | :---: | | actionDivider | string | No | | actionWrapper | string | No | | cell | string | No | | ascIcon | string | No | | descIcon | string | No | | icon | string | No |


ActionButton

import { ActionButton } from 'ait-reusable-component-react'

Used for TableCell action

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | variant | ReactNode | Set behavior of ActionButton | undefined | No | | loading | boolean | Set loading state | undefined | No | | to | string | route to destination page. make sure react-router-dom v6 was installed | undefined | No |

All common button props can be apply to this component


Typography

import { Typography } from 'ait-reusable-component-react'

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | children | ReactNode | Children Component | undefined | No | | variant | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'body1' | 'body2' | 'subtitle1' | 'subtitle2' | 'caption' | Set behavior of Typography | body1 | No | | type | 'light' | 'normal' | 'medium' | 'semibold' | 'bold' | Set type of Typography | normal | No |

All common HTMLAttributes can be apply to this component


TextField

import { TextField } from 'ait-reusable-component-react'

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | label | string | label that apply to TextField | undefined | No | | classNames | TextFieldClassNames | Class name that apply to TableCell component | undefined | No | | helperText | string | TextField helper text | undefined | No | | startIcon | ComponentType<SVGProps> | prefix TextField icon | undefined | No | | endIcon | ComponentType<SVGProps> | suffix TextField icon | undefined | No | | onClickEndIcon | MouseEventHandler | Fired when end icon was clicked | undefined | No | | prefix | string | number | prefix TextField | undefined | No | | suffix | string | number | suffix TextField | undefined | No | | sizing | 'sm' | 'md' | 'lg' | size of TextField | 'md' | No | | error | boolean | Tell to TextField that style behavior must be danger style | undefined | No |

All common input props can be apply to this component

TextFieldClassNames

| Name | Type | Required | | --- | --- | :---: | | container | string | No | | helperText | string | No | | startIconWrapper | string | No | | startIcon | string | No | | endIconWrapper | string | No | | endIcon | string | No | | wrapper | string | No | | input | string | No |


Paging

import { Paging } from 'ait-reusable-component-react'

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | :---: | :---: | | onChangePage | (data: PagingParams) => void | Fired when paging was changed | undefined | Yes | | page | number | Current page | 1 | No | | limit | number | Total data to display per page | 10 | No | | total | number | Total data | 0 | No | | loading | boolean | Props to temporary disable paging while data on load | false | No |

PagingParams

| Name | Type | Required | | --- | --- | :---: | | page | number | Yes | | limit | number | Yes |


Search

import { InputSearch } from 'ait-reusable-component-react'

| Parameter | Type | Description | Default Value | Required | | --- | --- | --- | --- | :---: | | onChangeText | (value: string) => void | Fired while value is changed | undefined | No | | value | string | set controlled value for this component | undefined | No |

All common input props can be apply to this component

Example

How to use it

Demo

Common Usage

import {
  useState
} from "react";

import {
  ActionButton,
  Content,
  ContentBody,
  ContentHeader,
  InputSearch,
  Paging,
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableRow,
  ToggleDarkMode
} from "ait-reusable-component-react";
import {
  Wrapper
} from "../../components";

export function ExamplePage() {

  const [params, setParams] = useState({
    total: 1000,
    size: 10,
    page: 1
  });

  const updateParams = (value: typeof params) => {
    setParams((_) => ({ ..._, ...value }));
  };

  const renderTableItem = (_: any, index: number) => {
    return (
      <TableRow key={index}>
        <TableCell {...{ index }} />
        <TableCell>First Name</TableCell>
        <TableCell>Last Name</TableCell>
        <TableCell>Username</TableCell>
        <TableCell>Email</TableCell>
        <TableCell action={true}>
          <ActionButton variant="detail" />
          <ActionButton variant="edit" />
          <ActionButton variant="delete" />
        </TableCell>
      </TableRow>
    );
  };

  return (
    <Wrapper>
      <Content>
        <ContentHeader title="Table Example">
          <ToggleDarkMode />
        </ContentHeader>
        <ContentBody>
          <InputSearch />
          <Table onUpdateParams={(_: any) => updateParams(_)} {...{ params }}>
            <TableHead>
              <TableRow>
                <TableCell index={true} />
                <TableCell order="first_name">First Name</TableCell>
                <TableCell order="last_name">Last Name</TableCell>
                <TableCell order="username">Username</TableCell>
                <TableCell orderPrefix="example" order="email">Email</TableCell>
                <TableCell className="w-[160px]" action={true}></TableCell>
              </TableRow>
            </TableHead>
            <TableBody>
              {Array.from({ length: params.size }, renderTableItem)}
            </TableBody>
          </Table>
          <Paging
            onChangePage={(_: any) => updateParams(_)}
            total={params.total}
            size={params.size}
            page={params.page}
          />
        </ContentBody>
      </Content>
    </Wrapper>
  );
}

Integrating with Query Params

Demo

See src/examples/modules/ExampleWithQueryParams

Integrating with Query Params and React Query

Make sure your Backend was following AIT standard.

Demo

See src/examples/modules/ExampleWithReactQuery

Developers

muhammad-f-huda-ait