diff --git a/packages/react-json-tree/README.md b/packages/react-json-tree/README.md index 6e802e5f..10b3e50f 100644 --- a/packages/react-json-tree/README.md +++ b/packages/react-json-tree/README.md @@ -146,6 +146,7 @@ Their full signatures are: - `isCustomNode: function(value)` - overrides the default object type detection and renders the value as a single value - `collectionLimit: number` - sets the number of nodes that will be rendered in a collection before rendering them in collapsed ranges - `keyPath: (string | number)[]` - overrides the initial key path for the root node (defaults to `[root]`) +- `onExpand: function(data, level, keyPath)` - on expand callback ### Credits diff --git a/packages/react-json-tree/src/JSONNestedNode.tsx b/packages/react-json-tree/src/JSONNestedNode.tsx index e678af6c..0b1229f1 100644 --- a/packages/react-json-tree/src/JSONNestedNode.tsx +++ b/packages/react-json-tree/src/JSONNestedNode.tsx @@ -95,6 +95,7 @@ interface Props extends CircularPropsPassedThroughJSONNestedNode { nodeTypeIndicator: string; createItemString: (data: any, collectionLimit: number) => string; expandable: boolean; + onExpand?: (data: any, level: number, keyPath: any[]) => void; } interface State { @@ -130,6 +131,7 @@ export default class JSONNestedNode extends React.Component { sortObjectKeys: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]), isCircular: PropTypes.bool, expandable: PropTypes.bool, + onExpand: PropTypes.func }; static defaultProps = { @@ -234,6 +236,14 @@ export default class JSONNestedNode extends React.Component { handleClick = () => { if (this.props.expandable) { + if (this.props.onExpand && !this.state.expanded) { + const { + data, + level, + keyPath + } = this.props; + this.props.onExpand(data, level, keyPath); + } this.setState({ expanded: !this.state.expanded }); } }; diff --git a/packages/react-json-tree/src/index.tsx b/packages/react-json-tree/src/index.tsx index f5013b9f..1832d49c 100644 --- a/packages/react-json-tree/src/index.tsx +++ b/packages/react-json-tree/src/index.tsx @@ -20,6 +20,7 @@ interface Props extends CircularPropsPassedThroughJSONTree { data: any; theme?: Theme; invertTheme: boolean; + onExpand?: (data: any, level: number, keyPath: any[]) => void; } interface State { diff --git a/packages/react-json-tree/src/types.ts b/packages/react-json-tree/src/types.ts index 5d8e1f7c..15b31d8f 100644 --- a/packages/react-json-tree/src/types.ts +++ b/packages/react-json-tree/src/types.ts @@ -9,6 +9,7 @@ interface SharedCircularPropsPassedThroughJSONTree { expanded: boolean, expandable: boolean ) => React.ReactNode; + onExpand?: (data: any, level: number, keyPath: any[]) => void; } interface SharedCircularPropsProvidedByJSONTree extends SharedCircularPropsPassedThroughJSONTree { @@ -43,6 +44,7 @@ interface JSONNestedNodeCircularPropsPassedThroughJSONTree { isCustomNode: (value: any) => boolean; collectionLimit: number; sortObjectKeys?: ((a: any, b: any) => number) | boolean; + onExpand?: (data: any, level: number, keyPath: any[]) => void; } export type CircularPropsPassedThroughJSONTree = SharedCircularPropsPassedThroughJSONTree &