mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2024-11-22 09:36:43 +03:00
Added ArrowComponentOverride
This commit is contained in:
parent
e8b07a9c11
commit
f2c45915d6
|
@ -137,6 +137,34 @@ Their full signatures are:
|
||||||
- `labelRenderer: function(keyPath, nodeType, expanded, expandable)`
|
- `labelRenderer: function(keyPath, nodeType, expanded, expandable)`
|
||||||
- `valueRenderer: function(valueAsString, value, ...keyPath)`
|
- `valueRenderer: function(valueAsString, value, ...keyPath)`
|
||||||
|
|
||||||
|
Additionally, it is possible to override the arrows for expanding, for example with a `+` and `-` button.
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
const ArrowOverride = ({ expanded, ...rest }: JSONArrowProps) => {
|
||||||
|
if (expanded) {
|
||||||
|
return <button {...rest}>-</button>
|
||||||
|
}
|
||||||
|
return <button {...rest}>+</button>
|
||||||
|
}
|
||||||
|
|
||||||
|
<JSONTree ArrowComponentOverride={ArrowOverride} />
|
||||||
|
```
|
||||||
|
|
||||||
|
The default `JSONArrow` component will literally check if an `ArrowComponentOverride` exists and pass it's props there. The typescript for these props is as follows.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
interface JSONArrowProps {
|
||||||
|
styling: StylingFunction;
|
||||||
|
arrowStyle?: 'single' | 'double';
|
||||||
|
expanded: boolean;
|
||||||
|
nodeType: string;
|
||||||
|
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
||||||
|
ariaControls?: string;
|
||||||
|
ariaLabel?: string
|
||||||
|
OverrideComponent?: ComponentType<JSONArrowProps>;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
#### More Options
|
#### More Options
|
||||||
|
|
||||||
- `shouldExpandNodeInitially: function(keyPath, data, level)` - determines if node should be expanded when it first renders (root is expanded by default)
|
- `shouldExpandNodeInitially: function(keyPath, data, level)` - determines if node should be expanded when it first renders (root is expanded by default)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Map } from 'immutable';
|
import { Map } from 'immutable';
|
||||||
import { JSONTree, StylingValue } from 'react-json-tree';
|
import { JSONArrowProps, JSONTree, StylingValue } from 'react-json-tree';
|
||||||
|
|
||||||
const getLabelStyle: StylingValue = ({ style }, nodeType, expanded) => ({
|
const getLabelStyle: StylingValue = ({ style }, nodeType, expanded) => ({
|
||||||
style: {
|
style: {
|
||||||
|
@ -125,6 +125,13 @@ const theme = {
|
||||||
base0F: '#cc6633',
|
base0F: '#cc6633',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ArrowOverride = ({ expanded, ...rest }: JSONArrowProps) => {
|
||||||
|
if (expanded) {
|
||||||
|
return <button {...rest}>-</button>
|
||||||
|
}
|
||||||
|
return <button {...rest}>+</button>
|
||||||
|
}
|
||||||
|
|
||||||
const App = () => (
|
const App = () => (
|
||||||
<div>
|
<div>
|
||||||
<JSONTree data={data} theme={theme} invertTheme />
|
<JSONTree data={data} theme={theme} invertTheme />
|
||||||
|
@ -168,10 +175,12 @@ const App = () => (
|
||||||
<p>
|
<p>
|
||||||
Pass <code>labelRenderer</code> or <code>valueRenderer</code>.
|
Pass <code>labelRenderer</code> or <code>valueRenderer</code>.
|
||||||
</p>
|
</p>
|
||||||
|
<p>Additionally, you may pass an <code>ArrowComponentOverride</code></p>
|
||||||
<div>
|
<div>
|
||||||
<JSONTree
|
<JSONTree
|
||||||
data={data}
|
data={data}
|
||||||
theme={theme}
|
theme={theme}
|
||||||
|
ArrowComponentOverride={ArrowOverride}
|
||||||
labelRenderer={([raw]) => <span>(({raw})):</span>}
|
labelRenderer={([raw]) => <span>(({raw})):</span>}
|
||||||
valueRenderer={(raw) => (
|
valueRenderer={(raw) => (
|
||||||
<em>
|
<em>
|
||||||
|
|
|
@ -34,6 +34,7 @@ export default function ItemRange(props: Props) {
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
arrowStyle="double"
|
arrowStyle="double"
|
||||||
ariaLabel={`Expand Array from ${from} to ${to}`}
|
ariaLabel={`Expand Array from ${from} to ${to}`}
|
||||||
|
OverrideComponent={props.ArrowComponentOverride}
|
||||||
/>
|
/>
|
||||||
{`${from} ... ${to}`}
|
{`${from} ... ${to}`}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React from 'react';
|
import React, { ComponentType } from 'react';
|
||||||
import type { StylingFunction } from 'react-base16-styling';
|
import type { StylingFunction } from 'react-base16-styling';
|
||||||
|
|
||||||
interface Props {
|
export interface JSONArrowProps {
|
||||||
styling: StylingFunction;
|
styling: StylingFunction;
|
||||||
arrowStyle?: 'single' | 'double';
|
arrowStyle?: 'single' | 'double';
|
||||||
expanded: boolean;
|
expanded: boolean;
|
||||||
|
@ -9,17 +9,23 @@ interface Props {
|
||||||
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
||||||
ariaControls?: string;
|
ariaControls?: string;
|
||||||
ariaLabel?: string
|
ariaLabel?: string
|
||||||
|
OverrideComponent?: ComponentType<JSONArrowProps>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function JSONArrow({
|
export default function JSONArrow({OverrideComponent, ...props}: JSONArrowProps) {
|
||||||
styling,
|
const {
|
||||||
arrowStyle = 'single',
|
styling,
|
||||||
expanded,
|
arrowStyle = 'single',
|
||||||
nodeType,
|
expanded,
|
||||||
onClick,
|
nodeType,
|
||||||
ariaControls,
|
onClick,
|
||||||
ariaLabel
|
ariaControls,
|
||||||
}: Props) {
|
ariaLabel
|
||||||
|
} = props
|
||||||
|
if(OverrideComponent) {
|
||||||
|
return <OverrideComponent {...props} />
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<button {...styling('arrowContainer', arrowStyle)} aria-label={ariaLabel} aria-expanded={expanded} aria-controls={ariaControls} onClick={onClick}>
|
<button {...styling('arrowContainer', arrowStyle)} aria-label={ariaLabel} aria-expanded={expanded} aria-controls={ariaControls} onClick={onClick}>
|
||||||
<div {...styling(['arrow', 'arrowSign'], nodeType, expanded, arrowStyle)}>
|
<div {...styling(['arrow', 'arrowSign'], nodeType, expanded, arrowStyle)}>
|
||||||
|
|
|
@ -161,6 +161,7 @@ export default function JSONNestedNode(props: Props) {
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
ariaControls={ariaControls}
|
ariaControls={ariaControls}
|
||||||
ariaLabel={ariaLabel}
|
ariaLabel={ariaLabel}
|
||||||
|
OverrideComponent={props.ArrowComponentOverride}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<label
|
<label
|
||||||
|
|
|
@ -47,6 +47,7 @@ export function JSONTree({
|
||||||
isCustomNode = noCustomNode,
|
isCustomNode = noCustomNode,
|
||||||
collectionLimit = 50,
|
collectionLimit = 50,
|
||||||
sortObjectKeys = false,
|
sortObjectKeys = false,
|
||||||
|
ArrowComponentOverride
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const styling = useMemo(
|
const styling = useMemo(
|
||||||
() =>
|
() =>
|
||||||
|
@ -69,6 +70,7 @@ export function JSONTree({
|
||||||
postprocessValue={postprocessValue}
|
postprocessValue={postprocessValue}
|
||||||
collectionLimit={collectionLimit}
|
collectionLimit={collectionLimit}
|
||||||
sortObjectKeys={sortObjectKeys}
|
sortObjectKeys={sortObjectKeys}
|
||||||
|
ArrowComponentOverride={ArrowComponentOverride}
|
||||||
/>
|
/>
|
||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
|
@ -87,4 +89,7 @@ export type {
|
||||||
Styling,
|
Styling,
|
||||||
CommonExternalProps,
|
CommonExternalProps,
|
||||||
} from './types.js';
|
} from './types.js';
|
||||||
|
|
||||||
|
export type { JSONArrowProps } from './JSONArrow.js';
|
||||||
|
|
||||||
export type { StylingValue };
|
export type { StylingValue };
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React, { ComponentType } from 'react';
|
||||||
import { StylingFunction } from 'react-base16-styling';
|
import { StylingFunction } from 'react-base16-styling';
|
||||||
|
import { JSONArrowProps } from './JSONArrow.js';
|
||||||
|
|
||||||
export type Key = string | number;
|
export type Key = string | number;
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ export interface CommonExternalProps {
|
||||||
keyPath: KeyPath;
|
keyPath: KeyPath;
|
||||||
labelRenderer: LabelRenderer;
|
labelRenderer: LabelRenderer;
|
||||||
valueRenderer: ValueRenderer;
|
valueRenderer: ValueRenderer;
|
||||||
|
ArrowComponentOverride?: ComponentType<JSONArrowProps>;
|
||||||
shouldExpandNodeInitially: ShouldExpandNodeInitially;
|
shouldExpandNodeInitially: ShouldExpandNodeInitially;
|
||||||
hideRoot: boolean;
|
hideRoot: boolean;
|
||||||
getItemString: GetItemString;
|
getItemString: GetItemString;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user