blob: 3a95e66f14f8c9228740486cf178d98ae1de3eff [file] [log] [blame]
import {
Button, Drawer, Select, Space,
} from 'antd';
import React, { useState, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import CodeMirror from '../editor/containers/CodeMirrorWapperContainer';
import BuilderSelection from './BuilderSelection';
import KeyWordFinder from '../../features/query_builder/KeyWordFinder';
import { setCommand } from '../../features/editor/EditorSlice';
import './BuilderContainer.scss';
const BuilderContainer = ({ open, setOpen, finder }) => {
const [query, setQuery] = useState('');
const [currentWord, setCurrentWord] = useState('');
const [selectedGraph, setSelectedGraph] = useState('');
const [availableGraphs, setAvailableGraphs] = useState([]);
const metadata = useSelector((state) => state.metadata);
const dispatch = useDispatch();
useEffect(() => {
setAvailableGraphs(Object.keys(metadata.graphs));
}, [metadata]);
const getCurrentWord = (q) => {
const words = q.split(/[ ,\n]/);
const isWord = words.findLast((element) => finder.hasWord(element));
const word = isWord || '';
setCurrentWord(word);
};
const handleSetQuery = (word) => {
const fullQuery = query !== '' ? `${query.trim()}\n${word}` : word;
setQuery(fullQuery);
getCurrentWord(fullQuery);
};
const handleSelectGraph = (s) => {
setSelectedGraph(s);
};
const handleSubmit = () => {
const finalQuery = `SELECT * FROM cypher('${selectedGraph}', $$ ${query} $$) as (V agtype)`;
dispatch((setCommand(finalQuery)));
setOpen(false);
};
return (
<Drawer
title="Query Generator"
open={open}
onClose={() => setOpen(!open)}
placement="left"
>
<Select
id="graph-selection"
onChange={handleSelectGraph}
placeholder="Select Graph"
value={selectedGraph}
>
{
availableGraphs.map((s) => (
<Select.Option
value={s}
/>
))
}
</Select>
<Space />
<div className="code-mirror-builder">
<CodeMirror onChange={handleSetQuery} value={query} />
</div>
<Space />
<div className="selection-builder">
<BuilderSelection
finder={finder}
setQuery={handleSetQuery}
currentWord={currentWord}
/>
</div>
<div id="submit-builder">
<Button size="sm" onClick={handleSubmit}>Submit</Button>
</div>
</Drawer>
);
};
BuilderContainer.propTypes = {
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
finder: PropTypes.shape(KeyWordFinder).isRequired,
};
export default BuilderContainer;