React Hierarchical Grid Remote Data Operations

    By default, the IgrHierarchicalGrid uses its own logic for performing data operations.

    You can perform these tasks remotely and feed the resulting data to the IgrHierarchicalGrid by taking advantage of certain inputs and events, which are exposed by the IgrHierarchicalGrid.

    Remote Paging

    const BASE_URL = `https://data-northwind.indigo.design/`;
    const CUSTOMERS_URL = `${BASE_URL}Customers/GetCustomersWithPage`;
    
    export class RemoteService {
    
        public static getCustomersDataWithPaging(pageIndex?: number, pageSize?: number) {
            return fetch(this.buildUrl(CUSTOMERS_URL, pageIndex, pageSize))
            .then((result) => result.json());
        }
    
        public static getHierarchyDataById(parentEntityName: string, parentId: string, childEntityName: string) {
            return fetch(`${BASE_URL}${parentEntityName}/${parentId}/${childEntityName}`)
            .then((result) => result.json());
        }
    
        private static buildUrl(baseUrl: string, pageIndex?: number, pageSize?: number) {
            let qS = "";
            if (baseUrl) {
                    qS += `${baseUrl}`;
            }
    
            // Add pageIndex and size to the query string if they are defined
            if (pageIndex !== undefined) {
                qS += `?pageIndex=${pageIndex}`;
                if (pageSize !== undefined) {
                    qS += `&size=${pageSize}`;
                }
            } else if (pageSize !== undefined) {
                qS += `?perPage=${pageSize}`;
            }
    
            return `${qS}`;
        }
    }
    

    After declaring the service, we need to create a component, which will be responsible for the IgrHierarchicalGrid construction and data subscription.

      <IgrHierarchicalGrid
              ref={hierarchicalGrid}
              data={data}
              pagingMode="remote"
              primaryKey="customerId"
              height="600px"
            >
              <IgrPaginator
                perPage={perPage}
                ref={paginator}
                onPageChange={onPageNumberChange}
                onPerPageChange={onPageSizeChange}
              ></IgrPaginator>
              ...
              <IgrRowIsland
                childDataKey="Orders"
                primaryKey="orderId"
                onGridCreated={onCustomersGridCreatedHandler}>
                ...
    
                <IgrRowIsland
                  childDataKey="Details"
                  primaryKey="productId"
                  onGridCreated={onOrdersGridCreatedHandler}>
                  ...
                </IgrRowIsland>
              </IgrRowIsland>
            </IgrHierarchicalGrid>
    

    then set up the state:

      const hierarchicalGrid = useRef<IgrHierarchicalGrid>(null);
      const paginator = useRef<IgrPaginator>(null);
    
      const [data, setData] = useState([]);
      const [page, setPage] = useState(0);
      const [perPage, setPerPage] = useState(15);
      const [isLoading, setIsLoading] = useState(true);
    
      useEffect(() => {
        loadGridData(page, perPage);
      }, [page, perPage]);
    

    next set up the method for loading the data:

      function loadGridData(pageIndex?: number, pageSize?: number) {
        // Set loading state
        setIsLoading(true);
    
        // Fetch data
        RemoteService.getCustomersDataWithPaging(pageIndex, pageSize)
          .then((response: CustomersWithPageResponseModel) => {
            setData(response.items);
            // Stop loading when data is retrieved
            setIsLoading(false);
            paginator.current.totalRecords = response.totalRecordsCount;
          })
          .catch((error) => {
            console.error(error.message);
            setData([]);
            // Stop loading even if error occurs. Prevents endless loading
            setIsLoading(false);
          })
      }
    

    and finally set up the behaviour for the RowIslands:

      function gridCreated(event: IgrGridCreatedEventArgs, parentKey: string) {
        const context = event.detail;
        context.grid.isLoading = true;
    
        const parentId: string = context.parentID;
        const childDataKey: string = context.owner.childDataKey;
    
        RemoteService.getHierarchyDataById(parentKey, parentId, childDataKey)
          .then((data: any) => {
            context.grid.data = data;
            context.grid.isLoading = false;
            context.grid.markForCheck();
          })
          .catch((error) => {
            console.error(error.message);
            context.grid.data = [];
            context.grid.isLoading = false;
            context.grid.markForCheck();
          });
      }
    
      const onCustomersGridCreatedHandler = (e: IgrGridCreatedEventArgs) => {
        gridCreated(e, "Customers")
      };
    
      const onOrdersGridCreatedHandler = (e: IgrGridCreatedEventArgs) => {
        gridCreated(e, "Orders")
      };
    

    For further reference please check the full sample bellow:

    Grid Remote Paging Demo

    Known Issues and Limitations

    • When the grid has no PrimaryKey set and remote data scenarios are enabled (when paging, sorting, filtering, scrolling trigger requests to a remote server to retrieve the data to be displayed in the grid), a row will lose the following state after a data request completes:
    • Row Selection
    • Row Expand/collapse
    • Row Editing
    • Row Pinning

    API References

    Additional Resources

    Our community is active and always welcoming to new ideas.