syncfusion-react-gantt-chart — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-react-gantt-chart (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Syncfusion React Gantt Chart (GanttComponent) is a powerful project management component for visualizing, scheduling, and managing tasks over a timeline. It supports auto/manual scheduling, task dependencies, resource planning, interactive editing, Excel/PDF export, and rich customization.
📄 Read: references/getting-started.md
GanttComponent with taskFields mappinggridLines prop ('Both' / 'Horizontal' / 'Vertical' / 'None')📄 Read: references/data-binding.md
DataManagertaskFields configuration (id, name, startDate, endDate, duration, progress, child)url + batchUrl)Query.addParams() in load eventAjax class (manual fetch)loadChildOnDemand={false}, hasChildMapping)actionFailure event📄 Read: references/task-scheduling.md
taskMode)📄 Read: references/task-dependency.md
taskFields.dependency in data source (string format: "2FS", "2FS+3d", "2SS+2h")"2FS,3FS")"2FS+3h", "2FS-1d")addPredecessor, removePredecessor, updatePredecessor)connectorLineWidth, connectorLineBackground)autoUpdatePredecessorOffset={true} — recalculate offsets on load to account for calendar rules (weekends, holidays)autoUpdatePredecessorOffset={false} — display original offsets even if not matching rendered lines (visual inconsistency possible)updateOffsetOnTaskbarEdit={true} — auto-recalculate offsets when dragging taskbars (default)updateOffsetOnTaskbarEdit={false} — preserve offsets; manual update required via dependency dialogactionBegin event with requestType === 'validateLinkedTask')respectLink={true} — revert invalid edits to maintain dependency integrityremoveLink={true} — remove conflicting dependencies to allow editspreserveLinkWithEditing={true} — update offsets to maintain links (default mode)allowParentDependency={true} allows cross-parent dependencies; false restricts to siblings only.e-gantt-dependency-view-container CSS visibilityenablePredecessorValidation={false} disables auto-date validation based on predecessor links📄 Read: references/task-constraints.md
taskFields.constraintType and taskFields.constraintDatetaskMode📄 Read: references/timeline.md
timelineViewMode quick presets (Hour, Day, Week, Month, Year)unit, format, count, formatter)count (merge multiple units per cell)formatter (tier + mode aware)viewStartDate / viewEndDate (lock visible range)weekStartDay — controls which day starts a week column (0=Sun, 1=Mon…)updateTimescaleViewtimelineViewMode + refresh())showTooltiptimelineTemplate ({ date, value, tier })previousTimeSpan() / nextTimeSpan()ZoomIn, ZoomOut, ZoomToFit)zoomingLevels (ZoomTimelineSettings)zoomIn(), zoomOut(), fitToProject()timelineUnitSizehighlightWeekends={true}timelineSettings.showWeekend (with noted limitations)📄 Read: references/columns.md
ColumnsDirective)valueAccessor (custom display values, concatenation)valueAccessor)rowDataBoundtreeColumnIndex)queryCellInfocollapseAllParentTasks — collapse all on loadtaskFields.expandState — per-row initial expand/collapselocalStorageenableWBS + enableAutoWbsUpdate APIstaskFields.wbsPredecessorheaderTemplate for custom header renderingtreeGrid.textWrapSettings.wrapMode)getColumnByField + refreshHeader)editTemplatefrozenColumns, inject Freeze)📄 Read: references/column-interactions.md
allowResizing, inject Resize)minWidth / maxWidth per columnallowResizing={false})resizeSettings.mode)reorderColumns, refreshColumns)resizeStart, resizing, resizeStopallowReordering, inject Reorder)allowReordering={false})reorderColumns, reorderColumnByIndex, reorderColumnByTargetIndexcolumnDragStart, columnDrag, columnDropshowColumnMenu, inject ColumnMenu)columnMenuClick eventshowColumnMenu={false})📄 Read: references/rows.md
queryCellInfo eventQueryCellInfoEventArgs with rowSpan, colSpan, cell, data, columncolSpan) and vertical spanning (rowSpan)rowDataBound📄 Read: references/managing-tasks.md
addRecord())mode: 'Dialog'), cell edit (mode: 'Auto'), taskbar dragdeleteRow(), showDeleteConfirmDialog)taskFields.segments, splitTask(), mergeTask())editType): stringedit, numericedit, datepickeredit, datetimepickeredit, dropdownedit, booleaneditedit.params for min/max/step/format/dataSource per columnaddDialogFields, editDialogFields)UrlAdaptor (url + batchUrl)added, changed, deleted arrays in the batch request bodyvalidationRules on ColumnDirective)required, min, max, minLength, date, regex[fn, 'message'] callback pattern)📄 Read: references/filtering-searching.md
allowFiltering={true}, inject Filter)Parent, Child, Both, NonesearchSettings: fields, operator, ignoreCase)filterSettings.columns array)filterByColumn(), clearFiltering()📄 Read: references/sorting.md
sortSettings)📄 Read: references/selection.md
selectRow, selectCell)📄 Read: references/taskbar-labels-markers.md
tooltipSettings for taskbar, connector line, baseline, timeline)beforeTooltipRender📄 Read: references/resources.md
resources property)taskFields.resourceInfo) — single or multiple with custom unitsviewType='ResourceView', resource groups)enableMultiTaskbar={true}) — multiple taskbars per collapsed resource rowshowOverAllocatedTasks={true})resourceFields.unit, resourceFields.group)queryTaskbarInfo📄 Read: references/toolbar-context-menu.md
Add, Edit, Delete, Update, Cancel, Search, ExpandAll, CollapseAll, Indent, Outdent, ZoomIn, ZoomOut, ZoomToFit, CriticalPath, ExcelExport, CsvExport, PdfExport, ColumnChooser, Undo, Redo, SplitTask, MergeTaskUndo/Redo → UndoRedo, SplitTask → Edit)ItemModel) and toolbarClick handlerSplitTask, MergeTask, Convert, DeleteDependencycontextMenuClick, contextMenuOpen (args.hideItems)📄 Read: references/excel-export.md
📄 Read: references/pdf-export.md
📄 Read: references/holidays-working-time.md
holidays prop, HolidayModel, DayMarkers service)workWeek, includeWeekend)dayWorkingTime)taskFields.work, workUnit, task types: FixedWork / FixedDuration / FixedUnit)timezone prop, IANA timezone strings)📄 Read: references/splitter.md
splitterSettings.position — percentage or pixels)splitterSettings.columnIndex)splitterSettings.view — Default / Grid / Chart)setSplitterPosition())splitterResizeStart, splitterResizing, splitterResized)📄 Read: references/scrolling.md
width and height for scrollbar controlwidth='100%', height='100%' with CSS parent height)scrollToDate('MM/dd/yyyy'))ganttChartModule.scrollObject.setScrollTop(px))📄 Read: references/virtual-scroll.md
enableVirtualization={true}, VirtualScroll service)enableTimelineVirtualization={true}, requires projectStartDate / projectEndDate)treeGrid.filterModule.filteredResult)📄 Read: references/undo-redo.md
enableUndoRedo, UndoRedo service)undoRedoActions — full list of trackable actions and required servicesundoRedoStepsCount — history stack size'Undo' / 'Redo' buttons and Ctrl+Z / Ctrl+Y keyboard shortcutsundo() / redo() via component ref📄 Read: references/state-persistence.md
enablePersistence={true}, unique id prop, localStorage)id or clear localStorage entry)enableImmutableMode={true}, requires isPrimaryKey={true})loadingIndicator.indicatorType: 'Spinner' or 'Shimmer')showSpinner() / hideSpinner())📄 Read: references/localization-rtl.md
locale prop)L10n.load() with 'gantt' namespace keys)enableRtl={true})format='yMd', format='dd/MM/yyyy')format='C2', format='N2', format='P0')📄 Read: references/gantt-methods.md
autoFitColumns()cancelEdit(), openAddDialog(), openEditDialog()deleteRecord(), convertToMilestone(), changeTaskMode(), updateRecordByID(), updateRecordByIndex(), updateTaskId(), updateDataSource(), updateProjectDates()enableItems()expandByIndex(), collapseByIndex()clearUndoCollection(), clearRedoCollection(), getUndoActions(), getRedoActions()getCurrentViewData(), getRecordByID(), getTaskByUniqueID(), getTaskInfo(), getTaskbarHeight(), getExpandedRecords(), getGanttColumns(), getGridColumns()getDurationString(), getWorkString()getRowByID(), getRowByIndex()removeSortColumn()selectCells()reorderRows()scrollToTask(), updateChartScrollOffset()📄 Read: references/events.md
load, created, dataBound)actionBegin, actionComplete) with requestType reference tabletaskbarEditing, taskbarEdited, taskbarClickexpanding, collapsing, expanded, collapsedrowSelected, rowDeselected, cellSelected, cellDeselectedexcelExportComplete, pdfExportCompleteresizeStart, resizing, resizeStop, columnDragStart, columnDrag, columnDropargs.cancel = true)import * as React from 'react';
import { GanttComponent, ColumnsDirective, ColumnDirective, Inject, Edit, Toolbar, Selection } from '@syncfusion/ej2-react-gantt';
import { TaskFieldsModel, EditSettingsModel } from '@syncfusion/ej2-gantt';
// In App.css:
// @import "../node_modules/@syncfusion/ej2-gantt/styles/tailwind3.css";
// (plus base, buttons, calendars, dropdowns, grids, inputs, layouts,
// lists, navigations, notifications, popups, richtexteditor, treegrid)
const data = [
{
TaskID: 1, TaskName: 'Project Initiation',
StartDate: new Date('04/02/2024'), EndDate: new Date('04/21/2024'),
subtasks: [
{ TaskID: 2, TaskName: 'Identify Site Location', StartDate: new Date('04/02/2024'), Duration: 4, Progress: 50 },
{ TaskID: 3, TaskName: 'Perform Soil Test', StartDate: new Date('04/02/2024'), Duration: 4, Progress: 50, Predecessor: '2' },
{ TaskID: 4, TaskName: 'Soil Test Approval', StartDate: new Date('04/08/2024'), Duration: 0, Predecessor: '3FS', Progress: 50 },
]
}
];
const taskFields: TaskFieldsModel = {
id: 'TaskID',
name: 'TaskName',
startDate: 'StartDate',
endDate: 'EndDate',
duration: 'Duration',
progress: 'Progress',
dependency: 'Predecessor',
child: 'subtasks',
};
const editSettings: EditSettingsModel = { allowEditing: true, allowAdding: true, allowDeleting: true, allowTaskbarEditing: true };
function App() {
return (
<GanttComponent
dataSource={data}
taskFields={taskFields}
editSettings={editSettings}
toolbar={['Add', 'Edit', 'Delete', 'Cancel', 'Update', 'Search', 'ZoomIn', 'ZoomOut', 'ZoomToFit']}
height="450px"
>
<ColumnsDirective>
<ColumnDirective field="TaskID" width="80" />
<ColumnDirective field="TaskName" headerText="Task Name" width="250" />
<ColumnDirective field="StartDate" />
<ColumnDirective field="Duration" />
<ColumnDirective field="Progress" />
</ColumnsDirective>
<Inject services={[Edit, Toolbar, Selection]} />
</GanttComponent>
);
}
export default App;<GanttComponent
editSettings={{ allowEditing: true, mode: 'Dialog' }}
>
<Inject services={[Edit]} />
</GanttComponent><GanttComponent
editSettings={{ allowEditing: true, mode: 'Auto' }}
>
<Inject services={[Edit]} />
</GanttComponent>const ganttRef = React.useRef<GanttComponent>(null);
const addTask = () => {
ganttRef.current?.addRecord({ TaskID: 10, TaskName: 'New Task', Duration: 3 }, 'Below', 1);
};<GanttComponent toolbar={['ExcelExport']} allowExcelExport={true}>
<Inject services={[ExcelExport, Toolbar]} />
</GanttComponent><GanttComponent toolbar={['PdfExport']} allowPdfExport={true}>
<Inject services={[PdfExport, Toolbar]} />
</GanttComponent><ColumnsDirective>
<ColumnDirective field="TaskName" validationRules={{ required: true }} />
<ColumnDirective field="Duration" validationRules={{ min: 1, max: 100 }} />
</ColumnsDirective>const ganttRef = React.useRef<GanttComponent>(null);
ganttRef.current?.scrollToDate('04/28/2024');<ColumnDirective field="TaskName" minWidth="100" maxWidth="400" allowResizing={true} />const ganttRef = React.useRef<GanttComponent>(null);
// By field names:
(ganttRef.current as any).treeGrid.reorderColumns(['Duration', 'Progress'], 'TaskName');
// By index:
(ganttRef.current as any).treeGrid.reorderColumnByIndex(2, 0);// In taskFields — map a boolean field that controls initial expand state:
const taskFields = { ..., expandState: 'isExpand' };
// Or collapse all on load:
<GanttComponent collapseAllParentTasks={true} .../>| Feature | Service to Inject |
|---|---|
| Editing (add/edit/delete/taskbar drag) | Edit |
| Filtering | Filter |
| Sorting | Sort |
| Toolbar | Toolbar |
| Selection | Selection |
| Day Markers / Holidays / Event Markers | DayMarkers |
| Critical Path | CriticalPath |
| Excel / CSV Export | ExcelExport |
| PDF Export | PdfExport |
| Undo / Redo | UndoRedo |
| Column Menu | ColumnMenu |
| Context Menu | ContextMenu |
| Virtual Scrolling | VirtualScroll |
| Row Drag and Drop | RowDD |
| Column Reordering | Reorder |
| Frozen Columns | Freeze |
| Column Resizing | Resize |
Usage pattern:
import { GanttComponent, Inject, Edit, Filter, Sort, Toolbar, Selection } from '@syncfusion/ej2-react-gantt';
<GanttComponent ...>
<Inject services={[Edit, Filter, Sort, Toolbar, Selection]} />
</GanttComponent>| Prop | Type | Purpose | |||
|---|---|---|---|---|---|
dataSource | object[] / DataManager | Task data (local or remote via DataManager) | |||
taskFields | TaskFieldsModel | Field mapping for task properties | |||
editSettings | EditSettingsModel | Enable add/edit/delete/taskbar editing | |||
toolbar | string[] | Toolbar items to render | |||
taskMode | Auto / Manual / Custom | Scheduling mode | |||
resources | object[] | Resource data collection | |||
resourceFields | ResourceFieldsModel | Resource field mapping | |||
allowSorting | boolean | Enable sorting | |||
allowFiltering | boolean | Enable filtering | |||
allowReordering | boolean | Enable column reorder | |||
allowResizing | boolean | Enable column resize | |||
allowExcelExport | boolean | Enable Excel export | |||
allowPdfExport | boolean | Enable PDF export | |||
undoRedoActions | string[] | Actions tracked by undo/redo | |||
timelineSettings | TimelineSettingsModel | Timeline tiers and unit config | |||
splitterSettings | SplitterSettingsModel | Grid/chart panel ratio | |||
highlightWeekends | boolean | Shade weekend columns | |||
holidays | HolidayModel[] | Mark holiday dates | |||
eventMarkers | EventMarkerModel[] | Vertical markers on timeline | |||
treeColumnIndex | number | Column index showing expand/collapse icons | |||
collapseAllParentTasks | boolean | Collapse all parent rows on initial load | |||
enableWBS | boolean | Auto-generate WBS codes from task hierarchy | |||
enableAutoWbsUpdate | boolean | Recalculate WBS codes after CRUD/sort/DnD | |||
frozenColumns | number | Number of left-pinned (frozen) columns | |||
enableMultiTaskbar | boolean | Show multiple taskbars per resource row | |||
allowTaskbarOverlap | boolean | Controls whether multiple taskbars overlap (true, default) or stack with extended row height (false) in resource rows | |||
viewType | string | 'ProjectView' or 'ResourceView' | |||
showColumnMenu | boolean | Show column-level menu (sort, filter, autofit) | |||
columnMenuItems | string[] | Restrict which column menu items are shown | |||
showColumnChooser | boolean | Enable column chooser dialog via toolbar ColumnChooser item | |||
allowSelection | boolean | Enable row/cell selection | |||
selectionSettings | SelectionSettingsModel | Selection mode (Row/Cell), type (Single/Multiple) | |||
gridLines | string | Grid lines style: 'Both' \ | 'Horizontal' \ | 'Vertical' \ | 'None' |
renderBaseline | boolean | Show baseline bars alongside actual taskbars | |||
baselineColor | string | CSS color for baseline bars | |||
enableCriticalPath | boolean | Highlight critical path tasks and connectors | |||
enableRtl | boolean | Enable right-to-left layout | |||
locale | string | Locale code (e.g. 'fr', 'de', 'ar') | |||
allowRowDragAndDrop | boolean | Enable row drag-and-drop reordering/reparenting | |||
enableImmutableMode | boolean | Only re-render changed rows on data updates (requires isPrimaryKey) | |||
enablePersistence | boolean | Persist UI state (sort, filter, column widths) to localStorage | |||
loadingIndicator | object | Loading animation type: `{ indicatorType: 'Spinner' \ | 'Shimmer' }` | ||
workWeek | string[] | Working days, e.g. ['Monday','Tuesday','Wednesday','Thursday','Friday'] | |||
includeWeekend | boolean | Count weekends as working days for duration calculation | |||
timezone | string | IANA timezone for the Gantt (e.g. 'America/New_York') | |||
showOverAllocatedTasks | boolean | Highlight over-allocated resources in ResourceView | |||
enableUndoRedo | boolean | Enable undo/redo tracking (inject UndoRedo service) | |||
undoRedoStepsCount | number | Maximum undo/redo history steps (default: 10) | |||
enableVirtualization | boolean | Row virtualization for large data sets | |||
enableTimelineVirtualization | boolean | Timeline (horizontal) virtualization | |||
rowHeight | number | Uniform row height in pixels | |||
taskbarHeight | number | Height of taskbars in pixels (must be ≤ rowHeight) | |||
connectorLineWidth | number | Width of dependency connector lines | |||
connectorLineBackground | string | Color of dependency connector lines |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.