diff --git a/starter-frontend/src/components/editor/IDEPlugin.tsx b/starter-frontend/src/components/editor/IDEPlugin.tsx index 9936452..ca52b25 100644 --- a/starter-frontend/src/components/editor/IDEPlugin.tsx +++ b/starter-frontend/src/components/editor/IDEPlugin.tsx @@ -24,25 +24,24 @@ export default function IDEPlugin({editor, openIDE, openNewIDE}: PluginRegistrat if (oldDiv !== null) { let newDiv = document.createElement("div"); + newDiv.className = "ide-div"; + + let newPre = document.createElement("pre"); let newCode = document.createElement("code"); + newCode.className = "ide-code"; newCode.dataset.lang = "0"; newCode.id = "active"; - newDiv.appendChild(newCode); - - let newBreak = document.createElement("br"); - newDiv.appendChild(newBreak); + newPre.appendChild(newCode); + newDiv.appendChild(newPre); let newButton = document.createElement("button"); newButton.textContent = "Run in IDE"; - newButton.addEventListener("click", openIDE); + newButton.className = "run-in-ide-btn"; newDiv.appendChild(newButton); editor.dom.replace(newDiv, oldDiv); } - // editor.execCommand('mceInsertContent', false, newCont - // // "


" - // ); openNewIDE(); }, diff --git a/starter-frontend/src/components/editor/TextEditor.tsx b/starter-frontend/src/components/editor/TextEditor.tsx index 471788e..1bf20e7 100644 --- a/starter-frontend/src/components/editor/TextEditor.tsx +++ b/starter-frontend/src/components/editor/TextEditor.tsx @@ -28,23 +28,27 @@ export default function TextEditor({editorRef, initContent, eRoute, setIsLoading setupEditor && setupEditor(editor); }, []); + + return (
" + content} tinymceScriptSrc={process.env.PUBLIC_URL + '/tinymce/tinymce.min.js'} id='editor' licenseKey="gpl" // @ts-ignore - onInit={(_evt, editor) => {editorRef.current = editor}} + onInit={(_evt, editor) => {editorRef.current = editor; + setupIDEButtons(openIDE, editorRef); + }} init={{ height: "calc(100vh - 105px)", width: "auto", resize: false, menubar: false, - extended_valid_elements: 'button[className|onClick]', + extended_valid_elements: 'button[class|className|onClick|onclick|classname]', plugins: [ 'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen', @@ -58,7 +62,7 @@ export default function TextEditor({editorRef, initContent, eRoute, setIsLoading content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }', save_onsavecallback: (): void => { // @ts-ignore - save(setContent, editorRef, eRoute, setIsLoading, setCurrContent) + save(setContent, editorRef, eRoute, setIsLoading, setCurrContent, openIDE) }, setup, ...init, @@ -76,13 +80,14 @@ export default function TextEditor({editorRef, initContent, eRoute, setIsLoading * TO-DO: Implement. */ function save(setContent: React.Dispatch>, editorRef: React.RefObject, eRoute: string, setIsLoading: React.Dispatch>, - setCurrContent: React.Dispatch>): void { + setCurrContent: React.Dispatch>, openIDE: (this: HTMLButtonElement, ev: MouseEvent) => void): void { if (editorRef.current !== null) { const content = editorRef.current.getContent(); setContent(content); setCurrContent(content); doSave(content, eRoute, setIsLoading, setContent, setCurrContent); + setupIDEButtons(openIDE, editorRef); } } @@ -124,3 +129,9 @@ const doSave = async (content: string, route: string, setIsLoading: React.Dispat console.log(e); } } + + +// @ts-ignore +function setupIDEButtons(openIDE, editorRef): void { + editorRef.current.dom.getRoot().addEventListener("click", openIDE); +} diff --git a/starter-frontend/src/components/ide/CodeEditor.tsx b/starter-frontend/src/components/ide/CodeEditor.tsx index 055c9f4..88bda75 100644 --- a/starter-frontend/src/components/ide/CodeEditor.tsx +++ b/starter-frontend/src/components/ide/CodeEditor.tsx @@ -1,25 +1,29 @@ import React, { ChangeEvent, useState } from "react"; import Editor from "@monaco-editor/react"; +import { languageOption } from "./languageOptions"; type CodeEditorProps = { onChange: (action: string, data: string // : ChangeEvent ) => void, - // To-DO: Change to list of options - language: string, - code: string, - // To-do: change to list of options + + code: string, + + setCode: React.Dispatch>; + + language: languageOption, + theme: string }; -export default function CodeEditor( {onChange, language, code, theme}: CodeEditorProps ) { - const [value, setValue] = useState(code || ""); +export default function CodeEditor( {onChange, code, setCode, language, theme}: CodeEditorProps ) { + // const [value, setValue] = useState(code || ""); const handleEditorChange = (value: string | undefined) => { if (typeof value === "undefined") { throw new Error("Editor value is undefined."); } else { - setValue(value); + setCode(value); onChange("code", value); } } @@ -29,8 +33,8 @@ export default function CodeEditor( {onChange, language, code, theme}: CodeEdito diff --git a/starter-frontend/src/components/ide/IDE.tsx b/starter-frontend/src/components/ide/IDE.tsx index 3540d4f..3a00cd6 100644 --- a/starter-frontend/src/components/ide/IDE.tsx +++ b/starter-frontend/src/components/ide/IDE.tsx @@ -10,27 +10,28 @@ import { Editor as TinyMCEEditor } from "tinymce"; type IDEProps = { // Initial code in the IDE - initCode: string, + code: string, - initLang: number, + setCode: React.Dispatch>; + + language: languageOption, + setLanguage: React.Dispatch>, + setIsIDEOpen: React.Dispatch>, editorRef: React.RefObject } -export default function IDE({initCode, initLang, setIsIDEOpen, editorRef}: IDEProps): JSX.Element { - const [code, setCode] = useState(initCode); +export default function IDE({code, setCode, language, setLanguage, setIsIDEOpen, editorRef}: IDEProps): JSX.Element { const [customInput, setCustomInput] = useState(""); const [output, setOutput] = useState(true); const [outputDetails, setOutputDetails] = useState(null); const [processing, setProcessing] = useState(null); - const [language, setLanguage] = useState(languageOptions[initLang]); const [updated, setUpdated] = useState(true); function onSelectChange(sl: languageOption | null): void { - console.log("Selected option ", sl); if (sl !== null) { setLanguage(sl); setUpdated(false); @@ -142,6 +143,7 @@ export default function IDE({initCode, initLang, setIsIDEOpen, editorRef}: IDEPr const langIndex = languageOptions.findIndex(function(obj){return obj.id == language.id}); newCode.dataset.lang = "" + langIndex; newCode.id = "active"; + newCode.className = "ide-code"; editor.dom.replace(newCode, oldCode); } @@ -153,11 +155,12 @@ export default function IDE({initCode, initLang, setIsIDEOpen, editorRef}: IDEPr return (
- + diff --git a/starter-frontend/src/components/ide/LanguagesDropdown.tsx b/starter-frontend/src/components/ide/LanguagesDropdown.tsx index 1f04656..cf96ab8 100644 --- a/starter-frontend/src/components/ide/LanguagesDropdown.tsx +++ b/starter-frontend/src/components/ide/LanguagesDropdown.tsx @@ -7,10 +7,11 @@ import Select, { SingleValue } from "react-select"; import { languageOptions, languageOption } from "./languageOptions"; type LanguagesDropdownProps = { - onSelectChange: (sl: languageOption | null) => void + onSelectChange: (sl: languageOption | null) => void, + language: languageOption } -export default function LanguagesDropdown( { onSelectChange }: LanguagesDropdownProps ): JSX.Element { +export default function LanguagesDropdown( { onSelectChange, language }: LanguagesDropdownProps ): JSX.Element { const customStyles = { control: (provided, state) => ({ ...provided, @@ -46,7 +47,8 @@ export default function LanguagesDropdown( { onSelectChange }: LanguagesDropdown return (