- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 118
GraphQL
GraphQL Backend Service (for Pagination purposes) to get data from a backend server with the help of GraphQL.
Use it when you need to support Pagination (that is when your dataset is rather large, more than 5k rows) with a GraphQL endpoint. If your dataset is small (less than 5k rows), then go with a regular grid with the "dataset.bind" property. SlickGrid can easily handle million of rows using a DataView object, but personally when the dataset is known to be large, I usually use a backend service (OData or GraphQL) and when it's small I go with a regular grid.
To connect a backend service into Angular-Slickgrid, you simply need to modify your gridOptions and add a declaration of backendServiceApi and pass it the service. See below for the signature and an example further down below.
backendServiceApi: {
  // Backend Service instance (could be OData or GraphQL Service)
  service: BackendService;
  // add any options you might want to provide to the backend service
  options: OdataOption | GraphqlServiceOption;
  // On init (or on page load), what action to perform?
  onInit?: (query: string) => Promise<any> | Observable<any>;
  // Before executing the query, what action to perform? For example, start a spinner
  preProcess?: () => void;
  // On Processing, we get the query back from the service, and we need to provide a Promise/Observable. For example: this.http.get(myGraphqlUrl)
  process: (query: string) => Promise<any> | Observable<any>;
  // After executing the query, what action to perform? For example, stop the spinner
  postProcess: (response: any) => void;
  // Throttle the amount of requests sent to the backend. Default to 750ms
  filterTypingDebounce?: number;
}As you can see, you mainly need to define which service to use (GridODataService or GraphQLService) and finally add the process callback all the rest are totally optional.
- Pagination is optional and if not defined, it will use what is set in the Angular-Slickgrid - Global Options
- 
onInitis optional and is there to initialize the grid with data on first page load (typically the same call asprocess)- you could load the grid yourself outside of the gridOptionswhich is why it's optional
 
- you could load the grid yourself outside of the 
- 
filterTypingDebounceis a timer (in milliseconds) that waits for user input pause before querying the backend server- this is meant to throttle the amount of requests sent to the backend (we don't really want to query every keystroke)
- 750ms is the default when not provided
 
import { Component, Injectable, OnInit } from '@angular/core';
import { Column, GraphqlService, GridOption } from 'angular-slickgrid';
@Injectable()
export class MyComponent implements OnInit {
  columnDefinitions: Column[];
  gridOptions: GridOption;
  constructor(private http: HttpClient) { }
  ngOnInit(): void {
    this.columnDefinitions = [
      // your column definitions
    ];
    this.gridOptions = {
      enableFiltering: true,
      enablePagination: true,
      pagination: {
        pageSizes: [10, 15, 20, 25, 30, 40, 50, 75, 100],
        pageSize: defaultPageSize,
        totalItems: 0
      },
      backendServiceApi: {
        service: new GraphqlService(),
        // add some options to the backend service to work
        // shown below is the minimum setup for the service to work correctly
        options: {
          columnDefinitions: this.columnDefinitions,
          datasetName: 'users',
          paginationOptions: {
            first: 25,
            offset: 0
          }
        },
        // define all the on Event callbacks
        preProcess: () => this.displaySpinner(true),
        process: (query) => this.getCustomerApiCall(query),
        postProcess: (response) => this.displaySpinner(false)
      }
    };
  }
  // Web API call
  getCustomerApiCall(graphqlQuery) {
    return this.http.get(`/api/getCustomers?${graphqlQuery}`).toPromise();
  }You can pass extra query arguments to the GraphQL query via the extraQueryArguments property defined in the backendServiceApi.options. For example let say you have a list of users and your GraphQL query accepts an optional userId, you can write it in code this way:
this.gridOptions = {
      backendServiceApi: {
        service: new GraphqlService(),
        // add some options to the backend service to work
        options: {
          columnDefinitions: this.columnDefinitions,
          datasetName: 'users',
          paginationOptions: {
            first: 25,
            offset: 0
          },
          extraQueryArguments: [{
            field: 'userId',
            value: 567
          }]
        },
        // define all the on Event callbacks
        preProcess: () => this.displaySpinner(true),
        process: (query) => this.getCustomerApiCall(query),
        postProcess: (response) => this.displaySpinner(false)
      }
    };
  }The GraphQL query built with these options will be
// extraQueryArguments will change the userId with 
{
  users(first: 20, offset: 0, userId: 567) {
    totalCount,
    nodes {
      id,
      name,
      company
    }
  }
}You might want to change certain options dynamically, for example passing new set of values to extraQueryArguments. For that you will have to first keep a reference to your GraphqlService instance and then you can call the updateOptions method.
export class MyComponent implements OnInit {
  graphqlService: GraphqlService;
  gridOptions: GridOption;
  columnDefinitions: Column[];
  gridOptions: GridOption;
  
  constructor() {
    this.graphqlService = GraphqlService();
  }
  angularGridReady(angularGrid: AngularGridInstance) {
    this.angularGrid = angularGrid;
  }
  ngOnInit(): void {
    this.columnDefinitions = [
      // ...
    ];
    this.gridOptions = {
      backendServiceApi: {
        service: this.graphqlService,
        // ...
      }
    };
  }
}
changeQueryArguments() {
  // update any Backend Service Options you want
  this.graphqlService.updateOptions({
    extraQueryArguments: [{
      field: 'userId',
      value: 567
    }]
  });
  // then make sure to refresh the dataset 
  this.angularGrid.pluginService.refreshBackendDataset();
}For the implementation of all 3 actions (filtering, sorting, pagination) with your GraphQL Server, please refer to the sections below to configure your GraphQL Schema accordingly.
Contents
- Angular-Slickgrid Wiki
- Installation
- Styling
- Interfaces/Models
- Testing Patterns
- Column Functionalities
- Global Grid Options
- Localization
- Events
- Grid Functionalities
- Auto-Resize / Resizer Service
- Resize by Cell Content
- Composite Editor
- Context Menu
- Custom Tooltip
- Add/Delete/Update or Highlight item
- Dynamically Change Row CSS Classes
- Excel Copy Buffer
- Export to Excel
- Export to File (CSV/Txt)
- Grid State & Presets
- Grouping & Aggregators
- Row Detail
- SlickGrid Controls
- SlickGrid Plugins
- Pinning (frozen) of Columns/Rows
- Tree Data Grid
 
- SlickGrid & DataView objects
- Addons (controls/plugins)
- Backend Services