@@ -7,7 +7,7 @@ import Grid from "@mui/material/Grid";
77import IconButton from "@mui/material/IconButton" ;
88import Snackbar from "@mui/material/Snackbar" ;
99import Typography from "@mui/material/Typography" ;
10- import React , { useState } from "react" ;
10+ import React , { useState , useRef } from "react" ;
1111import ResultsTable from "./results" ;
1212
1313var equal = require ( "fast-deep-equal/es6/react" ) ;
@@ -17,13 +17,37 @@ function round_floats(a: number[][]) {
1717}
1818
1919export default ( { name, db, question, answer } ) : JSX . Element => {
20- const [ request , setRequest ] = useState ( "" ) ;
20+ const requestRef = useRef ( "" ) ;
21+ const dbRef = useRef ( db ) ;
22+ const answerRef = useRef ( answer ) ;
23+ dbRef . current = db ;
24+ answerRef . current = answer ;
25+
2126 const [ result , setResult ] = useState < null | any [ ] > ( null ) ;
2227 const [ expected , setExpected ] = useState < null | any [ ] > ( null ) ;
2328 const [ verdict , setVerdict ] = useState ( 0 ) ;
2429 const [ error , setError ] = useState ( null ) ;
2530 const [ open , setOpen ] = useState ( false ) ;
2631
32+ const validate = ( ) => {
33+ setOpen ( false ) ;
34+ try {
35+ let exp = dbRef . current . exec ( answerRef . current ) ;
36+ let r = dbRef . current . exec ( requestRef . current ) ;
37+ setResult ( r ) ;
38+ setExpected ( exp ) ;
39+ if ( r . length === 0 )
40+ setVerdict ( 0 ) ;
41+ else
42+ setVerdict ( equal ( round_floats ( r [ 0 ] . values ) , round_floats ( exp [ 0 ] . values ) ) ? 1 : 0 ) ;
43+ setError ( null ) ;
44+ } catch ( err ) {
45+ console . log ( err ) ;
46+ setError ( err . message ) ;
47+ }
48+ setOpen ( true ) ;
49+ } ;
50+
2751 const handleClose = ( _ : React . SyntheticEvent | Event , reason ?: string ) => {
2852 if ( reason === "clickaway" ) {
2953 return ;
@@ -74,7 +98,22 @@ export default ({ name, db, question, answer }): JSX.Element => {
7498 < Editor
7599 height = "13vh"
76100 defaultLanguage = "sql"
77- onChange = { ( e ) => setRequest ( e ) }
101+ onChange = { ( e ) => {
102+ requestRef . current = e || "" ;
103+ } }
104+ onMount = { ( editor , monaco ) => {
105+ editor . addAction ( {
106+ id : 'validate-sql' ,
107+ label : 'Valider la requête' ,
108+ keybindings : [
109+ monaco . KeyMod . CtrlCmd | monaco . KeyCode . Enter
110+ ] ,
111+ run : ( ) => {
112+ requestRef . current = editor . getValue ( ) ;
113+ validate ( ) ;
114+ }
115+ } ) ;
116+ } }
78117 options = { {
79118 lineNumbers : "off" ,
80119 minimap : {
@@ -89,26 +128,9 @@ export default ({ name, db, question, answer }): JSX.Element => {
89128 size = "large"
90129 variant = "contained"
91130 color = "success"
92- onClick = { ( ) => {
93- setOpen ( false ) ;
94- try {
95- let expected = db . exec ( answer ) ;
96- let r = db . exec ( request ) ;
97- setResult ( r ) ;
98- setExpected ( expected ) ;
99- if ( r . length === 0 )
100- setVerdict ( 0 ) ;
101- else
102- setVerdict ( equal ( round_floats ( r [ 0 ] . values ) , round_floats ( expected [ 0 ] . values ) ) ? 1 : 0 ) ;
103- setError ( null ) ;
104- } catch ( err ) {
105- console . log ( err ) ;
106- setError ( err . message ) ;
107- }
108- setOpen ( true ) ;
109- } }
131+ onClick = { validate }
110132 >
111- Valider
133+ OK (Ctrl + Enter)
112134 </ Button >
113135 </ Grid >
114136 </ Grid >
0 commit comments