put in a line renderer that gives an opportunity to customize key/value key /nestedvalue behavior

This commit is contained in:
Michael Xu 2019-09-30 20:55:32 +00:00
parent 03d1448dc3
commit 974d94f8b5
4 changed files with 45 additions and 27 deletions

View File

@ -90,6 +90,7 @@ export default class JSONNestedNode extends React.Component {
PropTypes.oneOfType([PropTypes.string, PropTypes.number]) PropTypes.oneOfType([PropTypes.string, PropTypes.number])
).isRequired, ).isRequired,
labelRenderer: PropTypes.func.isRequired, labelRenderer: PropTypes.func.isRequired,
lineRenderer: PropTypes.func.isRequired,
shouldExpandNode: PropTypes.func, shouldExpandNode: PropTypes.func,
level: PropTypes.number.isRequired, level: PropTypes.number.isRequired,
sortObjectKeys: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]), sortObjectKeys: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]),
@ -140,6 +141,7 @@ export default class JSONNestedNode extends React.Component {
collectionLimit, collectionLimit,
keyPath, keyPath,
labelRenderer, labelRenderer,
lineRenderer,
expandable expandable
} = this.props; } = this.props;
const { expanded } = this.state; const { expanded } = this.state;
@ -161,23 +163,16 @@ export default class JSONNestedNode extends React.Component {
); );
const stylingArgs = [keyPath, nodeType, expanded, expandable]; const stylingArgs = [keyPath, nodeType, expanded, expandable];
return hideRoot ? ( const labelItem = <>
<li {...styling('rootNode', ...stylingArgs)}> {expandable && (
<ul {...styling('rootNodeChildren', ...stylingArgs)}> <JSONArrow
{renderedChildren} styling={styling}
</ul> nodeType={nodeType}
</li> expanded={expanded}
) : ( onClick={this.handleClick}
<li {...styling('nestedNode', ...stylingArgs)}> />
{expandable && ( )}
<JSONArrow <label
styling={styling}
nodeType={nodeType}
expanded={expanded}
onClick={this.handleClick}
/>
)}
<label
{...styling(['label', 'nestedNodeLabel'], ...stylingArgs)} {...styling(['label', 'nestedNodeLabel'], ...stylingArgs)}
onClick={this.handleClick} onClick={this.handleClick}
> >
@ -189,11 +184,25 @@ export default class JSONNestedNode extends React.Component {
> >
{renderedItemString} {renderedItemString}
</span> </span>
<ul {...styling('nestedNodeChildren', ...stylingArgs)}> </>
const valueItem =
<ul {...styling('nestedNodeChildren', ...stylingArgs)}>
{renderedChildren}
</ul>
return hideRoot ? (
<li {...styling('rootNode', ...stylingArgs)}>
<ul {...styling('rootNodeChildren', ...stylingArgs)}>
{renderedChildren} {renderedChildren}
</ul> </ul>
</li> </li>
); ) :
<li {...styling('nestedNode', ...stylingArgs)}>
{lineRenderer(labelItem, valueItem, ...stylingArgs)}
</li>
;
} }
handleClick = () => { handleClick = () => {

View File

@ -10,6 +10,7 @@ const JSONNode = ({
getItemString, getItemString,
keyPath, keyPath,
labelRenderer, labelRenderer,
lineRenderer,
styling, styling,
value, value,
valueRenderer, valueRenderer,
@ -23,6 +24,7 @@ const JSONNode = ({
key: keyPath[0], key: keyPath[0],
keyPath, keyPath,
labelRenderer, labelRenderer,
lineRenderer,
nodeType, nodeType,
styling, styling,
value, value,
@ -100,6 +102,7 @@ JSONNode.propTypes = {
PropTypes.oneOfType([PropTypes.string, PropTypes.number]) PropTypes.oneOfType([PropTypes.string, PropTypes.number])
).isRequired, ).isRequired,
labelRenderer: PropTypes.func.isRequired, labelRenderer: PropTypes.func.isRequired,
lineRenderer: PropTypes.func.isRequired,
styling: PropTypes.func.isRequired, styling: PropTypes.func.isRequired,
value: PropTypes.any, value: PropTypes.any,
valueRenderer: PropTypes.func.isRequired, valueRenderer: PropTypes.func.isRequired,

View File

@ -9,25 +9,29 @@ const JSONValueNode = ({
nodeType, nodeType,
styling, styling,
labelRenderer, labelRenderer,
lineRenderer,
keyPath, keyPath,
valueRenderer, valueRenderer,
value, value,
valueGetter valueGetter
}) => ( }) => {
<li {...styling('value', nodeType, keyPath)}> const labelItem = (<label {...styling(['label', 'valueLabel'], nodeType, keyPath)}>
<label {...styling(['label', 'valueLabel'], nodeType, keyPath)}> {labelRenderer(keyPath, nodeType, false, false)}
{labelRenderer(keyPath, nodeType, false, false)} </label>)
</label> const valueItem = (<span {...styling('valueText', nodeType, keyPath)}>
<span {...styling('valueText', nodeType, keyPath)}>
{valueRenderer(valueGetter(value), value, ...keyPath)} {valueRenderer(valueGetter(value), value, ...keyPath)}
</span> </span>)
return <li {...styling('value', nodeType, keyPath)}>
{lineRenderer(labelItem, valueItem, keyPath,nodeType, false, false)}
</li> </li>
); };
JSONValueNode.propTypes = { JSONValueNode.propTypes = {
nodeType: PropTypes.string.isRequired, nodeType: PropTypes.string.isRequired,
styling: PropTypes.func.isRequired, styling: PropTypes.func.isRequired,
labelRenderer: PropTypes.func.isRequired, labelRenderer: PropTypes.func.isRequired,
lineRenderer: PropTypes.func.isRequired,
keyPath: PropTypes.arrayOf( keyPath: PropTypes.arrayOf(
PropTypes.oneOfType([PropTypes.string, PropTypes.number]) PropTypes.oneOfType([PropTypes.string, PropTypes.number])
).isRequired, ).isRequired,

View File

@ -17,6 +17,7 @@ const defaultItemString = (type, data, itemType, itemString) => (
</span> </span>
); );
const defaultLabelRenderer = ([label]) => <span>{label}:</span>; const defaultLabelRenderer = ([label]) => <span>{label}:</span>;
const defaultLineRenderer = (labelItem, valueItem, [other]) => <>{labelItem}{valueItem}</>;
const noCustomNode = () => false; const noCustomNode = () => false;
function checkLegacyTheming(theme, props) { function checkLegacyTheming(theme, props) {
@ -98,6 +99,7 @@ export default class JSONTree extends React.Component {
keyPath: ['root'], keyPath: ['root'],
getItemString: defaultItemString, getItemString: defaultItemString,
labelRenderer: defaultLabelRenderer, labelRenderer: defaultLabelRenderer,
lineRenderer: defaultLineRenderer,
valueRenderer: identity, valueRenderer: identity,
postprocessValue: identity, postprocessValue: identity,
isCustomNode: noCustomNode, isCustomNode: noCustomNode,