@@ -14,6 +14,7 @@ class CheckboxTree extends React.Component {
1414 expanded : PropTypes . arrayOf ( PropTypes . string ) ,
1515 name : PropTypes . string ,
1616 nameAsArray : PropTypes . bool ,
17+ noCascade : PropTypes . bool ,
1718 optimisticToggle : PropTypes . bool ,
1819 showNodeIcon : PropTypes . bool ,
1920 onCheck : PropTypes . func ,
@@ -25,6 +26,7 @@ class CheckboxTree extends React.Component {
2526 expanded : [ ] ,
2627 name : undefined ,
2728 nameAsArray : false ,
29+ noCascade : false ,
2830 optimisticToggle : true ,
2931 showNodeIcon : true ,
3032 onCheck : ( ) => { } ,
@@ -56,9 +58,9 @@ class CheckboxTree extends React.Component {
5658 }
5759
5860 onCheck ( node ) {
59- const { onCheck } = this . props ;
61+ const { noCascade , onCheck } = this . props ;
6062
61- this . toggleChecked ( node , node . checked ) ;
63+ this . toggleChecked ( node , node . checked , noCascade ) ;
6264 onCheck ( this . serializeList ( 'checked' ) ) ;
6365 }
6466
@@ -86,8 +88,8 @@ class CheckboxTree extends React.Component {
8688 } ) ;
8789 }
8890
89- getCheckState ( node ) {
90- if ( node . children === null ) {
91+ getCheckState ( node , noCascade ) {
92+ if ( node . children === null || noCascade ) {
9193 return node . checked ? 1 : 0 ;
9294 }
9395
@@ -102,15 +104,15 @@ class CheckboxTree extends React.Component {
102104 return 0 ;
103105 }
104106
105- toggleChecked ( node , isChecked ) {
106- if ( node . children !== null ) {
107+ toggleChecked ( node , isChecked , noCascade ) {
108+ if ( node . children === null || noCascade ) {
109+ // Set the check status of a leaf node or an uncoupled parent
110+ this . toggleNode ( 'checked' , node , isChecked ) ;
111+ } else {
107112 // Percolate check status down to all children
108113 node . children . forEach ( ( child ) => {
109114 this . toggleChecked ( child , isChecked ) ;
110115 } ) ;
111- } else {
112- // Set leaf to check/unchecked state
113- this . toggleNode ( 'checked' , node , isChecked ) ;
114116 }
115117 }
116118
@@ -178,9 +180,10 @@ class CheckboxTree extends React.Component {
178180 }
179181
180182 renderTreeNodes ( nodes ) {
183+ const { noCascade, optimisticToggle, showNodeIcon } = this . props ;
181184 const treeNodes = nodes . map ( ( node ) => {
182185 const key = `${ node . value } ` ;
183- const checked = this . getCheckState ( node ) ;
186+ const checked = this . getCheckState ( node , noCascade ) ;
184187 const children = this . renderChildNodes ( node ) ;
185188
186189 return (
@@ -191,9 +194,9 @@ class CheckboxTree extends React.Component {
191194 expanded = { node . expanded }
192195 icon = { node . icon }
193196 label = { node . label }
194- optimisticToggle = { this . props . optimisticToggle }
197+ optimisticToggle = { optimisticToggle }
195198 rawChildren = { node . children }
196- showNodeIcon = { this . props . showNodeIcon }
199+ showNodeIcon = { showNodeIcon }
197200 treeId = { this . id }
198201 value = { node . value }
199202 onCheck = { this . onCheck }
0 commit comments