Skip to content
Snippets Groups Projects
Unverified Commit 56bf17f8 authored by JUST.in DO IT's avatar JUST.in DO IT Committed by GitHub
Browse files

fix(sqllab): Invalid display of table column keys (#32763)

parent b92909d6
Branches
No related tags found
No related merge requests found
...@@ -42,6 +42,21 @@ test('renders JSON object in a tree view in a modal', () => { ...@@ -42,6 +42,21 @@ test('renders JSON object in a tree view in a modal', () => {
expect(getByTestId('mock-json-tree')).toBeInTheDocument(); expect(getByTestId('mock-json-tree')).toBeInTheDocument();
}); });
test('renders an object in a tree view in a modal', () => {
const jsonData = { a: 1 };
const expected = JSON.stringify(jsonData);
const { getByText, getByTestId, queryByTestId } = render(
<JsonModal jsonObject={jsonData} jsonValue={jsonData} modalTitle="title" />,
{
useRedux: true,
},
);
expect(queryByTestId('mock-json-tree')).not.toBeInTheDocument();
const link = getByText(expected);
fireEvent.click(link);
expect(getByTestId('mock-json-tree')).toBeInTheDocument();
});
test('renders bigInt value in a number format', () => { test('renders bigInt value in a number format', () => {
expect(convertBigIntStrToNumber('123')).toBe('123'); expect(convertBigIntStrToNumber('123')).toBe('123');
expect(convertBigIntStrToNumber('some string value')).toBe( expect(convertBigIntStrToNumber('some string value')).toBe(
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* under the License. * under the License.
*/ */
import JSONbig from 'json-bigint'; import JSONbig from 'json-bigint';
import { FC } from 'react'; import { FC, useMemo } from 'react';
import { JSONTree } from 'react-json-tree'; import { JSONTree } from 'react-json-tree';
import { useJsonTreeTheme } from 'src/hooks/useJsonTreeTheme'; import { useJsonTreeTheme } from 'src/hooks/useJsonTreeTheme';
import Button from '../Button'; import Button from '../Button';
...@@ -46,6 +46,10 @@ import ModalTrigger from '../ModalTrigger'; ...@@ -46,6 +46,10 @@ import ModalTrigger from '../ModalTrigger';
export function safeJsonObjectParse( export function safeJsonObjectParse(
data: unknown, data: unknown,
): null | unknown[] | Record<string, unknown> { ): null | unknown[] | Record<string, unknown> {
if (typeof data === 'object') {
return data as null | unknown[] | Record<string, unknown>;
}
// First perform a cheap proxy to avoid calling JSON.parse on data that is clearly not a // First perform a cheap proxy to avoid calling JSON.parse on data that is clearly not a
// JSON object or array // JSON object or array
if ( if (
...@@ -78,7 +82,7 @@ function renderBigIntStrToNumber(value: string | number) { ...@@ -78,7 +82,7 @@ function renderBigIntStrToNumber(value: string | number) {
return <>{convertBigIntStrToNumber(value)}</>; return <>{convertBigIntStrToNumber(value)}</>;
} }
type CellDataType = string | number | null; type CellDataType = string | number | null | object;
export interface Props { export interface Props {
modalTitle: string; modalTitle: string;
...@@ -88,6 +92,11 @@ export interface Props { ...@@ -88,6 +92,11 @@ export interface Props {
export const JsonModal: FC<Props> = ({ modalTitle, jsonObject, jsonValue }) => { export const JsonModal: FC<Props> = ({ modalTitle, jsonObject, jsonValue }) => {
const jsonTreeTheme = useJsonTreeTheme(); const jsonTreeTheme = useJsonTreeTheme();
const content = useMemo(
() =>
typeof jsonValue === 'object' ? JSON.stringify(jsonValue) : jsonValue,
[jsonValue],
);
return ( return (
<ModalTrigger <ModalTrigger
...@@ -100,11 +109,11 @@ export const JsonModal: FC<Props> = ({ modalTitle, jsonObject, jsonValue }) => { ...@@ -100,11 +109,11 @@ export const JsonModal: FC<Props> = ({ modalTitle, jsonObject, jsonValue }) => {
} }
modalFooter={ modalFooter={
<Button> <Button>
<CopyToClipboard shouldShowText={false} text={jsonValue} /> <CopyToClipboard shouldShowText={false} text={content} />
</Button> </Button>
} }
modalTitle={modalTitle} modalTitle={modalTitle}
triggerNode={<>{jsonValue}</>} triggerNode={<>{content}</>}
/> />
); );
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment