ms-react-table 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,25 +1,49 @@
1
- # `index.ts`
1
+ # <center>MS React Table</center>
2
+ <center>This package is built to simplify complex table requirements in enterprise-grade apps.
3
+ It emphasizes **scalability, reusability, and developer experience**, making it ideal for projects that demand robust data grids without heavy dependencies.</center>
2
4
 
3
- This file serves as the entry point for the MsReactTable library. It manages exports, imports styles, and makes the main table component and its types available for external use.
4
5
 
5
- ## Main Responsibilities
6
+ ## `Table of Contents`
6
7
 
7
- - Imports the global table styles.
8
- - Exports the main component (`MsReactTable`) as the library's default export.
9
- - Exports TypeScript types for table props and header configuration.
8
+ - [Overview](#overview)
9
+ - [Installation](#installation)
10
+ - [Example](#example)
11
+ - [Basic Setup](#basic-setup)
12
+ - [Client Side Rendering](#client-side-rendering)
13
+ - [Row Selection](#row-selection)
14
+ - [Filter](#filter)
15
+ - [Column Setup](#column-setup)
16
+ - [Server Side Rendering](#server-side-rendering)
17
+ - [License](#license)
10
18
 
11
- ### Key Features
12
19
 
13
- - **Style Inclusion**: Ensures all consumers get the required CSS by importing the style sheet.
14
- - **Component Export**: Provides the table component for use in other React projects.
15
- - **Type Export**: Makes essential TypeScript types available for type checking and IntelliSense.
20
+ ## Overview
21
+
22
+ Ms-react-table is a lightweight, customizable React table component designed for modern enterprise applications.
23
+
24
+ ### Features
25
+
26
+ - Easy integration with React and TypeScript projects
27
+ - Configurable columns with flexible rendering
28
+ - Built-in sorting and filtering logic
29
+ - Resizable and visibility management
30
+ - Optimized for performance with large datasets
31
+ - Styled to blend seamlessly with default framework aesthetics
32
+
33
+ ## Installation
34
+
35
+ You can install **ms-react-table** via npm:
16
36
 
17
- ### Code Breakdown
37
+ ```bash
38
+ $ npm install ms-react-table
39
+ ```
40
+
41
+ Once the package is installed, you can import the library using import or require approach:
18
42
 
19
- ```ts
20
- import './_assets/style.css';
21
- export { default as MsReactTable } from './MsReactTable';
22
- export type { MsTablePropsTypes, MsTableHeaderCellTypes } from './types/msTableTypes';
43
+ ```jsx
44
+ import MsReactTable from 'ms-react-table';
45
+ import 'ms-react-table/dist/index.css';
46
+ import type { MsTablePropsTypes, MsTableHeaderCellTypes, rowSelectionConfig } from 'ms-react-table';
23
47
  ```
24
48
 
25
49
  #### Exports Explained
@@ -29,175 +53,317 @@ export type { MsTablePropsTypes, MsTableHeaderCellTypes } from './types/msTableT
29
53
  | MsReactTable | Component | The primary table UI component for React applications. |
30
54
  | MsTablePropsTypes | Type | Table props TypeScript type for prop validation. |
31
55
  | MsTableHeaderCellTypes | Type | Header cell definition type for table columns. |
56
+ | rowSelectionConfig | Type | Row Selection Configuration. |
32
57
 
33
- ---
58
+ `MsReactTable` assembles the table's structure, context, and layout, and enables pagination.
34
59
 
35
- # `MsReactTable.tsx`
36
-
37
- This file defines the main `MsReactTable` React component. It assembles the table's structure, context, and layout, and enables pagination.
38
-
39
- ## Overview
60
+ ## Example
40
61
 
41
- - **Component**: `MsReactTable`
42
- - **Props Type**: `MsTablePropsTypes`
43
- - **Context**: Uses `TableProvider` for state management and sharing refs.
44
- - **Composition**: Renders header, body, and (optionally) footer with pagination.
45
- - **Styling**: Applies a container and table-specific styles.
62
+ ## Basic Setup
46
63
 
47
- ## Component Responsibilities
48
-
49
- - Receives configuration via props (columns, data, styling, etc).
50
- - Provides context to subcomponents via `TableProvider`.
51
- - Manages DOM references for the table, body, and header.
52
- - Renders header, body, and (optionally) the footer for pagination.
53
-
54
- ### Props
55
-
56
- The expected props are described by `MsTablePropsTypes`. This can include:
57
-
58
- - `height`: Table container height.
59
- - `className`: Custom CSS classes.
60
- - `style`: Inline styles for the table.
61
- - `showPagination` (optional): Toggle footer visibility.
62
- - `ref`: Passed down to the root table element.
64
+ ```jsx
65
+ import React from 'react';
66
+ import MsReactTable from 'ms-react-table';
67
+ import 'ms-react-table/dist/index.css';
68
+
69
+ const UserList = () =>{
70
+ const columns=[
71
+ {
72
+ title: 'Name',
73
+ dataIndex: 'name',
74
+ width: 100
75
+ },
76
+ {
77
+ title: 'Age',
78
+ dataIndex: 'age',
79
+ width: 100
80
+ },
81
+ ...
82
+ ]
83
+
84
+ const users = [
85
+ {
86
+ name: 'Abhijit Verma',
87
+ age: 30,
88
+ ...
89
+ }
90
+ ]
91
+ return (
92
+ <>
93
+ <MsReactTable
94
+ columns={columns}
95
+ data={users}
96
+ />
97
+ </>
98
+ )
99
+ }
100
+ ```
63
101
 
64
- ### Code Structure
102
+ ### `Props List and description` :
103
+
104
+ | Prop | Type | Description | Default |
105
+ |-----------------------------|----------------------------------------------------------------------|------------------------------------------------------------------|-----------------|
106
+ | **columns** | `MsTableHeaderCellTypes[]` | Defines table column headers and configuration. | - |
107
+ | **data** | `any[]` | Array of row data to render in the table. | - |
108
+ | **isLoading** | `true \| false` | Shows loading state (e.g., spinner) when data is being fetched. | false |
109
+ | **height** | `string` | Sets fixed height for the table container. | 200px |
110
+ | **isClientSideRendering** | `boolean` | Enables client-side rendering of data (vs. server-side). | true |
111
+ | **showPagination** | `boolean` | Toggles pagination controls visibility. | true |
112
+ | **pageSizeOptions** | `number[]` | List of selectable page sizes for pagination. | [20,50,100] |
113
+ | **defaultPageSize** | `number` | Default number of rows per page. | 50 |
114
+ | **className** | `string` | Custom CSS class for the table wrapper. | - |
115
+ | **headerClassName** | `string` | Custom CSS class for the table header. | - |
116
+ | **style** | `React.CSSProperties` | Inline styles for the table container. | - |
117
+ | **ref** | `React.RefObject<GridFunctions>` | Ref exposing table functions (e.g., imperative methods). | - |
118
+ | **customComponentForNoRecords** | `React.ReactNode` | Custom component to show when no records are available. | - |
119
+ | **customComponentForFooter** | `React.ReactNode` | Custom component to render in the table footer left section. | - |
120
+ | **hideDefaultFilterButton** | `true \| false` | Hides the default filter button in the header. | false |
121
+ | **rowSelectConfig** | `rowSelectionConfig` | Configuration for row selection (checkboxes, rules). | - |
122
+ | **onPageChange** | `(currentPage: number, pageSize: number) => void` | Callback when pagination changes. | - |
123
+ | **onSortChange** | `(dataIndex: string, sortKey: 'asc' \| 'desc' \| null) => void` | Callback when sorting changes on a column. | - |
124
+ | **onFilterChange** | `(dataIndex: string, filterValue: any) => void` | Callback when a filter value changes. | - |
125
+ | **onRowSelect** | `(rowData: any) => void` | Callback when a row is selected. | - |
126
+ | **setRowData** | `(pageNo: number, pageSize: number, filters: filterValuesType, sortBy: { key: string, sortBy: sortDirection }) => void` | Function to update table data (usually for server-side fetch). | - |
127
+ #### Note : User RefObject to get access ms-react-table functions.
128
+
129
+ ## `Client Side Rendering`
65
130
 
66
131
  ```jsx
67
- import React from 'react'
68
- import { MsTablePropsTypes } from './types/msTableTypes'
69
- import { TableProvider } from './contextAPI/MsTableProvider'
70
- import MsTableHeader from './components/Header/msTableHeader'
71
- import MsTableBody from './components/Body/msTableBody'
72
- import MsTableFooter from './components/Footer/msTableFooter'
73
- import './_assets/style.css'
74
-
75
- const MsReactTable: React.FC<MsTablePropsTypes>=(props) => {
76
- const { showPagination = true } = props
77
- const containerRef = React.useRef<HTMLDivElement>(null!)
78
- const tbodyRef = React.useRef<HTMLTableSectionElement>(null!)
79
- const theadRef = React.useRef<HTMLTableSectionElement>(null!)
132
+ const ClientSideRender = () => {
133
+ const gridRef = useRef<GridFunctions>(null!)
134
+ const columns: MsTableHeaderCellTypes[] = [
135
+ { title: 'Name', dataIndex: 'name', width: 100 },
136
+ { title: 'Status', dataIndex: 'active', type: 'boolean', width: 100 },
137
+ { title: 'Age', dataIndex: 'age', width: 100, resizable: false, type: 'number', },
138
+ {
139
+ title: 'University', dataIndex: 'university', width: 400
140
+ },
141
+ { title: 'Gender', dataIndex: 'gender' },
142
+ { title: 'Email', dataIndex: 'email', width: 100 },
143
+ { title: 'Phone', dataIndex: 'phone', width: 100 },
144
+ { title: 'Birth Date', dataIndex: 'dob', width: 300, type: 'date' },
145
+ { title: 'Role', dataIndex: 'role', width: 300 },
146
+ { title: 'hobby', dataIndex: 'hobby', width: 300 },
147
+ { title: 'Created Date', dataIndex: 'createdDate', width: 150,type: 'date' },
148
+ ]
149
+
150
+ const users = [
151
+ {
152
+ "name": "Lowell Kassulke I",
153
+ "active": true,
154
+ "age": 40,
155
+ "gender": "Female to male transgender man",
156
+ "phone": "729.308.6202 x5063",
157
+ "email": "Zack_Koepp@hotmail.com",
158
+ "city": "Ameliafort",
159
+ "country": "India",
160
+ "dob": "2002-02-27",
161
+ "university": "Macejkovic - Cole University",
162
+ "hobby": "than",
163
+ "photo": "https://avatars.githubusercontent.com/u/43808697",
164
+ "role": "Mitchell - Barton",
165
+ "createdDate": "1968-10-08"
166
+ },
167
+ {
168
+ "name": "Claudia McLaughlin",
169
+ "active": false,
170
+ "age": 44,
171
+ "gender": "Man",
172
+ "phone": "715-952-8923 x885",
173
+ "email": "Lilliana26@hotmail.com",
174
+ "city": "Gulfport",
175
+ "country": "Denmark",
176
+ "dob": "1981-06-17",
177
+ "university": "Kreiger, Witting and McCullough University",
178
+ "hobby": "with",
179
+ "photo": "https://avatars.githubusercontent.com/u/244402",
180
+ "role": "Schmidt, Bernier and Waelchi",
181
+ "createdDate": "1978-11-22"
182
+ },
183
+ ]
80
184
 
81
185
  return (
82
- <TableProvider {...props} tbodyRef={tbodyRef} theadRef={theadRef}>
83
- <div className='table-container' ref={containerRef} style={{height:props.height || '200px'}}>
84
- <table
85
- ref={props.ref}
86
- className={`ms-react-table ${props.className}`}
87
- border={0}
88
- cellPadding={0}
89
- cellSpacing={0}
90
- style={{ width: '100%', ...props.style }}
91
- >
92
- <MsTableHeader ref={theadRef} />
93
- <MsTableBody ref={tbodyRef} />
94
- </table>
95
- </div>
96
- {showPagination && <MsTableFooter />}
97
- </TableProvider>
186
+ <>
187
+ <MsReactTable
188
+ columns={columns}
189
+ data={users}
190
+ height='400px'
191
+ onRowSelect={(data:any)=>{console.log('Selected Row Data:', data)}}
192
+ />
193
+ </>
98
194
  )
99
195
  }
100
196
 
101
- MsReactTable.displayName = 'MsReactTable'
102
- export default MsReactTable
103
197
  ```
104
198
 
105
- ---
199
+ ## `Row Selection`
106
200
 
107
- ## Component Layout
201
+ ```jsx
202
+ <MsReactTable
203
+ rowSelectConfig={{
204
+ showHeaderCheckbox:true,
205
+ selectionMode:'multiple', // single or multiple
206
+ headerCheckBoxTitle:'',
207
+ }}
208
+ columns={columns}
209
+ data={users}
210
+ height='400px'
211
+ onRowSelect={(data:any)=>{console.log('Selected Row Data:', data)}}
212
+ />
213
+ ```
214
+ #### Result For Single Selection
215
+ ![Row Single Selection View](image-1.png)
108
216
 
109
- The component composes the following:
217
+ #### Result For Multi Selection
218
+ ![Row Multi Selection View](image.png)
110
219
 
111
- | Section | Component | Purpose |
112
- |----------------|-------------------|-----------------------------------|
113
- | Table Header | MsTableHeader | Renders table column headers. |
114
- | Table Body | MsTableBody | Renders the visible row data. |
115
- | Table Footer | MsTableFooter | Handles pagination UI (optional). |
116
220
 
117
- ---
221
+ ## `Filter`
118
222
 
119
- ## Component Data Flow
223
+ ms-react-table have default enabled for filter, you just need to Add `isFilterEnabled: true` to header cell config.
120
224
 
121
- ```mermaid
122
- flowchart TD
123
- A[MsReactTable] -->|Context| B[TableProvider]
124
- B --> C[MsTableHeader]
125
- B --> D[MsTableBody]
126
- B --> E[MsTableFooter]
127
- A --> F[table-container (div)]
128
- F --> G[table]
129
- G --> C
130
- G --> D
225
+ ```jsx
226
+ const columns: MsTableHeaderCellTypes[] = [
227
+ { title: 'Name', dataIndex: 'name', width: 100, isFilterEnabled: true },
228
+ { title: 'Status', dataIndex: 'active', type: 'boolean', width: 100, isFilterEnabled: true, displayAs: { true: 'Enable', false: 'Diable' } },
229
+ { title: 'Age', dataIndex: 'age', width: 100, resizable: false, type: 'number', isFilterEnabled: true },
230
+ {
231
+ title: 'University', dataIndex: 'university', width: 400, isFilterEnabled: true,
232
+ cellRenderer: (rowData, dataIndex) => {
233
+ return <div style={{ color: 'red' }} >{rowData[dataIndex]}</div>
234
+ }
235
+ },
236
+ { title: 'Gender', dataIndex: 'gender' },
237
+ { title: 'Email', dataIndex: 'email', width: 100, isFilterEnabled: true },
238
+ { title: 'Phone', dataIndex: 'phone', width: 100 },
239
+ { title: 'Birth Date', dataIndex: 'dob', width: 300, isFilterEnabled: true, type: 'date' },
240
+ { title: 'Role', dataIndex: 'role', width: 300, isFilterEnabled: true },
241
+ { title: 'hobby', dataIndex: 'hobby', width: 300 },
242
+ { title: 'Created Date', dataIndex: 'createdDate', width: 150, isFilterEnabled: true, type: 'date' },
243
+ ]
131
244
  ```
245
+ #### Filter View
246
+ ![Filter Modal](image-2.png)
132
247
 
133
- - **MsReactTable** initializes and passes props and refs to **TableProvider**.
134
- - The provider gives context (data, config, refs) to all child components.
135
- - **MsTableHeader**, **MsTableBody**, and **MsTableFooter** consume the context.
136
- - The root `<div>` ensures the table is scrollable if height constraints exist.
137
-
138
- ---
248
+ if you need your custom button to hide/show Filter Modal use RefObject as below jsx
139
249
 
140
- ## Usage Example
250
+ ```jsx
251
+ <>
252
+ <button onClick={()=>gridRef?.current.showFilterModal(true)}>Show Filter</button>
253
+ <MsReactTable
254
+ rowSelectConfig={{
255
+ showHeaderCheckbox:true,
256
+ selectionMode:'single',
257
+ headerCheckBoxTitle:'',
258
+ }}
259
+ columns={columns}
260
+ data={users}
261
+ height='600px'
262
+ hideDefaultFilterButton={true} // This prop will hide default filter toggle button from footer
263
+ />
264
+ </>
265
+ ```
141
266
 
142
- ```js
143
- import { MsReactTable } from 'ms-react-table';
267
+ Data Type used in filter
268
+ * String
269
+ * Integer
270
+ * Boolean (this will have radio button)
271
+ * Date
144
272
 
145
- const columns = [
146
- { key: 'id', label: 'ID' },
147
- { key: 'name', label: 'Name' }
148
- ];
273
+ #### Use DisplayAs key to override true and false text
274
+ ```jsx
275
+ { title: 'Status', dataIndex: 'active', type: 'boolean', width: 100, isFilterEnabled: true, displayAs: { true: 'Enable', false: 'Disable' } },
276
+ ```
149
277
 
150
- const data = [
151
- { id: 1, name: 'Alice' },
152
- { id: 2, name: 'Bob' }
153
- ];
278
+ ## `Column Setup`
154
279
 
155
- <MsReactTable
156
- columns={columns}
157
- data={data}
158
- height="300px"
159
- showPagination={true}
160
- />
280
+ ```jsx
281
+ {
282
+ title: 'Action',
283
+ dataIndex: 'action',
284
+ width: 100,
285
+ type: 'string',
286
+ hideActionMenu: true,
287
+ cellRenderer: (rowData, dataIndex) => {
288
+ return <div className='text-center'><Button label='#' onClick={() => console.log(rowData, dataIndex)} /></div>
289
+ },
290
+ isHidden: false,
291
+ isFilterEnabled: false,
292
+ resizable: false,
293
+ },
161
294
  ```
162
295
 
163
- ---
296
+ Features:
164
297
 
165
- ## Return Types
298
+ | **Key** | **Description** |
299
+ |---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
300
+ | `title` | The display name of the column header (`'Action'`). This is what users see at the top of the column. |
301
+ | `dataIndex` | The field identifier (`'action'`) used to map data from the dataset to this column. |
302
+ | `width` | The fixed width of the column (`100` pixels). Controls how much horizontal space the column occupies. |
303
+ | `type` | The data type of the column (`'string'`). Helps define how the column data should be interpreted or rendered. |
304
+ | `hideActionMenu` | Boolean (`true`). Hides the default action menu (like sorting, filtering, etc.) for this column. |
305
+ | `cellRenderer` | A custom rendering function. In this case, it renders a centered `<Button>` with label `'#'` that logs `rowData` and `dataIndex` when clicked. |
306
+ | `isHidden` | Boolean (`false`). Determines whether the column is visible. If set to `true`, the column will not be shown in the grid. |
307
+ | `isFilterEnabled` | Boolean (`false`). Controls whether filtering is enabled for this column. Here, filtering is disabled. |
308
+ | `resizable` | Boolean (`false`). Indicates whether the column width can be resized by the user. |
166
309
 
167
- - **Component**: Returns a composite React element (`JSX.Element`) representing a styled, interactive table.
168
- - **Refs**: Exposes underlying DOM elements via React refs for advanced use (scrolling, focusing, etc).
169
310
 
170
- ---
311
+ ## Server Side Rendering
171
312
 
172
- ## Exceptions and Error Handling
313
+ ```jsx
314
+ const ServerSideRender = () => {
315
+ const columns: MsTableHeaderCellTypes[] = [
316
+ { title: 'Id', dataIndex: 'id', width: 80},
317
+ { title: 'Name', dataIndex: 'title', width: 100, isFilterEnabled: true },
318
+ { title: 'Slug', dataIndex: 'slug', width: 100, isFilterEnabled: true },
319
+ { title: 'price', dataIndex: 'price', type:'number', isFilterEnabled: true },
320
+ { title: 'description', dataIndex: 'description', width: 300, isFilterEnabled: true },
321
+ { title: 'category', dataIndex: 'category', width: 100, type:'object' },
322
+ { title: 'creationAt', dataIndex: 'creationAt', width: 300, isFilterEnabled: true, type: 'date' },
323
+ { title: 'updatedAt', dataIndex: 'updatedAt', width: 150 },
324
+ { title: 'Created Date', dataIndex: 'createdDate', width: 150, isFilterEnabled: true, type: 'date' },
325
+ ]
326
+
327
+ const gridRef = useRef<GridFunctions>(null!)
328
+ const [isLoading, setLoading]=useState(false)
173
329
 
174
- - **Refs**: The use of non-null assertion (`null!`) when creating refs assumes the elements will always exist. If a ref is passed down or used improperly, this may lead to runtime errors.
175
- - **Props**: The component expects props to match `MsTablePropsTypes`. Passing incompatible props can cause runtime or type errors.
330
+ const setRowData = (pageNo:number, pageSize:number, filters:filterValuesType, sortBy:{key:string, sortBy?: sortDirection}) => {
331
+ setLoading(true)
176
332
 
177
- ---
333
+ // Your API call logic goes here
334
+ // ...
178
335
 
179
- ## Best Practices
336
+ gridRef?.current?.setRowData?.(users.data, users.total);
180
337
 
181
- ```card
182
- {
183
- "title": "Type Safety and Refs",
184
- "content": "Always use the exported types for props and headers. Handle refs with care to avoid null dereferencing."
185
- }
186
- ```
338
+ // Note: setRowData function of gridRef will set the data to the table and total records for pagination
339
+
340
+ setLoading(false)
187
341
 
188
- ---
342
+ }
189
343
 
190
- ## Summary Table
191
344
 
192
- | Feature | Description |
193
- |-------------------|------------------------------------------------------|
194
- | Context API | Shares table state and refs with all child elements. |
195
- | Pagination | Toggleable via `showPagination` prop. |
196
- | Customization | Supports custom class names and inline styles. |
197
- | Extensibility | Designed for component composition and context use. |
345
+ return (
346
+ <>
347
+ <MsReactTable
348
+ ref={gridRef}
349
+ isClientSideRendering={false}
350
+ columns={columns}
351
+ hideDefaultFilterButton={true}
352
+ height="calc(100vh - 200px)"
353
+ customComponentForNoRecords={<div>Custom Messaage will show here</div>}
354
+ setRowData={setRowData}
355
+ isLoading={isLoading}
356
+ />
357
+ </>
358
+ )
359
+ }
360
+ ```
361
+ ##### Note:
362
+ * `isClientSideRendering={false}` This must be false, if you are using dynamic data
363
+ * setRowData Function will trigger on page ready and every event of pagination
198
364
 
199
- ---
365
+ ![Custom No Records message](image-3.png)
200
366
 
201
- ## Library Architecture
367
+ ## License
202
368
 
203
- This modular structure ensures the table can be easily integrated, extended, or customized within any React project. By separating header, body, and footer, and leveraging context, the library is both flexible and robust.
369
+ ![MIT License Logo](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)