TL;DR: Selecting the correct DataManager adaptor is one of the most important decisions when integrating React Gantt Chart with a backend service. Different adaptors support different API patterns, request formats, and response contracts, which can directly affect data loading, CRUD operations, performance, and maintainability. This guide helps you choose the right DataManager adaptor for your backend by explaining when to use built-in adaptors and how to avoid common integration issues.
Integrating a React Gantt Chart with a backend API can seem straightforward until the data loads incorrectly, edits fail to persist, or the component remains empty despite successful HTTP responses. In many cases, the root cause is not the Gantt Chart configuration itself but the DataManager adaptor sitting between the component and your server.
The adaptor determines how requests are generated, how responses are interpreted, and how CRUD operations are sent back to the backend. Choosing the wrong adaptor can lead to subtle issues that are often difficult to diagnose.
This guide explains how each DataManager adaptor works, when to use it, and how to match it to your backend architecture. You’ll learn the differences between UrlAdaptor, WebApiAdaptor, ODataV4Adaptor, GraphQLAdaptor, RemoteSaveAdaptor, and custom adaptors, along with practical examples, expected request and response contracts, and troubleshooting techniques that can save hours of debugging.
Note: All code examples in this article use Syncfusion React Gantt Chart and Syncfusion EJ2 DataManager APIs, and the adaptor behaviors discussed are specific to those implementations.
Why adaptor selection matters
Most remote-binding issues in Syncfusion React Gantt Chart are caused by a mismatch between the selected adaptor and the backend contract.
Common examples:
- A team connects a custom REST API with an adaptor meant for a different server pattern. The Gantt Chart loads no tasks because the response shape does not match what DataManager expects.
- A team uses an OData v4 service with the wrong OData adaptor. Requests succeed, but the response is not interpreted correctly.
- A team gets initial loading to work, but edits fail because the configured CRUD endpoints or payloads do not match the adaptor’s expectations.
The simplest rule is: Choose the adaptor based on your backend protocol and response contract first, then configure the Gantt.
What DataManager does in React Gantt
In a React Gantt Chart application, DataManager acts as the communication layer between the component and your backend. Whenever the Gantt Chart needs data or sends an update, DataManager works with the selected adaptor to translate those operations into requests the server can understand and convert responses back into a format the component can use.
A simplified workflow looks like this:
- The Gantt Chart requests data or submits an edit.
- DataManager routes the operation through the configured adaptor.
- The adaptor builds the appropriate HTTP request.
- The server processes the request and returns a response.
- The adaptor transforms the response into the structure expected by the Gantt.
- The component renders the results or updates the UI.
Three adaptor methods are especially useful when troubleshooting integration issues:
| Method | Purpose | Common symptom when misconfigured |
| processQuery | Builds outgoing requests | Incorrect URLs, missing query parameters, unexpected payloads |
| processResponse | Parses server responses | Successful requests but no data displayed |
| beforeSend | Customizes requests before transmission | Authentication, token, or CORS-related failures |
Understand the difference between read and CRUD operations
A common mistake is assuming that successful data loading guarantees editing will work as well. In reality, the initial read operation and subsequent CRUD operations follow separate paths.
During the read flow, the Gantt Chart retrieves task data and renders the timeline. During the CRUD flow, DataManager sends insert, update, delete, or batch requests and expects a valid response from the server.
If tasks load successfully but edits fail to persist, the issue is usually related to CRUD endpoints, payload formats, or server-side processing rather than the initial read configuration.
Before choosing an adaptor
Before selecting an adaptor, document the backend contract first.
Make sure you understand:
- The read endpoint URL
- The insert, update, delete, or batch endpoints
- The expected request payload format
- The expected response format
- The authentication mechanism
- The primary key field
- The hierarchy field, such as
ParentID - Whether sorting, filtering, and paging occur on the client or server
Having these details upfront makes adaptor selection much easier and helps prevent the most common remote-binding issues later in the project.
A quick adaptor selection framework
- Start with the backend you already have.
- Use
ODataV4Adaptorwhen your service is an OData v4 endpoint that follows OData conventions for querying and responses. - Use
GraphQLAdaptorwhen your application communicates through GraphQL queries and mutations. - Use
WebApiAdaptorwhen your backend follows ASP.NET Web API patterns that align with Syncfusion’s documentedDataManagerexpectations. - Use
RemoteSaveAdaptorwhen the dataset is small enough to load into browser memory, and you want sorting, filtering, and searching to occur locally after the initial load. - Use
UrlAdaptorwhen you’re working with a custom REST API and need flexible remote communication withoutODataorGraphQLconventions. - Choose a custom adaptor only when a built-in adaptor almost fits your requirements, but additional request or response customization is necessary.
Expected Request and Response Contracts by Adaptor
One of the fastest ways to identify integration issues is comparing the actual network response with the contract expected by the selected adaptor.
| Adaptor | Typical read response shape | Typical save pattern | Verify first |
| UrlAdaptor |
{ result: [...], count: n } for remote operations |
CRUD or batch endpoints you define | Whether the server returns result and count when required |
| WebApiAdaptor | DataManager-compatible result structure | REST-style endpoints matching adaptor expectations | Whether server-side query handling matches DataManager conventions |
| ODataV4Adaptor | { "@odata.count": n, "value": [...] } |
OData-style service behavior | Whether the endpoint is truly OData v4 |
| GraphQLAdaptor | Configured nested paths such as getTasks.result
|
GraphQL mutations | Whether result and count map to real response paths |
| RemoteSaveAdaptor | Initial read payload, then local operations | Remote save on add, edit, delete, or batch | Whether client-side interaction fits the dataset size |
| Custom adaptor | Depends on your transformation | Customizable | Whether a built-in adaptor would be enough |
Before modifying task mappings, editing settings, or component configuration, verify that the request and response format aligns with the adaptor being used.
If the contract does not match, the Gantt Chart may fail to render data correctly even when requests return successful HTTP responses.
The following examples show what those contracts look like in practice.
UrlAdaptor read response
JSON
{
"result": [
{
"TaskID": 1,
"TaskName": "Project initiation",
"StartDate": "2026-08-01T00:00:00Z",
"EndDate": "2026-08-05T00:00:00Z",
"Duration": 5,
"Progress": 40,
"ParentID": null
}
],
"count": 1
}
OData v4 read response
JSON
{
"@odata.context": "https://localhost:xxxx/odata/$metadata#Tasks",
"@odata.count": 1,
"value": [
{
"TaskID": 1,
"TaskName": "Project initiation",
"StartDate": "2026-08-01T00:00:00Z",
"EndDate": "2026-08-05T00:00:00Z",
"Duration": 5,
"Progress": 40,
"ParentID": null
}
]
}
GraphQL response mapping
JSON
{
"data": {
"getTasks": {
"count": 1,
"result": [
{
"TaskID": 1,
"TaskName": "Project initiation",
"StartDate": "2026-08-01T00:00:00Z"
}
]
}
}
}
If the response does not closely match the adaptor contract, fix the mismatch before changing the Gantt Chart configuration.
Adaptor comparison matrix
| Adaptor | Best for | Main caution |
| UrlAdaptor | Custom REST APIs | Requires a clear server contract |
| WebApiAdaptor | ASP.NET Web API patterns | Not a generic adaptor for arbitrary APIs |
| ODataV4Adaptor | OData v4 services | Must match actual OData v4 behavior |
| GraphQLAdaptor | GraphQL backends | Response path mapping must be exact |
| RemoteSaveAdaptor | Small datasets with fast local interaction | Can become stale in multi-user apps |
| Custom adaptor | Edge cases | Easy to overuse |
UrlAdaptor for custom REST APIs
Use UrlAdaptor when your backend is a custom REST API and does not expose OData or GraphQL conventions. This is often the best fit for Node.js, Python, Java, Go, or ASP.NET Core APIs where you own the contract.
Why it is useful
UrlAdaptor gives you flexibility. You define the API shape, and DataManager handles the remote request-response flow. For Gantt Chart projects, it is often the most practical choice when you need custom business rules, validation, or batch updates.
The following example configures a React Gantt Chart component to load and update task data through a custom REST API.
JavaScript
import { DataManager, UrlAdaptor } from '@syncfusion/ej2-data';
import { GanttComponent, Inject, Edit, Toolbar } from '@syncfusion/ej2-react-gantt';
const dataManager = new DataManager({
url: 'https://localhost:xxxx/api/tasks',
batchUrl: 'https://localhost:xxxx/api/tasks/batch',
adaptor: new UrlAdaptor(),
crossDomain: true
});
const taskFields = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
endDate: 'EndDate',
duration: 'Duration',
progress: 'Progress',
parentID: 'ParentID'
};
const editSettings = {
allowEditing: true,
allowAdding: true,
allowDeleting: true,
mode: 'Auto'
};
<GanttComponent dataSource={dataManager} taskFields={taskFields} editSettings={editSettings}>
<Inject services={[Edit, Toolbar]} />
</GanttComponent>
Common issues
| Symptom | Likely cause | Fix |
| Gantt Chart shows no records | Response shape does not match expected format | Return result and count when required |
| Edits do not persist | batchUrl or CRUD mapping is incomplete | Implement and test the batch or CRUD endpoints |
| Dates render incorrectly | Date format is inconsistent | Return ISO-style dates |
| Hierarchy is broken | Parent-child mapping is incomplete | Verify parentID mapping and root handling |
WebApiAdaptor for ASP.NET Web API patterns
Use WebApiAdaptor when your backend follows ASP.NET Web API patterns that support DataManager or OData-style query conventions. It is not a generic adaptor for arbitrary REST APIs.
Example server pattern
C#
public IActionResult Get([FromQuery] DataManagerRequest request)
{
var tasks = _repository.GetAllTasks();
return Ok(new DataResult
{
Result = tasks,
Count = tasks.Count
});
}
Note: DataManagerRequest and DataResult come from Syncfusion.EJ2.Base namespace. Add the corresponding NuGet package and using directive before compiling this example.
React configuration
JavaScript
import { DataManager, WebApiAdaptor } from '@syncfusion/ej2-data';
const dataManager = new DataManager({
url: 'https://localhost:xxxx/api/tasks',
adaptor: new WebApiAdaptor(),
crossDomain: true
});
Common issues
- Response shape does not match what DataManager expects
- Server does not process query parameters for sorting, filtering, or paging
- CRUD routes do not match expected controller patterns
If your API is just a custom REST API, UrlAdaptor is usually the safer starting point.
Note: The exact request and response contract may vary based on your Syncfusion version and Web API implementation. Always verify expected payload formats against the documentation for the version you deploy.
Read the full blog post on the Syncfusion Website
Top comments (0)