@@ -127,12 +127,8 @@ export const isChecked = (
127127 itemValue : string | number ,
128128 id : string | undefined ,
129129 tagValue : string | undefined ,
130- propSelected : Record < string , Record < string , boolean | GroupItem > >
130+ selected : Record < string , Record < string , boolean | GroupItem > >
131131) => {
132- const selected = {
133- ...propSelected ,
134- } ;
135-
136132 if ( typeof selected [ groupValue ] === 'undefined' ) {
137133 return false ;
138134 }
@@ -147,10 +143,10 @@ export const isChecked = (
147143 }
148144 }
149145
150- return Boolean ( group . isSelected ) ;
146+ return group . isSelected ;
151147 }
152148
153- return Boolean ( selected [ groupValue ] [ itemValue ] ) ;
149+ return selected [ groupValue ] [ itemValue ] ;
154150} ;
155151
156152export type FilterMenuItemOnChange = (
@@ -210,7 +206,8 @@ export const getMenuItems = (
210206 string
211207 ] = [
212208 event ,
213- calculateSelected ( groupType || item . type , groupValue , ( groupType || item . type ) === GroupType . treeView ? treeViewItem : item . value , checked ) ,
209+ // @ts -ignore
210+ calculateSelected ( groupType || item . type , groupValue , ( groupType || item . type ) === GroupType . treeView ? treeViewItem : item . value , ( event . target as HTMLInputElement ) ?. checked || checked ) ,
214211 {
215212 value : groupValue ,
216213 id : ( groupId || item . id ) as string ,
@@ -281,10 +278,27 @@ export const getGroupMenuItems = (
281278 return result . filter ( ( { noFilter, items = [ ] } ) => ! noFilter || items . length > 0 ) ;
282279} ;
283280
281+ const isGroupSelected = ( selectedCount , groupItemCount ) => {
282+ if ( selectedCount === 0 ) {
283+ return false
284+ }
285+
286+ if ( selectedCount < groupItemCount ) {
287+ return null
288+ }
289+
290+ if ( selectedCount === groupItemCount ) {
291+ return true
292+ }
293+ }
294+
284295export const calculateSelected =
285- ( selectedTags : Record < string , Record < string , GroupItem | boolean > > ) =>
296+ ( selectedTags : Record < string , Record < string , GroupItem | boolean > > , groups ?: Group [ ] ) =>
286297 ( type = GroupType . button , groupKey = '' , value : TreeViewItem | string = '' , checked = false ) => {
287298 const activeGroup = selectedTags ?. [ groupKey ] ;
299+ const groupItems = groups ?. find ( ( { label} ) => label === groupKey ) ?. items
300+ const groupItemsCount = groupItems ?. length
301+ const activeGroupGroupValue = value === groupKey ? checked : undefined
288302 const children =
289303 type === GroupType . treeView
290304 ? [ value as TreeViewItem ] . reduce ( function iter ( acc : TreeViewItem [ ] , curr : TreeViewItem ) : TreeViewItem [ ] {
@@ -298,6 +312,25 @@ export const calculateSelected =
298312 : [ ] ;
299313
300314 const itemKeys = type === GroupType . treeView ? children . map ( ( item : TreeViewItem ) => item . id ) : [ String ( value ) ] ;
315+ const itemKeysCount = itemKeys . filter ( ( key ) => key !== groupKey ) . length
316+
317+ if ( activeGroupGroupValue === true || activeGroupGroupValue === false ) {
318+ const result = groupItems ?. map ( ( { value} ) => value ) . reduce ( ( result , itemValue ) => ( {
319+ ...result ,
320+ [ groupKey ] : {
321+ ...result [ groupKey ] ,
322+ [ itemValue ] : activeGroupGroupValue
323+ }
324+ } ) , selectedTags || { } )
325+
326+ return {
327+ ...result ,
328+ [ groupKey ] : {
329+ ...result ?. [ groupKey ] || { } ,
330+ [ groupKey ] : activeGroupGroupValue
331+ }
332+ }
333+ }
301334
302335 if ( activeGroup ) {
303336 let result = selectedTags ;
@@ -324,10 +357,18 @@ export const calculateSelected =
324357 } ;
325358 }
326359 } ) ;
327- return result ;
360+ const selectedItemsCount = Object . entries ( result [ groupKey ] ) . filter ( ( [ key , value ] ) => key !== groupKey && Boolean ( value ) === true ) . length
361+
362+ return {
363+ ...result ,
364+ [ groupKey ] : {
365+ ...result [ groupKey ] ,
366+ [ groupKey ] : isGroupSelected ( selectedItemsCount , groupItemsCount )
367+ }
368+ } ;
328369 }
329370
330- return itemKeys . reduce (
371+ const result = itemKeys . reduce (
331372 ( acc , curr ) => ( {
332373 ...acc ,
333374 [ groupKey ] : {
@@ -337,17 +378,26 @@ export const calculateSelected =
337378 } ) ,
338379 selectedTags
339380 ) ;
381+ const selectedItemsCount = Object . entries ( result [ groupKey ] ) . filter ( ( [ key , value ] ) => key !== groupKey && Boolean ( value ) === true ) . length
382+
383+ return {
384+ ...result ,
385+ [ groupKey ] : {
386+ ...result [ groupKey ] ,
387+ [ groupKey ] : isGroupSelected ( selectedItemsCount , groupItemsCount )
388+ }
389+ } ;
340390 } ;
341391
342392const areAllChildrenChecked = ( dataItem : TreeViewItem , groupKey : string , selected : Record < string , Record < string , boolean | GroupItem > > ) : boolean =>
343393 dataItem . children
344394 ? dataItem . children . every ( ( child : TreeViewItem ) => areAllChildrenChecked ( child , groupKey , selected ) )
345- : isChecked ( groupKey , dataItem . id || '' , undefined , undefined , selected ) ;
395+ : isChecked ( groupKey , dataItem . id || '' , undefined , undefined , selected ) || false ;
346396
347397const areSomeChildrenChecked = ( dataItem : TreeViewItem , groupKey : string , selected : Record < string , Record < string , boolean | GroupItem > > ) : boolean =>
348398 dataItem . children
349399 ? dataItem . children . some ( ( child : TreeViewItem ) => areSomeChildrenChecked ( child , groupKey , selected ) )
350- : isChecked ( groupKey , dataItem . id || '' , undefined , undefined , selected ) ;
400+ : isChecked ( groupKey , dataItem . id || '' , undefined , undefined , selected ) || false ;
351401
352402export const mapTree = ( item : TreeViewItem , groupKey : string , selected : Record < string , Record < string , boolean | GroupItem > > ) : TreeViewItem => {
353403 const hasCheck = areAllChildrenChecked ( item , groupKey , selected ) ;
0 commit comments