syncfusion-react-dropdown-tree — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-react-dropdown-tree (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 Dropdown Tree component displays hierarchical data in a collapsible tree structure within a dropdown interface. It combines tree navigation with dropdown accessibility, supporting multi-selection via checkboxes, lazy loading for large datasets, comprehensive customization through templates and events, filtering, and full accessibility with RTL and localization support.
Use Dropdown Tree immediately when you need to:
The Dropdown Tree features:
📄 Read: references/getting-started.md
📄 Read: references/data-binding.md
📄 Read: references/checkbox-selection.md
showCheckBox propertyselectAllText and unSelectAllText📄 Read: references/templates.md
📄 Read: references/multi-selection-filtering.md
allowMultiSelection property and Ctrl/Shift keyboard interactiondelimiterChar and mode configurationallowFiltering and filter bar implementationfilterBarPlaceholder customizationignoreCase and ignoreAccent options📄 Read: references/tree-settings.md
loadOnDemand for lazy loading implementationautoCheck for hierarchical checkbox synchronizationexpandOn behavior (Auto, Click, DblClick, None)checkDisabledChildren for disabled node handling📄 Read: references/field-mapping.md
📄 Read: references/advanced-features.md
📄 Read: references/accessibility-localization.md
import { DropDownTreeComponent } from '@syncfusion/ej2-react-dropdowns';
import '@syncfusion/ej2-dropdowns/styles/material.css';
function App() {
const data = [
{ id: '1', name: 'Electronics', expanded: true },
{ id: '2', name: 'Laptops', parentId: '1' },
{ id: '3', name: 'Phones', parentId: '1' },
{ id: '4', name: 'Appliances' },
];
return (
<DropDownTreeComponent
id="dropdowntree"
fields={{ dataSource: data, value: 'id', text: 'name', parentValue: 'parentId', hasChildren: 'hasChild' }}
placeholder="Select an item"
/>
);
}
export default App;<DropDownTreeComponent
id="dropdowntree"
fields={{ dataSource: data, value: 'id', text: 'name', parentValue: 'parentId', hasChildren: 'hasChild' }}
showCheckBox={true}
showSelectAll={true}
treeSettings={{ autoCheck: true }}
placeholder="Select items"
/><DropDownTreeComponent
id="dropdowntree"
fields={{ dataSource: data, value: 'id', text: 'name', parentValue: 'parentId' }}
allowFiltering={true}
filterType="Contains"
filterBarPlaceholder="Search items..."
placeholder="Select an item"
/><DropDownTreeComponent
id="dropdowntree"
fields={{ dataSource: data, value: 'id', text: 'name', parentValue: 'parentId' }}
itemTemplate={(props) => (
<div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>
<span>{props.name}</span>
<small style={{ color: '#999' }}>({props.category})</small>
</div>
)}
valueTemplate={(props) => <span>{props.name}</span>}
placeholder="Select item"
/>For flat data structures with parent references:
const data = [
{ id: 1, name: 'Discover Music', hasChild: true, expanded: true },
{ id: 2, pid: 1, name: 'Hot Singles' },
{ id: 3, pid: 1, name: 'Rising Artists' },
{ id: 7, name: 'Sales and Events', hasChild: true },
{ id: 8, pid: 7, name: '100 Albums' },
];
<DropDownTreeComponent
id="dropdowntree"
fields={{
dataSource: data,
value: 'id',
text: 'name',
parentValue: 'pid',
hasChildren: 'hasChild',
}}
/>const handleChange = (args) => {
console.log('Old values:', args.oldValue); // string[]
console.log('New values:', args.value); // string[]
console.log('User interaction:', args.isInteracted); // boolean
};
const handleSelect = (args) => {
console.log('Action:', args.action); // 'select' or 'unselect'
console.log('Item data:', args.itemData); // object
};
<DropDownTreeComponent
id="dropdowntree"
fields={fields}
onChange={handleChange}
onSelect={handleSelect}
/><DropDownTreeComponent
id="dropdowntree"
fields={fields}
showCheckBox={true}
treeSettings={{ autoCheck: true }}
mode="Default"
delimiterChar=", "
placeholder="Select multiple items"
/>const remoteData = new DataManager({
url: 'url',
adaptor: new UrlAdaptor(),
});
<DropDownTreeComponent
id="dropdowntree"
fields={{ dataSource: remoteData, value: 'id', text: 'name', hasChildren: 'hasChild' }}
treeSettings={{ loadOnDemand: true }}
placeholder="Loading..."
/>const data = [
{ id: 1, name: 'Documents', iconCss: 'e-folder', hasChild: true },
{ id: 2, pid: 1, name: 'Resume.pdf', iconCss: 'e-pdf' },
{ id: 3, pid: 1, name: 'Report.docx', iconCss: 'e-docx' },
];
<DropDownTreeComponent
id="dropdowntree"
fields={{
dataSource: data,
value: 'id',
text: 'name',
iconCss: 'iconCss',
parentValue: 'pid',
hasChildren: 'hasChild',
}}
/><DropDownTreeComponent
id="dropdowntree"
fields={fields}
enableRtl={true}
locale="ar"
placeholder="اختر عنصرا"
/>| Property | Type | Description | |
|---|---|---|---|
| Core | |||
id | string | Unique identifier for the component | |
fields | FieldsModel | Data source and field mapping configuration | |
placeholder | string | Input placeholder text | |
enabled | boolean | Enable/disable component (default: true) | |
| Selection | |||
showCheckBox | boolean | Enable checkbox multi-selection (default: false) | |
showSelectAll | boolean | Show Select All checkbox (default: false) | |
selectAllText | string | "Select All" label text | |
unSelectAllText | string | "Unselect All" label text | |
allowMultiSelection | boolean | Enable multi-selection with Ctrl/Shift keys | |
| Templates | |||
itemTemplate | string \ | Function | Custom item rendering |
valueTemplate | string \ | Function | Custom selected value display |
headerTemplate | string \ | Function | Custom header content |
footerTemplate | string \ | Function | Custom footer content |
noRecordsTemplate | string \ | Function | Empty state template |
actionFailureTemplate | string \ | Function | Error state template |
| Filtering | |||
allowFiltering | boolean | Enable search/filter bar (default: false) | |
filterType | TreeFilterType | Filter type: StartsWith, EndsWith, Contains | |
filterBarPlaceholder | string | Filter bar placeholder text | |
ignoreCase | boolean | Case-insensitive filtering (default: true) | |
ignoreAccent | boolean | Ignore diacritics in filtering | |
| Tree Settings | |||
treeSettings | TreeSettingsModel | Tree behavior configuration (autoCheck, loadOnDemand, expandOn) | |
| Display | |||
mode | string | Display mode: Default, Delimiter, Custom | |
delimiterChar | string | Delimiter for multi-select (default: ", ") | |
customTemplate | string | Custom multi-select display template | |
| Localization & RTL | |||
locale | string | Culture code (default: "en") | |
enableRtl | boolean | Enable Right-to-Left layout | |
enablePersistence | boolean | Persist state between page reloads | |
| Styling | |||
cssClass | string | CSS class for root and popup | |
width | string \ | number | Component width |
popupHeight | string \ | number | Popup height |
htmlAttributes | object | HTML attributes for the component |
Choosing Data Binding:
child property for small-to-medium datasetsparentValue field for structured dataChoosing Selection Mode:
showCheckBox={true} for explicit multi-selectionallowMultiSelection={true} for Ctrl/Shift keyboard selectiontreeSettings={{ autoCheck: true }} for hierarchy syncChoosing Template:
When to Use Lazy Loading:
When to Use Filtering:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.