From 5961ae4cba0778527a569530fc4529f62c4a362f Mon Sep 17 00:00:00 2001 From: lucataglia Date: Thu, 18 May 2023 15:33:28 +0200 Subject: [PATCH] add collapse/expand all feature for react-json-tree --- packages/react-json-tree/src/JSONNestedNode.tsx | 12 +++++++++++- packages/react-json-tree/src/index.tsx | 2 ++ packages/react-json-tree/src/types.ts | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/react-json-tree/src/JSONNestedNode.tsx b/packages/react-json-tree/src/JSONNestedNode.tsx index 0e5b5be5..ab451d47 100644 --- a/packages/react-json-tree/src/JSONNestedNode.tsx +++ b/packages/react-json-tree/src/JSONNestedNode.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import JSONArrow from './JSONArrow'; import getCollectionEntries from './getCollectionEntries'; import JSONNode from './JSONNode'; @@ -110,6 +110,7 @@ export default function JSONNestedNode(props: Props) { nodeType, nodeTypeIndicator, shouldExpandNodeInitially, + shouldExpandNode, styling, } = props; @@ -117,7 +118,16 @@ export default function JSONNestedNode(props: Props) { // calculate individual node expansion if necessary isCircular ? false : shouldExpandNodeInitially(keyPath, data, level) ); + + useEffect(() => { + if(shouldExpandNode === undefined){ + return + } + + setExpanded(shouldExpandNode); + }, [shouldExpandNode]) + const handleClick = useCallback(() => { if (expandable) setExpanded(!expanded); }, [expandable, expanded]); diff --git a/packages/react-json-tree/src/index.tsx b/packages/react-json-tree/src/index.tsx index 26fab0fc..48d1ceaa 100644 --- a/packages/react-json-tree/src/index.tsx +++ b/packages/react-json-tree/src/index.tsx @@ -41,6 +41,7 @@ export function JSONTree({ labelRenderer = defaultLabelRenderer, valueRenderer = identity, shouldExpandNodeInitially = expandRootNode, + shouldExpandNode, hideRoot = false, getItemString = defaultItemString, postprocessValue = identity, @@ -64,6 +65,7 @@ export function JSONTree({ labelRenderer={labelRenderer} valueRenderer={valueRenderer} shouldExpandNodeInitially={shouldExpandNodeInitially} + shouldExpandNode={shouldExpandNode} hideRoot={hideRoot} getItemString={getItemString} postprocessValue={postprocessValue} diff --git a/packages/react-json-tree/src/types.ts b/packages/react-json-tree/src/types.ts index 6a67f376..2bb3981a 100644 --- a/packages/react-json-tree/src/types.ts +++ b/packages/react-json-tree/src/types.ts @@ -47,6 +47,7 @@ export interface CommonExternalProps { labelRenderer: LabelRenderer; valueRenderer: ValueRenderer; shouldExpandNodeInitially: ShouldExpandNodeInitially; + shouldExpandNode: boolean | undefined; hideRoot: boolean; getItemString: GetItemString; postprocessValue: PostprocessValue;