Skip to content

Commit d206c35

Browse files
committed
fix: fix onDelete props issue. (#6)
1 parent bcaa21d commit d206c35

File tree

10 files changed

+200
-165
lines changed

10 files changed

+200
-165
lines changed

core/README.md

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -280,47 +280,6 @@ export default function Demo() {
280280

281281
## Render
282282

283-
```tsx mdx:preview
284-
import React from 'react';
285-
import JsonView from '@uiw/react-json-view';
286-
287-
const object = {
288-
string: 'Lorem ipsum dolor sit amet',
289-
integer: 42,
290-
float: 114.514,
291-
object: {
292-
'first-child': true,
293-
'second-child': false,
294-
'last-child': null,
295-
},
296-
}
297-
export default function Demo() {
298-
return (
299-
<JsonView
300-
value={object}
301-
keyName="root"
302-
quotes=""
303-
displayObjectSize={false}
304-
displayDataTypes={false}
305-
style={{
306-
'--w-rjv-background-color': '#ffffff',
307-
'--w-rjv-border-left-width': '0',
308-
}}
309-
components={{
310-
braces: () => <span />,
311-
ellipsis: () => <React.Fragment />,
312-
objectKey: ({ value, keyName, parentName, ...props}) => {
313-
if (keyName === 'integer' && typeof value === 'number' && value > 40) {
314-
return <del {...props} />
315-
}
316-
return <span {...props} />
317-
}
318-
}}
319-
/>
320-
)
321-
}
322-
```
323-
324283
**Preview Picture**
325284

326285
```tsx mdx:preview
@@ -333,7 +292,7 @@ const object = {
333292
integer: 42,
334293
}
335294

336-
function value({ type, children, value, setValue, keyName, visible, ...props }) {
295+
function value({ type, children, value, setValue, keyName, parentValue, visible, ...props }) {
337296
if (type === 'string' && /\.(jpg)$/.test(value)) {
338297
return (
339298
<span {...props}>
@@ -386,7 +345,7 @@ export default function Demo() {
386345
import React from 'react';
387346
import JsonView from '@uiw/react-json-view';
388347

389-
function value({ type, children, visible, keyName, value, setValue, ...props }) {
348+
function value({ type, children, visible, keyName, parentValue, value, setValue, ...props }) {
390349
if (value instanceof URL) {
391350
return (
392351
<span {...props}>
@@ -513,7 +472,7 @@ const object = {
513472
nestedArray: [ [1, 2], [3, 4], { a: 1} ],
514473
}
515474

516-
const ObjectKey = ({ value, keyName, parentName, ...reset }) => {
475+
const ObjectKey = ({ value, keyName, parentName, parentValue, ...reset }) => {
517476
if (keyName === 'integer' && typeof value === 'number' && value > 40) {
518477
return <del {...reset} />
519478
}
@@ -731,12 +690,23 @@ export interface JsonViewProps<T> extends React.DetailedHTMLProps<React.HTMLAttr
731690
ellipsis?: EllipsisProps['render'];
732691
arrow?: JSX.Element;
733692
objectKey?: SemicolonProps['render'];
734-
value?: ValueViewProps<T>['renderValue'];
693+
value?: (props: RenderValueProps<T>) => JSX.Element;
735694
copied?: CopiedProps<T>['render'];
736695
countInfo?: (props: CountInfoProps) => JSX.Element;
737696
countInfoExtra?: (props: Omit<CountInfoExtraProps<T>, 'editable'>) => JSX.Element;
738697
};
739698
}
699+
interface RenderValueProps<T extends object> extends React.HTMLAttributes<HTMLSpanElement> {
700+
type: TypeProps['type'];
701+
value?: unknown;
702+
parentValue?: T;
703+
data?: T;
704+
visible?: boolean;
705+
quotes?: JsonViewProps<T>['quotes'];
706+
namespace?: Array<string | number>;
707+
setValue?: React.Dispatch<React.SetStateAction<T>>;
708+
keyName?: ValueViewProps<T>['keyName'];
709+
}
740710
declare const JsonView: React.ForwardRefExoticComponent<Omit<JsonViewProps<object>, "ref"> & React.RefAttributes<HTMLDivElement>>;
741711
export default JsonView;
742712
export interface CountInfoProps {

core/src/editor/countInfoExtra.tsx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,40 @@ export interface CountInfoExtraProps<T> extends Partial<CountInfoProps> {
99
value: T;
1010
parentValue?: T;
1111
keyName?: string | number;
12-
setValue?: React.Dispatch<React.SetStateAction<T>>
13-
setParentValue?: React.Dispatch<React.SetStateAction<T>>
12+
namespace?: Array<string | number>;
13+
setValue?: React.Dispatch<React.SetStateAction<T>>;
14+
setParentValue?: React.Dispatch<React.SetStateAction<T>>;
1415
/**
1516
* When a callback function is passed in, add functionality is enabled. The callback is invoked before additions are completed.
1617
* @returns {boolean} Returning false from onAdd will prevent the change from being made.
1718
*/
1819
onAdd?: (keyOrValue: string, newValue: T, value: T, isAdd: boolean) => boolean;
1920
/**
20-
* When a callback function is passed in, delete functionality is enabled. The callback is invoked before deletions are completed.
21-
* @returns Returning false from onDelete will prevent the change from being made.
21+
* When a callback function is passed in, delete functionality is enabled. The callback is invoked before deletions are completed.
22+
* @returns Returning false from onDelete will prevent the change from being made.
2223
*/
23-
onDelete?: (keyName: string | number, value: T, parentValue: T) => boolean;
24+
onDelete?: (
25+
keyName: string | number,
26+
value: T,
27+
parentValue: T | null,
28+
opt: { namespace?: Array<string | number> },
29+
) => boolean;
2430
}
2531

2632
export function CountInfoExtra<T extends object>(props: CountInfoExtraProps<T>) {
27-
const { visible, showTools, editable, keyName, value, parentValue, setValue, setParentValue, onAdd, onDelete } = props;
33+
const {
34+
visible,
35+
showTools,
36+
editable,
37+
keyName,
38+
value,
39+
namespace,
40+
parentValue,
41+
setValue,
42+
setParentValue,
43+
onAdd,
44+
onDelete,
45+
} = props;
2846
if (!visible || !showTools) return null;
2947
const click = async (event: React.MouseEvent<SVGSVGElement, MouseEvent>) => {
3048
event.stopPropagation();
@@ -38,25 +56,25 @@ export function CountInfoExtra<T extends object>(props: CountInfoExtraProps<T>)
3856
setValue!(result as T);
3957
}
4058
}
41-
}
59+
};
4260
const deleteHandle = async (event: React.MouseEvent<SVGSVGElement, MouseEvent>) => {
4361
event.stopPropagation();
4462
if (onDelete && (keyName || typeof keyName === 'number') && parentValue) {
45-
const maybeDelete = await onDelete(keyName, value, parentValue as T);
63+
const maybeDelete = await onDelete(keyName, value, parentValue as T, { namespace });
4664
if (maybeDelete && setParentValue) {
4765
if (Array.isArray(parentValue)) {
4866
parentValue.splice(keyName as number, 1);
4967
setParentValue([...parentValue] as T);
5068
} else if (keyName in parentValue) {
5169
delete (parentValue as Record<string, any>)[keyName as string];
52-
setParentValue({...parentValue} as T);
70+
setParentValue({ ...parentValue } as T);
5371
}
5472
}
5573
}
56-
}
74+
};
5775
return (
5876
<Fragment>
59-
{editable && onAdd && <AddIcon onClick={click}/>}
77+
{editable && onAdd && <AddIcon onClick={click} />}
6078
{editable && onDelete && parentValue && <DeleteIcon onClick={deleteHandle} />}
6179
</Fragment>
6280
);

core/src/editor/value.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface ReValueProps<T extends object> extends React.HTMLAttributes<HTM
2121
keyName?: JsonViewEditorProps<T>['keyName'];
2222
type: TypeProps['type'];
2323
value?: unknown;
24+
parentValue?: T;
2425
data?: T;
2526
visible?: boolean;
2627
namespace?: Array<string | number>;
@@ -44,6 +45,7 @@ export function ReValue<T extends object>(props: ReValueProps<T>) {
4445
namespace,
4546
displayDataTypes,
4647
editableValue,
48+
parentValue,
4749
onDelete,
4850
onEdit,
4951
...reset
@@ -116,7 +118,7 @@ export function ReValue<T extends object>(props: ReValueProps<T>) {
116118
const result = await onEdit({ type: 'value', value: text, oldValue: curentChild, namespace });
117119
if (result) {
118120
setCurentType(typeStr);
119-
setCurentChild(text);
121+
setCurentChild(text as T);
120122
} else {
121123
const { content: oldChildStr } = getValueString(curentChild);
122124
$edit.current.innerHTML = String(oldChildStr);
@@ -145,9 +147,12 @@ export function ReValue<T extends object>(props: ReValueProps<T>) {
145147
}
146148
const deleteHandle = async (evn: React.MouseEvent<SVGSVGElement, MouseEvent>) => {
147149
evn.stopPropagation();
148-
if (data && keyName && keyName in data && setValue) {
149-
delete (data as Record<string, any>)[keyName as string];
150-
setValue({ ...data } as T);
150+
if (data && keyName && keyName in data && setValue && onDelete) {
151+
const maybeDelete = await onDelete(keyName, value as T, parentValue as T, { namespace });
152+
if (maybeDelete) {
153+
delete (data as Record<string, any>)[keyName as string];
154+
setValue({ ...data } as T);
155+
}
151156
}
152157
};
153158
return (

core/src/index.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useId } from 'react';
22
import { forwardRef } from 'react';
33
import { RooNode } from './node';
44
import type { SemicolonProps } from './semicolon';
5-
import type { ValueViewProps } from './value';
5+
import type { ValueViewProps, TypeProps } from './value';
66
import type { CopiedProps } from './copied';
77
import type { EllipsisProps } from './comps/ellipsis';
88
import type { MetaProps } from './comps/meta';
@@ -17,6 +17,18 @@ export interface CountInfoProps {
1717
visible: boolean;
1818
}
1919

20+
interface RenderValueProps<T extends object> extends React.HTMLAttributes<HTMLSpanElement> {
21+
type: TypeProps['type'];
22+
value?: unknown;
23+
parentValue?: T;
24+
data?: T;
25+
visible?: boolean;
26+
quotes?: JsonViewProps<T>['quotes'];
27+
namespace?: Array<string | number>;
28+
setValue?: React.Dispatch<React.SetStateAction<T>>;
29+
keyName?: ValueViewProps<T>['keyName'];
30+
}
31+
2032
export interface JsonViewProps<T extends object>
2133
extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> {
2234
/** This property contains your input JSON */
@@ -40,7 +52,7 @@ export interface JsonViewProps<T extends object>
4052
/** When set to true, all nodes will be collapsed by default. Use an integer value to collapse at a particular depth. @default false */
4153
collapsed?: boolean | number;
4254
/** Callback function for when a treeNode is expanded or collapsed */
43-
onExpand?: (props: { expand: boolean; value: T; keyid: string; keyName?: string | number; }) => void;
55+
onExpand?: (props: { expand: boolean; value: T; keyid: string; keyName?: string | number }) => void;
4456
/** Fires event when you copy */
4557
onCopied?: CopiedProps<T>['onCopied'];
4658
/** Redefine interface elements to re-render. */
@@ -49,7 +61,7 @@ export interface JsonViewProps<T extends object>
4961
ellipsis?: EllipsisProps['render'];
5062
arrow?: JSX.Element;
5163
objectKey?: SemicolonProps['render'];
52-
value?: ValueViewProps<T>['renderValue'];
64+
value?: (props: RenderValueProps<T>) => JSX.Element;
5365
copied?: CopiedProps<T>['render'];
5466
countInfo?: (props: CountInfoProps) => JSX.Element;
5567
countInfoExtra?: (props: Omit<CountInfoExtraProps<T>, 'editable'>) => JSX.Element;

0 commit comments

Comments
 (0)