import { useState, useCallback, useContext } from 'react' import PropTypes from 'prop-types' import { Flex, Alert, Card, Spin, Splitter, Button, Modal, Segmented, Popover, Typography } from 'antd' import { LoadingOutlined, CaretDownOutlined } from '@ant-design/icons' import ExclamationOctagonIcon from '../../Icons/ExclamationOctagonIcon.jsx' import CheckCircleIcon from '../../Icons/CheckCircleIcon.jsx' import MagicWandIcon from '../../Icons/MagicWandIcon.jsx' import ObjectProperty from '../common/ObjectProperty.jsx' import TemplatePreview from './TemplatePreview.jsx' import DataTree from './DataTree.jsx' import { ApiServerContext } from '../context/ApiServerContext.jsx' const { Text } = Typography const monoStyle = { whiteSpace: 'pre', display: 'block', fontFamily: 'monospace' } const EJSErrorFormatter = ({ message }) => { const renderLine = (line, index) => { const errorLineMatch = line.match(/^(\s*)>>\s*(\d+)\|(.*)$/) if (errorLineMatch) { const [, indent, lineNum, content] = errorLineMatch return ( {indent} {'>>'} {lineNum}| {content || '\u00A0'} ) } const contextLineMatch = line.match(/^(\s+)(\d+)\|(.*)$/) if (contextLineMatch) { const [, indent, lineNum, content] = contextLineMatch return ( {indent} {lineNum}|{content || '\u00A0'} ) } if (/^ejs:\d+/.test(line)) { return ( {line} ) } return ( {line || '\u00A0'} ) } return {message.split('\n').map(renderLine)} } EJSErrorFormatter.propTypes = { message: PropTypes.string.isRequired } const parseEjsErrorLines = (message) => { if (!message || typeof message !== 'string') { return [] } const lines = new Set() const headerMatch = message.match(/^ejs:(\d+)/m) if (headerMatch) { lines.add(Number(headerMatch[1])) } for (const match of message.matchAll(/^\s*>>\s*(\d+)\|/gm)) { lines.add(Number(match[1])) } return [...lines] } const TemplateEditor = ({ objectData, loading, collapseState, isEditing, style, form, setObjectData }) => { const { fetchTemplateFormat } = useContext(ApiServerContext) const [testObjectOpen, setTestObjectOpen] = useState(false) const [testObjectViewMode, setTestObjectViewMode] = useState('Tree') const [previewMessage, setPreviewMessage] = useState('No issues found.') const [previewError, setPreviewError] = useState(false) const [errorLines, setErrorLines] = useState([]) const [formatLoading, setFormatLoading] = useState(false) //const isMobile = useMediaQuery({ maxWidth: 768 }) const handlePreviewMessage = useCallback((message, isError) => { if (isError) { setPreviewMessage( Compile error. } trigger={['hover', 'click']} placement='bottomRight' arrow={false} overlayStyle={{ minWidth: '560px' }} > } >
setTestObjectViewMode(value)} size='small' />
{testObjectViewMode == 'Code' && ( )} {testObjectViewMode == 'Tree' && ( )}
) } TemplateEditor.propTypes = { loading: PropTypes.bool, objectData: PropTypes.object, collapseState: PropTypes.object, isEditing: PropTypes.bool, style: PropTypes.object, form: PropTypes.object, setObjectData: PropTypes.func } export default TemplateEditor