diff --git a/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.test.tsx b/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.test.tsx new file mode 100644 index 0000000000000..9a764bb29205c --- /dev/null +++ b/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.test.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import React, { type ComponentProps } from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import { CascadeRowHeaderPrimitive } from './cascade_row_header'; +import { DataCascadeProvider } from '../../../../store_provider'; + +type CascadeRowHeaderPrimitiveProps = ComponentProps; + +const cascadeGroups = ['group1', 'group2']; + +const initialGroupColumn = [cascadeGroups[0]]; + +const defaultProps: CascadeRowHeaderPrimitiveProps = { + isGroupNode: true, + onCascadeGroupNodeExpanded: jest.fn(), + onCascadeGroupNodeCollapsed: jest.fn(), + rowInstance: { + id: '1', + depth: 0, + original: { id: '1', name: 'Test', [initialGroupColumn[0]]: 'value' }, + getToggleSelectedHandler: jest.fn(), + getToggleExpandedHandler: jest.fn(), + getIsExpanded: jest.fn(() => true), + subRows: [], + } as unknown as CascadeRowHeaderPrimitiveProps['rowInstance'], + rowHeaderTitleSlot: () =>
Test
, + size: 'm', +}; + +describe('CascadeRowHeaderPrimitive', () => { + const renderComponent = ({ + ...overrides + }: Partial> = {}) => { + return render( + + + + ); + }; + + it('should render', () => { + renderComponent(); + expect(screen.queryByTestId(`${defaultProps.rowInstance.id}-row-header`)).toBeInTheDocument(); + }); + + describe('group node behaviour', () => { + it('should invoke the onCascadeGroupNodeCollapsed callback when row is collapsed', async () => { + const onCascadeGroupNodeCollapsed = jest.fn(); + + const componentProps = { + ...defaultProps, + rowInstance: { + ...defaultProps.rowInstance, + getIsExpanded: jest.fn(() => false), + }, + }; + + renderComponent({ + isGroupNode: true, + onCascadeGroupNodeCollapsed, + rowInstance: componentProps.rowInstance, + }); + + await waitFor(() => { + expect(onCascadeGroupNodeCollapsed).toHaveBeenCalledWith({ + row: defaultProps.rowInstance.original, + nodePath: initialGroupColumn, + nodePathMap: { + [initialGroupColumn[0]]: defaultProps.rowInstance.original[initialGroupColumn[0]], + }, + }); + }); + }); + }); +}); diff --git a/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.tsx b/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.tsx index 7b741190da21b..9b74600441c7b 100644 --- a/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.tsx +++ b/src/platform/packages/shared/shared-ux/document_data_cascade/impl/src/components/data_cascade_impl/data_cascade_row/components/cascade_row_header.tsx @@ -111,17 +111,6 @@ export function CascadeRowHeaderPrimitive {}, []); - useEffect( - () => () => { - onCascadeGroupNodeCollapsed?.({ - row: rowInstance.original, - nodePath, - nodePathMap, - }); - }, - [onCascadeGroupNodeCollapsed, nodePath, nodePathMap, rowInstance.original] - ); - useEffect(() => { // fetch the data for the sub-rows if (isGroupNode && rowIsExpanded && !Boolean(rowChildrenCount)) { @@ -132,6 +121,23 @@ export function CascadeRowHeaderPrimitive { + if (!rowIsExpanded && isGroupNode) { + onCascadeGroupNodeCollapsed?.({ + row: rowInstance.original, + nodePath, + nodePathMap, + }); + } + }, [ + onCascadeGroupNodeCollapsed, + nodePath, + nodePathMap, + rowInstance.original, + rowIsExpanded, + isGroupNode, + ]); + return ( @@ -140,6 +146,7 @@ export function CascadeRowHeaderPrimitive {