import type { GridRowId } from '../types' import type { ApiSection } from './types' export type GridTreeApi = { expandAll: () => void collapseAll: () => void expand: (id: GridRowId, value?: boolean, recursive?: boolean) => void } export const createTreeApi: ApiSection = (store, events) => ({ expandAll: () => { const state = store.getState() const expandedRows = store.selectors.selectExpandedRows(state) const rowIds = store.selectors.selectAllExpandable(state) const newExpanded = [...rowIds].filter((id) => !expandedRows.has(id)) events.emit('onExpandedRowsChange', rowIds, { expanded: new Set(newExpanded), collapsed: new Set(), }) }, collapseAll: () => { const expandedRows = store.selectors.selectExpandedRows( store.getState() ) events.emit('onExpandedRowsChange', new Set(), { expanded: new Set(), collapsed: new Set(expandedRows), }) }, expand: (id, value = true, recursive = false) => { const state = store.getState() const expandedRows = store.selectors.selectExpandedRows(state) const ids = recursive ? store.selectors.selectAllExpandableDescendants(state, id) : new Set([id]) let result: Set const newExpanded = new Set() const newCollapsed = new Set() if (value) { result = new Set([...expandedRows, ...ids]) ;[...result].forEach((id) => { if (!expandedRows.has(id)) { newExpanded.add(id) } }) } else { result = new Set( [...expandedRows].filter((expandedId) => !ids.has(expandedId)) ) ;[...ids].forEach((id) => { if (expandedRows.has(id)) { newCollapsed.add(id) } }) } events.emit('onExpandedRowsChange', result, { expanded: newExpanded, collapsed: newCollapsed, }) }, })