1
0
mirror of https://github.com/sasjs/server.git synced 2025-12-11 11:44:34 +00:00

feat(studio): run selected code + open in studio

This commit is contained in:
Saad Jutt
2021-12-16 12:14:32 +05:00
parent da11c03d55
commit 27129a8921
7 changed files with 204 additions and 14 deletions

View File

@@ -1,4 +1,5 @@
import React, { useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import axios from 'axios'
import Editor from '@monaco-editor/react'
@@ -89,10 +90,10 @@ const Main = (props: any) => {
style={{ position: 'absolute', left: '50%', top: '50%' }}
/>
)}
{!isLoading && props?.selectedFilePath !== '' && !editMode && (
{!isLoading && props?.selectedFilePath && !editMode && (
<code style={{ whiteSpace: 'break-spaces' }}>{fileContent}</code>
)}
{!isLoading && props?.selectedFilePath !== '' && editMode && (
{!isLoading && props?.selectedFilePath && editMode && (
<Editor
height="95%"
value={fileContent}
@@ -110,17 +111,26 @@ const Main = (props: any) => {
<Button
variant="contained"
onClick={handleEditSaveBtnClick}
disabled={isLoading || props?.selectedFilePath === ''}
disabled={isLoading || !props?.selectedFilePath}
>
{!editMode ? 'Edit' : 'Save'}
</Button>
<Button
variant="contained"
onClick={handleCancelExecuteBtnClick}
disabled={isLoading || props?.selectedFilePath === ''}
disabled={isLoading || !props?.selectedFilePath}
>
{editMode ? 'Cancel' : 'Execute'}
</Button>
{props?.selectedFilePath && (
<Button
variant="contained"
component={Link}
to={`/SASjsStudio?_program=${props.selectedFilePath}`}
>
Open in Studio
</Button>
)}
</Stack>
</Box>
)

View File

@@ -1,13 +1,84 @@
import React from 'react'
import React, { useEffect, useRef, useState } from 'react'
import axios from 'axios'
import CssBaseline from '@mui/material/CssBaseline'
import Box from '@mui/material/Box'
import { Button, Paper, Stack, Toolbar } from '@mui/material'
import Editor from '@monaco-editor/react'
import { useLocation } from 'react-router-dom'
const Studio = () => {
const location = useLocation()
const [fileContent, setFileContent] = useState('')
const [log, setLog] = useState('')
const editorRef = useRef(null)
const handleEditorDidMount = (editor: any) => (editorRef.current = editor)
const getSelection = () => {
const editor = editorRef.current as any
const selection = editor?.getModel().getValueInRange(editor?.getSelection())
return selection ?? ''
}
const handleRunSelectionBtnClick = () => runCode(getSelection())
const handleRunBtnClick = () => runCode(fileContent)
const runCode = (code: string) => {
axios
.post(`/SASjsApi/stp/run`, { code })
.then((res: any) => {
setLog(res.data)
document?.getElementById('sas_log')?.scrollIntoView()
})
.catch((err) => console.log(err))
}
useEffect(() => {
const params = new URLSearchParams(location.search)
const programPath = params.get('_program')
if (programPath?.length)
axios
.get(`/SASjsApi/drive/file?filePath=${programPath}`)
.then((res: any) => setFileContent(res.data.fileContent))
.catch((err) => console.log(err))
}, [location.search])
return (
<Box className="main">
<CssBaseline />
<h2>This is container for SASjs studio</h2>
<Box component="main" sx={{ flexGrow: 1, p: 3 }}>
<Toolbar />
<Paper
sx={{
height: '75vh',
padding: '10px',
overflow: 'auto',
position: 'relative'
}}
elevation={3}
>
<Editor
height="95%"
value={fileContent}
onMount={handleEditorDidMount}
onChange={(val) => {
if (val) setFileContent(val)
}}
/>
</Paper>
<Stack
spacing={3}
direction="row"
sx={{ justifyContent: 'center', marginTop: '20px' }}
>
<Button variant="contained" onClick={handleRunBtnClick}>
Run SAS Code
</Button>
<Button variant="contained" onClick={handleRunSelectionBtnClick}>
Run Selected SAS Code
</Button>
</Stack>
{log && <div id="sas_log" dangerouslySetInnerHTML={{ __html: log }} />}
</Box>
)
}