diff --git a/Source/Plugins/Core/com.equella.core/js/package-lock.json b/Source/Plugins/Core/com.equella.core/js/package-lock.json index 41f352bf21..12c49595e4 100644 --- a/Source/Plugins/Core/com.equella.core/js/package-lock.json +++ b/Source/Plugins/Core/com.equella.core/js/package-lock.json @@ -1199,12 +1199,38 @@ "@babel/types": "^7.3.0" } }, + "@types/domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha512-cfBw6q6tT5sa1gSPFSRKzF/xxYrrmeiut7E0TxNBObiLSBTuFEHibcfEe3waQPEDbqBsq+ql/TOniw65EyDFMA==", + "dev": true + }, + "@types/domutils": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@types/domutils/-/domutils-1.7.2.tgz", + "integrity": "sha512-Nnwy1Ztwq42SSNSZSh9EXBJGrOZPR+PQ2sRT4VZy8hnsFXfCil7YlKO2hd2360HyrtFz2qwnKQ13ENrgXNxJbw==", + "dev": true, + "requires": { + "@types/domhandler": "*" + } + }, "@types/history": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.2.tgz", "integrity": "sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q==", "dev": true }, + "@types/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@types/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-fCxmHS4ryCUCfV9+CJZY1UjkbR+6Al/EQdX5Jh03qBj9gdlPG5q+7uNoDgE/ZNXb3XNWSAQgqKIWnbRCbOyyWA==", + "dev": true, + "requires": { + "@types/domhandler": "*", + "@types/domutils": "*", + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1318,6 +1344,16 @@ "@types/react": "*" } }, + "@types/react-html-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/react-html-parser/-/react-html-parser-2.0.1.tgz", + "integrity": "sha512-Lyw0AtG3gahw78CX2pzmzhKaoZCfJNzzuhhPsFVhzFrylMv8NaCmzYaPKglMv3RRHpwBbHuMOkVx0HiwGZKgSA==", + "dev": true, + "requires": { + "@types/htmlparser2": "*", + "@types/react": "*" + } + }, "@types/react-redux": { "version": "5.0.21", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-5.0.21.tgz", @@ -8699,6 +8735,14 @@ "warning": "^4.0.1" } }, + "react-html-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-html-parser/-/react-html-parser-2.0.2.tgz", + "integrity": "sha512-XeerLwCVjTs3njZcgCOeDUqLgNIt/t+6Jgi5/qPsO/krUWl76kWKXMeVs2LhY2gwM6X378DkhLjur0zUQdpz0g==", + "requires": { + "htmlparser2": "^3.9.0" + } + }, "react-is": { "version": "16.8.4", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", diff --git a/Source/Plugins/Core/com.equella.core/js/package.json b/Source/Plugins/Core/com.equella.core/js/package.json index 565b8d25f0..35ea5f39ce 100644 --- a/Source/Plugins/Core/com.equella.core/js/package.json +++ b/Source/Plugins/Core/com.equella.core/js/package.json @@ -50,6 +50,7 @@ "react-beautiful-dnd": "7.1.3", "react-color": "2.17.0", "react-dom": "16.8.4", + "react-html-parser": "2.0.2", "react-redux": "5.1.1", "react-router": "5.0.0", "react-router-dom": "5.0.0", @@ -71,20 +72,21 @@ "license": "Apache-2.0", "devDependencies": { "@types/jest": "22.2.3", - "@types/luxon": "1.15.1", "@types/lodash": "4.14.144", - "@types/tinymce": "4.5.23", + "@types/luxon": "1.15.1", "@types/node": "9.6.52", "@types/react": "16.9.11", "@types/react-autosuggest": "9.3.11", "@types/react-color": "2.17.0", "@types/react-dom": "16.9.5", + "@types/react-html-parser": "2.0.1", "@types/react-redux": "5.0.21", "@types/react-router": "5.1.1", "@types/react-router-dom": "4.3.5", "@types/react-swipeable-views": "0.12.2", "@types/redux-logger": "3.0.7", "@types/sprintf-js": "1.1.2", + "@types/tinymce": "4.5.23", "@types/uuid": "3.4.4", "argparse": "1.0.10", "combined-stream2": "1.1.2", diff --git a/Source/Plugins/Core/com.equella.core/js/tsrc/mainui/index.tsx b/Source/Plugins/Core/com.equella.core/js/tsrc/mainui/index.tsx index 08e95ddcf0..5398ac3e91 100644 --- a/Source/Plugins/Core/com.equella.core/js/tsrc/mainui/index.tsx +++ b/Source/Plugins/Core/com.equella.core/js/tsrc/mainui/index.tsx @@ -26,6 +26,7 @@ import { LegacyContentProps, PageContent } from "../legacycontent/LegacyContent"; +import HtmlParser from "react-html-parser"; import { getCurrentUser } from "../api/currentuser"; import { ErrorResponse } from "../api/errors"; import ErrorPage from "./ErrorPage"; @@ -108,9 +109,7 @@ function IndexPage() { }, []); const oeqRoutes: { [key: string]: OEQRoute } = routes; - function mkRouteProps( - p: RouteComponentProps - ): OEQRouteComponentProps { + function mkRouteProps(p: RouteComponentProps): OEQRouteComponentProps { return { ...p, updateTemplate, @@ -218,11 +217,20 @@ function IndexPage() { {routeSwitch(content)} ); - return !content || content.noForm ? ( - template - ) : ( - {template} - ); + const render = () => { + if (!content || content.noForm) { + return template; + } else { + const { form } = content.html; + return ( + <> + {template} + {form && HtmlParser(form)} + + ); + } + }; + return render(); }} /> diff --git a/Source/Plugins/Core/com.equella.core/scalasrc/com/tle/web/api/LegacyContentApi.scala b/Source/Plugins/Core/com.equella.core/scalasrc/com/tle/web/api/LegacyContentApi.scala index 93d20b1b70..cef06595c9 100644 --- a/Source/Plugins/Core/com.equella.core/scalasrc/com/tle/web/api/LegacyContentApi.scala +++ b/Source/Plugins/Core/com.equella.core/scalasrc/com/tle/web/api/LegacyContentApi.scala @@ -491,6 +491,11 @@ class LegacyContentApi { val body = SectionUtils.renderToString( context, wrapBody(context, tr.getNamedResult(context, "body"))) + val form = context.getForm + val formString: Option[String] = Option(form.getAction) match { + case Some(action) => Some(SectionUtils.renderToString(context, form)) + case None => None + } val upperbody = SectionUtils.renderToString(context, tr.getNamedResult(context, "upperbody")) val scrops = renderScreenOptions(context) @@ -498,6 +503,7 @@ class LegacyContentApi { Iterable( Some("body" -> body), Option(upperbody).filter(_.nonEmpty).map("upperbody" -> _), + formString.map("form" -> _), scrops.map("so" -> _), crumbs.map("crumbs" -> _) ).flatten.toMap