2018-12-21 22:18:05 +03:00
|
|
|
import React from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
2020-08-22 03:13:24 +03:00
|
|
|
import { JSONValueNodeCircularPropsProvidedByJSONNode } from './types';
|
2018-12-21 22:18:05 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Renders simple values (eg. strings, numbers, booleans, etc)
|
|
|
|
*/
|
|
|
|
|
2020-08-22 03:13:24 +03:00
|
|
|
interface Props extends JSONValueNodeCircularPropsProvidedByJSONNode {
|
|
|
|
nodeType: string;
|
|
|
|
value: any;
|
|
|
|
valueGetter?: (value: any) => any;
|
|
|
|
}
|
|
|
|
|
|
|
|
const JSONValueNode: React.FunctionComponent<Props> = ({
|
2018-12-21 22:18:05 +03:00
|
|
|
nodeType,
|
|
|
|
styling,
|
|
|
|
labelRenderer,
|
|
|
|
keyPath,
|
|
|
|
valueRenderer,
|
|
|
|
value,
|
2020-08-22 03:13:24 +03:00
|
|
|
valueGetter = (value) => value,
|
2018-12-21 22:18:05 +03:00
|
|
|
}) => (
|
|
|
|
<li {...styling('value', nodeType, keyPath)}>
|
|
|
|
<label {...styling(['label', 'valueLabel'], nodeType, keyPath)}>
|
|
|
|
{labelRenderer(keyPath, nodeType, false, false)}
|
|
|
|
</label>
|
|
|
|
<span {...styling('valueText', nodeType, keyPath)}>
|
|
|
|
{valueRenderer(valueGetter(value), value, ...keyPath)}
|
|
|
|
</span>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
|
|
|
|
JSONValueNode.propTypes = {
|
|
|
|
nodeType: PropTypes.string.isRequired,
|
|
|
|
styling: PropTypes.func.isRequired,
|
|
|
|
labelRenderer: PropTypes.func.isRequired,
|
|
|
|
keyPath: PropTypes.arrayOf(
|
2020-08-22 03:13:24 +03:00
|
|
|
PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired
|
2018-12-21 22:18:05 +03:00
|
|
|
).isRequired,
|
|
|
|
valueRenderer: PropTypes.func.isRequired,
|
|
|
|
value: PropTypes.any,
|
2020-08-08 23:26:39 +03:00
|
|
|
valueGetter: PropTypes.func,
|
2018-12-21 22:18:05 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
export default JSONValueNode;
|