> extends BaseNodePr
getStyles: (element: ThemeableElement, nodeData: NodeData) => React.CSSProperties
children?: JSX.Element | JSX.Element[] | null
originalNode?: JSX.Element
- originalKeyNode?: JSX.Element
+ originalNodeKey?: JSX.Element
}
export interface CustomNodeDefinition, U = Record> {
From 616f158952069d98ea9fa20a6a31e104aeb20b02 Mon Sep 17 00:00:00 2001
From: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date: Sat, 8 Mar 2025 22:43:01 +1300
Subject: [PATCH 3/4] Update README.md
---
README.md | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index cc562dbe..2f728460 100644
--- a/README.md
+++ b/README.md
@@ -662,7 +662,9 @@ Custom nodes are provided in the `customNodeDefinitions` prop, as an array of ob
showOnView // boolean, default true
showEditTools // boolean, default true
name // string (appears in Types selector)
- showInTypesSelector, // boolean (optional), default false
+ showInTypesSelector // boolean (optional), default false
+ passOriginalNode // boolean (optional), default false -- if `true` makes the original node
+ // for rendering within Custom Node
// Only affects Collection nodes:
showCollectionWrapper // boolean (optional), default true
@@ -673,7 +675,7 @@ Custom nodes are provided in the `customNodeDefinitions` prop, as an array of ob
The `condition` is just a [Filter function](#filter-functions), with the same input parameters (`key`, `path`, `value`, etc.), and `element` is a React component. Every node in the data structure will be run through each condition function, and any that match will be replaced by your custom component. Note that if a node matches more than one custom definition conditions (from multiple components), the *first* one will be used, so place them in the array in priority order.
-The component will receive *all* the same props as a standard node component plus some additional ones — see [BaseNodeProps](https://github.com/CarlosNZ/json-edit-react/blob/b085f6391dabf574809f1040b11401c13344923d/src/types.ts#L219-L265) (common to all nodes) and [CustomNodeProps](https://github.com/CarlosNZ/json-edit-react/blob/b085f6391dabf574809f1040b11401c13344923d/src/types.ts#L275-L287) type definitions. Specifically, if you want to update the data structure from your custom node, you'll need to call the `setValue` method on your node's data value.
+The component will receive *all* the same props as a standard node component plus some additional ones — see [BaseNodeProps](https://github.com/CarlosNZ/json-edit-react/blob/b085f6391dabf574809f1040b11401c13344923d/src/types.ts#L219-L265) (common to all nodes) and [CustomNodeProps](https://github.com/CarlosNZ/json-edit-react/blob/b085f6391dabf574809f1040b11401c13344923d/src/types.ts#L275-L287) type definitions. Specifically, if you want to update the data structure from your custom node, you'll need to call the `setValue` method on your node's data value. And if you enable `passOriginalNode` above, you'll also have access to `originalNode` and `originalNodeKey` in order to render the standard content (i.e. what would have been rendered if it wasn't intercepted by this Custom Node) -- this can be helpful if you want your Custom Node to just be the default content with a little extra decoration. (*Note:* you may need a little custom CSS to render these original node components identically to the default display.)
You can pass additional props specific to your component, if required, through the `customNodeProps` object. A thorough example of a custom **Date Picker** is used in the demo (along with a couple of other more basic presentational ones), which you can inspect to see how to utilise the standard props and a couple of custom props. View the source code [here](https://github.com/CarlosNZ/json-edit-react/blob/main/demo/src/customComponents/DateTimePicker.tsx).
@@ -850,6 +852,8 @@ This component is heavily inspired by [react-json-view](https://github.com/mac-s
## Changelog
+- **1.24.0**:
+ - Option to access (and render) the original node (and its key) within a [Custom Node](#custom-nodes) ([#180](https://github.com/CarlosNZ/json-edit-react/issues/180))
- **1.23.1**: Fix bug where you could collapse a node by clicking inside a "new key" input field [#175](https://github.com/CarlosNZ/json-edit-react/issues/175)
- **1.23.0**:
- Add `viewOnly` prop as a shorthand for restricting all editing [#168](https://github.com/CarlosNZ/json-edit-react/issues/168)
From 64722118769c2c6cd4a87268d6f510e80cfaabc0 Mon Sep 17 00:00:00 2001
From: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date: Sat, 8 Mar 2025 22:49:27 +1300
Subject: [PATCH 4/4] Remove dupe assignation
---
src/ValueNodeWrapper.tsx | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/src/ValueNodeWrapper.tsx b/src/ValueNodeWrapper.tsx
index 572f0505..4abbd0f1 100644
--- a/src/ValueNodeWrapper.tsx
+++ b/src/ValueNodeWrapper.tsx
@@ -294,20 +294,6 @@ export const ValueNodeWrapper: React.FC = (props) => {
getInputComponent(data, inputProps)
)
- const keyDisplayProps = {
- canEditKey,
- isEditingKey,
- pathString,
- path,
- name: name as string,
- handleKeyboard,
- handleEditKey,
- handleCancel,
- styles: getStyles('property', nodeData),
- getNextOrPrevious: (type: 'next' | 'prev') =>
- getNextOrPrevious(nodeData.fullData, path, type, sort),
- }
-
return (