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

react-weblineindia-master-grid

v1.0.1

Published

The React Grid component is a customizable and feature-rich data grid that allows you to display and manage tabular data efficiently. When a row in the Master Grid is expanded, a new Detail Grid appears underneath that row. It supports pagination, sorting

Downloads

5

Readme

ReactJS - Master-Grid Component

The React Grid component is a customizable and feature-rich data grid that allows you to display and manage tabular data efficiently. When a row in the Master Grid is expanded, a new Detail Grid appears underneath that row. It supports pagination, sorting, searching, and voice-based search for enhanced user experience. This component can be easily integrated into your React applications.

You can easily customize the component's appearance and behavior by using the provided props. The browser support includes modern versions of popular browsers, ensuring compatibility across various platforms.

Table of contents

Browser Support

| Chrome | Edge | IE | | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | 83.0 ✔ | 83.0 ✔ | 11.9 ✔ |

Demo

Getting started

Install the npm package:

npm install react-weblineindia-master-grid
#OR
yarn add react-weblineindia-master-grid

Usage

Use the <react-weblineindia-master-grid> component:

import { useEffect, useState } from "react";
import axios from "axios";
import { useGridContext } from "react-weblineindia-master-grid";
import Grid from "react-weblineindia-master-grid";

const App = () => {
   const { setColumnState, visibleColumns } = useGridContext();
  const [data, setData] = useState({});
  const [allData, setAllData] = useState([]);
  const [parameter, setParameter] = useState({
    page: 1,
    records: 10,
    searchQuery: "",
    sortColumn: "",
    sortOrder: "ASC",
  });
  const [editedData, setEditedData] = useState([]);

  useEffect(() => {
    //HERE, You can call your API...
    setColumnState(columnProps);
    getData();
  }, [parameter]);

  useEffect(() => {
    //HERE, You can call your API...
    getAllData();
  }, []);

  const getData = async () => {
    const response = await axios.get(
      `http://localhost:3000/master-grid?page=${parameter.page}&limit=${parameter.records}&search=${parameter.searchQuery}&sortField=${parameter.sortColumn}&sortOrder=${parameter.sortOrder}`
    );
    setData(response.data);
  };

  const getAllData = async () => {
    const response = await axios.get(`http://localhost:3000/master-grid/all`);
    setAllData(response.data);
  };

  const handlePageChange = (page) => {
    setParameter({ ...parameter, page: page });
  };

  // Dropdown change event for pagination
  const onDropdownChange = (records) => {
    setParameter({ ...parameter, records: records });
  };


  // Sorting
  const handleSort = (field) => {
    if (field !== "action") {
      if (field === parameter.sortColumn) {
        // Reverse the sort direction if the same column is clicked
        const order = parameter.sortOrder === "ASC" ? "DESC" : "ASC";
        setParameter({ ...parameter, sortOrder: order });
      } else {
        // Set the new sort column and default sort direction
        setParameter({ ...parameter, sortColumn: field, sortOrder: "ASC" });
      }
    }
  };

  // Searching
  const onSearch = (value) => {
    setParameter({ ...parameter, searchQuery: value });
  };
  // clear search Input
  const onClear = () => {
    onSearch('');
  };

  // Event for storing the searchQuery based on voice search
  const micHandlerForSearch = (value) => {
    setParameter((prevParameter) => ({
      ...prevParameter,
      searchQuery: value,
    }));
  };


  // Function to handle inline edit for child rows
  const handleEdit = (rowIndex, childIndex, columnKey, value) => {
    const updatedData = [...editedData];
    if (!updatedData[rowIndex]) {
      updatedData[rowIndex] = [];
    }
    if (!updatedData[rowIndex][childIndex]) {
      updatedData[rowIndex][childIndex] = {};
    }
    updatedData[rowIndex][childIndex][columnKey] = value;
    setEditedData(updatedData);
  };

  // Function to save the edited data back to the main data array
  const handleSave = (rowIndex, childIndex, data, columnKeys) => {
    const updatedData = [...data];
    const editedRowData = editedData[rowIndex]?.[childIndex];
    if (editedRowData) {
      columnKeys.forEach((columnKey) => {
        if (editedRowData.hasOwnProperty(columnKey.columnKey)) {
          updatedData[rowIndex].children[childIndex][columnKey.columnKey] =
            editedRowData[columnKey.columnKey];
        }
      });
    }
    setEditedData((prevEditedData) => {
      const updatedEditedData = [...prevEditedData];
      updatedEditedData[rowIndex][childIndex].edit = false;
      return updatedEditedData;
    });
  };

  // Function to cancel the edit and discard changes
  const handleCancelEdit = (rowIndex, childIndex) => {
    const updatedData = [...editedData];
    updatedData[rowIndex][childIndex].edit = false;
    setEditedData(updatedData);
  };


  const handleSelectCheckbox = (selectedData) => {
    console.log(selectedData)
  }

  const isSearch = true;
  const searchProps = {
    searchPlaceHolder: "Search/Speak Something...",
    searchBoxStyle: "search-box",
    searchInputDivStyle: "input-area",
    searchInputStyle: "search-input",
    clearButtonStyle: "clear-button",
    onSearch: onSearch,
    onClearBtn: onClear,
    parameter:parameter
  };

  const isVoiceSearch = true;
  const voiceSearchProps = {
    micIconStyle: "mic-icon",
    popupContentStyle: "large-mic",
    micHandlerForSearch: micHandlerForSearch
  };

  const gridTableProps = {
    data: data?.data,
    noRecordMessage: "No Records Available",
    gridTableDivStyle: "table-container",
    noRecordMessageStyle: "no-record-message-style", 
    gridTableStyle: "grid-table",
    expandButtonStyle: "expand-button",
    isCheckboxVisible: true,
    isShowChildrenGrid: true,
    isEditableGrid: true,
    handleSort,
    parameter,
    handleEdit,
    handleSave,
    editedData,
    handleCancelEdit,
    handleSelectCheckbox
  };
  const columnProps = [
    { columnKey: "roleName", label: "Role", type: "text", isParent: true, isEditable: true },
    { columnKey: "userName", label: "Name", type: 'text', isEditable: true },
    { columnKey: "emailId", label: "Email ID", type: 'text', isEditable: true },
    { columnKey: "phone_no", label: "Mobile Number", type: 'text', isEditable: true },
    { columnKey:"gender", label: "Gender",type :'text' ,isEditable :true},
    { columnKey: "age", label: "Age", type: 'number', isEditable: true },
    { columnKey: "country", label: "Country", type: 'dropdown' },
    { columnKey:"action", label: "Action" ,type :'button'},
  ];

  const isPagination = true;
  const paginationContainerProps = {
    data: data,
    PaginationDropDownValues: [5, 10, 20, 50, 100],
    paginationRecordsSpan: "Records Per Page:",
    customRecordMessage: `Showing ${parameter.records} of ${data?.childrenRecords} records`,
    paginationContainerStyle: "pagination-container",
    paginationStyle: "pagination",
    paginationActiveStyle: "active",
    handlePageChange: handlePageChange,
    parameter: parameter,
    onDropdownChange: onDropdownChange
  };
  const isColumnVisibility = true;
  const columnVisibilityProps = {
    columnVisibilityStyle: "column-visibility",
    label: 'Manage Columns',
    closeBtnLabel:'Close'
  };

  const isExcelAllowed = true;
  const excelProps = {
    data: allData,
    headers: columnProps,
    filename: "Data",
    exportBtnStyle: "button",
    label: "Export to Excel",
  };

  return (
      <Grid
        isSearch={isSearch}
        searchProps={searchProps}
        isVoiceSearch={isVoiceSearch}
        voiceSearchProps={voiceSearchProps}
        gridTableProps={gridTableProps}
        isColumnVisibility={isColumnVisibility}
        columnVisibilityProps={columnVisibilityProps}
        columnProps={visibleColumns}
        isPagination={isPagination}
        paginationContainerProps={paginationContainerProps}
        isExcelAllowed={isExcelAllowed}
        excelProps={excelProps}
      />
  );
};
export default App;

API Response

Please note that you have the flexibility to customize the columns of both the parent and child tables according to the data received from your API. The component is designed to dynamically adapt to your data structure, allowing seamless integration with various APIs.

Below is an example of how the data should be structured for the component to work correctly. You can adjust the columns and data fields as per your API's response to display the desired information efficiently:

const data = {
  data: [
    {
      //Parent table Data
      roleId: 1,
      roleName: "Super Admin",
      children: [
        {
          userId: 1,
          userName: "Smit Shah",
          age: "35",
          country: "USA",
        },
        //Add more children data
      ],
    },
    {
      roleId: 3,
      roleName: "Owner",
      childrenRecords: [],
    },
    //Add more data
  ],
  totalParentRecords: 2,
  childrenRecords: 1,
  page: 1,
  limit: 5,
  totalPages: 1,
};

CSS

The React Grid component not only offers powerful data management capabilities but also provides the freedom to customize the CSS styles to match your application's design and branding. This means you can tailor the appearance of the grid according to your taste and seamlessly integrate it into your existing UI.

You have control over various elements,

  • searchProps

    • searchInputStyle: Apply custom styles to the search input.
    • clearButtonStyle: Customize the clear button next to the search input.
    • onSearch: Method to handle Search Functionality.
    • onClearBtn: Method to handle Clear Search Input.
    • parameter : It contains state parameters.
  • voiceSearchProps

    • micIconStyle: Customize the microphone icon for voice-based search.
    • popupContentStyle: Apply custom styles to the voice search popup container.
    • popupMicIconStyle: Customize the microphone icon inside the voice search popup.
    • micHandlerForSearch: Handle the mic for search.
  • gridTableProps

    • gridTableStyle: Tailor the appearance of the grid table with custom styles.
    • expandButtonStyle: Apply styles to the expand button within the grid table.
  • paginationContainerProps

    • paginationContainerStyle: Customize the pagination container with your preferred styles.
    • recordsPerPageStyle: Apply custom styles to the records per page dropdown in the pagination.
    • paginationStyle: Customize the overall pagination component with your desired styles.
    • paginationActiveStyle: Apply styles to the active page number in the pagination component.
    • handlePageChange: Method to handle page change,
    • parameter: It contains the state values,
    • onDropdownChange: Method to handle dropdown change
  • columnVisibilityProps

    • columnVisibilityStyle: Apply styles to the column visibility.
  • excelProps

    • data: This key should be assigned the array of data that you want to export to the Excel file.
    • headers: Assign an array of column headers to this key.
    • filename: Provide a desired filename (without the file extension) for the exported Excel file.
    • exportBtnStyle: Apply styles to the expand button within the grid table.
    • label: Specify the text that should appear on the export button. .

Available Props

| Prop | Type | default | Description | | ------------------------ | --------------- | ------- | ---------------------------------------------------------- | | isSearch | Boolean | false | For showing Search input | | searchProps | Object | | Contains props for the search input | | isVoiceSearch | Boolean | false | For showing Voice base Search | | voiceSearchProps | Object | | Contains props for the voice base search | | gridTableProps | Object | | Contains props for the data table | | columnProps | Array of Object | | An array of objects defining the columns of the data table | | isPagination | Boolean | false | For showing Pagination | | paginationContainerProps | Object | | Contains props for the Pagination | | isExcelAllowed | Boolean | | For Showing Export button | | excelProps | Object | | Contains props for the export to excel | | isColumnVisibility | Boolean | | For Showing column menu | | columnVisibilityProps | Object | | Contains props for the visibility columns |

SearchProps

| Key | Type | default | Description | | ----------------- | ------ | ----------- | ----------------------------------------------------------- | | searchPlaceHolder | String | 'Search...' | For showing Search Place holder | | searchBoxStyle | String | | Custom styles for the search input and mic-icon div | | searchInputStyle | String | | Custom styles for the search input | | clearButtonStyle | String | | Custom styles for the clear button next to the search input | | onSearch | Function | | Method to handle Search Functionality | | onClearBtn | Function | | Method to handle Clear Search Input | | parameter | Object | | It contains state parameters. |

VoiceSearchProps

| Key | Type | default | Description | | ----------------- | ------ | ------- | --------------------------------------------------------------- | | micIconStyle | String | | Custom styles for the microphone icon search | | popupContentStyle | String | | Custom styles for the voice search popup container | | popupMicIconStyle | String | | Custom styles for the microphone icon in the voice search popup | | micHandlerForSearch | Function | | Handle the mic for search |

GridTableProps

| Key | Type | default | Description | | ------------------------ | ------- | ------- | -------------------------------------------- | | data | Array | | Contains actual data to be displayed on grid | | noRecordMessage | String | null | Display message when no data found | | gridTableStyle | String | | Custom styles for the Grid table | | noRecordMessageStyle | String | | Custom styles for the no data found string | | expandButtonStyle | String | | Custom styles for the expand the grid Table | | onHandelSelectedCheckbox | Method | | Function will receive Select Checkbox Value | | isCheckboxVisible | Boolean | true | For Showing Checkbox | | isShowChildrenGrid | Boolean | true | Display Single grid | | isEditableGrid | Boolean | true | Display Editable Grid | | handleSort | Function | | Method to handle sort functionality | | parameter | Object | | It contains state parameter | | handleEdit | Function | | Method to handle Edit row text box | | handleSave | Function | | Method to handle Save row data | | editedData | Array | | It contains array to manage row data | | handleCancelEdit | Function | | Method to handle Cancel Edit |

ColumnProps

| Key | Type | default | Description | | --------------------------------------------------- | ------ | ------- | ----------------------------------------------- | | columnKey | String | | Representing the unique key of the column | | label | String | | Representing the label to display in the header | | Example : columnProps = [{columnKey:'', label:'' }] |

PaginationContainerProps

| Key | Type | default | Description | | ------------------------ | ------ | ------------------------ | --------------------------------------------------------------------------------------------- | | data | Object | | Contains actual data to be displayed on grid | | paginationDropDownValues | Array | | An array of numbers representing the available options for records per page in the Pagination | | paginationRecordsSpan | String | Show Per Page: | Custom text to display before the Dropdown | | customRecordMessage | String | Showing 10 of 10 records | Custom message to display the number of records shown | | paginationContainerStyle | String | | Custom styles for the pagination container | | paginationStyle | String | | Custom styles for the Pagination component | | paginationActiveStyle | String | | Custom styles for the active page number in the Pagination component |

ColumnVisibility

| Key | Type | default | Description | | --------------------------------------------------- | ------ | ------- | ----------------------------------------------- | | columnVisibilityStyle | String | | Custom styles for the column visibility | | label | String | | Manage Label for visibility modal | | closeBtnLabel | String | | Manage close button label |

excelProps

| Key | Type | default | Description | | --------------------------------------------------- | ------ | ------- | ----------------------------------------------- | | data | Array | | Representing the unique key of the column | | headers | Array | | Representing the label to display in the header | | filename | String | | Representing the label to display in the header | | exportBtnStyle | String | | Representing the label to display in the header | | label | String | | Representing the label to display in the header |

Want to Contribute?

  • Created something awesome, made this code better, added some functionality, or whatever (this is the hardest part).
  • Fork it.
  • Create new branch to contribute your changes.
  • Commit all your changes to your branch.
  • Submit a pull request.

Collection of Components

We have built many other components and free resources for software development in various programming languages. Kindly click here to view our Free Resources for Software Development


Changelog

Detailed changes for each release are documented in CHANGELOG.md.

License

MIT

Keywords

react-weblineindia-master-grid, react-master-grid, parent-child, reactjs-master-grid, react-master-grid-component, master-grid, grid, detail-grid