@@ -12,10 +12,11 @@ import React, {
1212 useMemo ,
1313 useCallback ,
1414 useEffect ,
15+ useRef ,
1516} from 'react' ;
1617
1718import { logicalStyle , mathWithUnits } from '../../../global_styling' ;
18- import { useUpdateEffect , useEuiTheme } from '../../../services' ;
19+ import { useUpdateEffect , useDeepEqual , useEuiTheme } from '../../../services' ;
1920import { EuiI18n , useEuiI18n } from '../../i18n' ;
2021import { EuiPopover , EuiPopoverFooter } from '../../popover' ;
2122import { EuiButtonIcon , EuiButtonGroup , EuiButtonEmpty } from '../../button' ;
@@ -41,6 +42,7 @@ export const startingStyles: EuiDataGridStyle = {
4142 footer : 'overline' ,
4243 stickyFooter : true ,
4344} ;
45+ const emptyRowHeightsOptions : EuiDataGridRowHeightsOptions = { } ;
4446
4547/**
4648 * Cell density
@@ -281,8 +283,8 @@ const RowHeightControl = ({
281283
282284export const useDataGridDisplaySelector = (
283285 showDisplaySelector : EuiDataGridToolBarVisibilityOptions [ 'showDisplaySelector' ] ,
284- initialStyles : EuiDataGridStyle ,
285- initialRowHeightsOptions ? : EuiDataGridRowHeightsOptions
286+ passedGridStyles : EuiDataGridStyle ,
287+ passedRowHeightsOptions : EuiDataGridRowHeightsOptions = emptyRowHeightsOptions
286288) : [ ReactNode , EuiDataGridStyle , EuiDataGridRowHeightsOptions ] => {
287289 const [ isOpen , setIsOpen ] = useState ( false ) ;
288290
@@ -296,79 +298,110 @@ export const useDataGridDisplaySelector = (
296298 ? undefined
297299 : showDisplaySelector ?. customRender ;
298300
299- // Track styles specified by the user at run time
300- const [ userGridStyles , setUserGridStyles ] = useState ( { } ) ;
301- const [ userRowHeightsOptions , setUserRowHeightsOptions ] = useState ( { } ) ;
302-
303- // Merge the developer-specified configurations with user overrides
304- const gridStyles = useMemo ( ( ) => {
305- return {
306- ...initialStyles ,
307- ...userGridStyles ,
308- } ;
309- } , [ initialStyles , userGridStyles ] ) ;
310-
311- const rowHeightsOptions = useMemo ( ( ) => {
312- return {
313- ...initialRowHeightsOptions ,
314- ...userRowHeightsOptions ,
315- } ;
316- } , [ initialRowHeightsOptions , userRowHeightsOptions ] ) ;
317-
318- // Invoke onChange callbacks (removing the callback value itself, so that only configuration values are returned)
319- useUpdateEffect ( ( ) => {
320- const { onChange, ...currentGridStyles } = gridStyles ;
321- initialStyles ?. onChange ?.( currentGridStyles ) ;
322- } , [ userGridStyles ] ) ;
301+ /**
302+ * Grid style changes
303+ */
304+ const [ gridStyles , setGridStyles ] =
305+ useState < EuiDataGridStyle > ( passedGridStyles ) ;
323306
307+ // Update if consumers pass new grid style configurations
308+ const stablePassedGridStyles = useDeepEqual ( passedGridStyles ) ;
324309 useUpdateEffect ( ( ) => {
325- const { onChange, ...currentRowHeightsOptions } = rowHeightsOptions ;
326- initialRowHeightsOptions ?. onChange ?.( currentRowHeightsOptions ) ;
327- } , [ userRowHeightsOptions ] ) ;
328-
329- // Allow resetting to initial developer-specified configurations
330- const resetToInitialState = useCallback ( ( ) => {
331- setUserGridStyles ( { } ) ;
332- setUserRowHeightsOptions ( { } ) ;
333- } , [ ] ) ;
310+ setGridStyles ( stablePassedGridStyles ) ;
311+ } , [ stablePassedGridStyles ] ) ;
312+
313+ // Update on user display selector change
314+ const onUserGridStyleChange = useCallback (
315+ ( styles : EuiDataGridRowHeightsOptions ) =>
316+ setGridStyles ( ( prevStyles ) => {
317+ const changedStyles = { ...prevStyles , ...styles } ;
318+ const { onChange, ...rest } = changedStyles ;
319+ onChange ?.( rest ) ;
320+ return changedStyles ;
321+ } ) ,
322+ [ ]
323+ ) ;
334324
335325 const densityControl = useMemo ( ( ) => {
336326 const show = getNestedObjectOptions ( showDisplaySelector , 'allowDensity' ) ;
337327 return show ? (
338- < DensityControl gridStyles = { gridStyles } onChange = { setUserGridStyles } />
328+ < DensityControl
329+ gridStyles = { gridStyles }
330+ onChange = { onUserGridStyleChange }
331+ />
339332 ) : null ;
340- } , [ showDisplaySelector , gridStyles , setUserGridStyles ] ) ;
333+ } , [ showDisplaySelector , gridStyles , onUserGridStyleChange ] ) ;
334+
335+ /**
336+ * Row height changes
337+ */
338+ const [ rowHeightsOptions , setRowHeightsOptions ] =
339+ useState < EuiDataGridRowHeightsOptions > ( passedRowHeightsOptions ) ;
340+
341+ // Update if consumers pass new row height configurations
342+ const stablePassedRowHeights = useDeepEqual ( passedRowHeightsOptions ) ;
343+ useUpdateEffect ( ( ) => {
344+ setRowHeightsOptions ( stablePassedRowHeights ) ;
345+ } , [ stablePassedRowHeights ] ) ;
346+
347+ // Update on user display selector change
348+ const onUserRowHeightChange = useCallback (
349+ ( options : EuiDataGridRowHeightsOptions ) =>
350+ setRowHeightsOptions ( ( prevOptions ) => {
351+ const changedOptions = { ...prevOptions , ...options } ;
352+ const { onChange, ...rest } = changedOptions ;
353+ onChange ?.( rest ) ;
354+ return changedOptions ;
355+ } ) ,
356+ [ ]
357+ ) ;
341358
342359 const rowHeightControl = useMemo ( ( ) => {
343360 const show = getNestedObjectOptions ( showDisplaySelector , 'allowRowHeight' ) ;
344361 return show ? (
345362 < RowHeightControl
346363 rowHeightsOptions = { rowHeightsOptions }
347- onChange = { setUserRowHeightsOptions }
364+ onChange = { onUserRowHeightChange }
348365 />
349366 ) : null ;
350- } , [ showDisplaySelector , rowHeightsOptions , setUserRowHeightsOptions ] ) ;
367+ } , [ showDisplaySelector , rowHeightsOptions , onUserRowHeightChange ] ) ;
368+
369+ /**
370+ * Reset button
371+ */
372+ const [ showResetButton , setShowResetButton ] = useState ( false ) ;
373+ const initialGridStyles = useRef < EuiDataGridStyle > ( passedGridStyles ) ;
374+ const initialRowHeightsOptions = useRef < EuiDataGridRowHeightsOptions > (
375+ passedRowHeightsOptions
376+ ) ;
377+
378+ const resetToInitialState = useCallback ( ( ) => {
379+ setGridStyles ( initialGridStyles . current ) ;
380+ setRowHeightsOptions ( initialRowHeightsOptions . current ) ;
381+ } , [ ] ) ;
382+
383+ useUpdateEffect ( ( ) => {
384+ setShowResetButton (
385+ rowHeightsOptions . defaultHeight !==
386+ initialRowHeightsOptions . current . defaultHeight ||
387+ gridStyles . fontSize !== initialGridStyles . current . fontSize ||
388+ gridStyles . cellPadding !== initialGridStyles . current . cellPadding
389+ ) ;
390+ } , [
391+ rowHeightsOptions . defaultHeight ,
392+ gridStyles . fontSize ,
393+ gridStyles . cellPadding ,
394+ ] ) ;
351395
352396 const resetButton = useMemo ( ( ) => {
353- const show = getNestedObjectOptions (
397+ const allowed = getNestedObjectOptions (
354398 showDisplaySelector ,
355399 'allowResetButton'
356400 ) ;
357- if ( ! show ) return null ;
358-
359- const hasUserChanges =
360- Object . keys ( userGridStyles ) . length > 0 ||
361- Object . keys ( userRowHeightsOptions ) . length > 0 ;
401+ if ( ! allowed || ! showResetButton ) return null ;
362402
363- return hasUserChanges ? (
364- < ResetButton onClick = { resetToInitialState } />
365- ) : null ;
366- } , [
367- showDisplaySelector ,
368- resetToInitialState ,
369- userGridStyles ,
370- userRowHeightsOptions ,
371- ] ) ;
403+ return < ResetButton onClick = { resetToInitialState } /> ;
404+ } , [ showDisplaySelector , showResetButton , resetToInitialState ] ) ;
372405
373406 const buttonLabel = useEuiI18n (
374407 'euiDisplaySelector.buttonText' ,
0 commit comments