pgadmin4/web/pgadmin/static/js/components/JsonEditor.jsx

73 lines
2.0 KiB
JavaScript

/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2025, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React, { useEffect, useMemo, useRef } from 'react';
import { createJSONEditor } from 'vanilla-jsoneditor';
import PropTypes from 'prop-types';
import CustomPropTypes from '../custom_prop_types';
/* React wrapper for JsonEditor */
export default function JsonEditor({setJsonEditorSize, value, options, className}) {
const eleRef = useRef();
const editor = useRef();
const defaultOptions = {
mode: 'text',
};
const currentMode = useRef(defaultOptions.mode);
useEffect(()=>{
/* Create the object only once on mount */
editor.current = createJSONEditor({
target: eleRef.current,
props:{
...defaultOptions,
...options,
onChange: (updatedContent) => {
options.onChange(currentMode.current == 'text' ? updatedContent.text : JSON.stringify(updatedContent.json));
options.onValidationError(editor.current.validate());
},
onChangeMode: (mode) => {
currentMode.current = mode;
setJsonEditorSize?.(eleRef.current);
}
}
});
editor.current.set({text: value});
setJsonEditorSize?.(eleRef.current);
editor.current.focus();
return () => {
// destroy editor
if (editor.current) {
editor.current.destroy();
editor.current = null;
}
};
}, []);
useMemo(() => {
if(editor.current) {
if(value != editor.current.get()[currentMode.current]) {
editor.current.update({text: value});
}
}
}, [value]);
return (
<div ref={eleRef} className={className}></div>
);
}
JsonEditor.propTypes = {
setJsonEditorSize: PropTypes.func,
value: PropTypes.string,
options: PropTypes.object,
className: CustomPropTypes.className,
};