diff --git a/report-ui/src/components/MonacoEditor/index.vue b/report-ui/src/components/MonacoEditor/index.vue
new file mode 100644
index 00000000..8f5325b1
--- /dev/null
+++ b/report-ui/src/components/MonacoEditor/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
diff --git a/report-ui/src/components/MonacoEditor/util/javascript-completion.js b/report-ui/src/components/MonacoEditor/util/javascript-completion.js
new file mode 100644
index 00000000..3999cc29
--- /dev/null
+++ b/report-ui/src/components/MonacoEditor/util/javascript-completion.js
@@ -0,0 +1,38 @@
+import * as monaco from 'monaco-editor'
+// js 有内置提示
+function createCompleter(getExtraHints) {
+ const createSuggestions = function (model, textUntilPosition) {
+ let text = model.getValue();
+ textUntilPosition = textUntilPosition.replace(/[\*\[\]@\$\(\)]/g, "").replace(/(\s+|\.)/g, " ");
+ let arr = textUntilPosition.split(/[\s;]/);
+ let activeStr = arr[arr.length - 1];
+ let len = activeStr.length;
+ let rexp = new RegExp("([^\\w]|^)" + activeStr + "\\w*", "gim");
+ let match = text.match(rexp);
+ let mergeHints = Array.from(new Set([...getExtraHints(model)]))
+ .sort()
+ .filter(ele => {
+ let rexp = new RegExp(ele.substr(0, len), "gim");
+ return (match && match.length === 1 && ele === activeStr) ||
+ ele.length === 1 ? false : activeStr.match(rexp);
+ });
+ return mergeHints.map(ele => ({
+ label: ele,
+ kind: monaco.languages.CompletionItemKind.Text,
+ documentation: ele,
+ insertText: ele
+ }));
+ };
+ return {
+ provideCompletionItems(model, position) {
+ let textUntilPosition = model.getValueInRange({
+ startLineNumber: position.lineNumber,
+ startColumn: 1,
+ endLineNumber: position.lineNumber,
+ endColumn: position.column
+ });
+ return { suggestions: createSuggestions(model, textUntilPosition) };
+ }
+ }
+}
+export default createCompleter;
\ No newline at end of file
diff --git a/report-ui/src/components/MonacoEditor/util/log-language.js b/report-ui/src/components/MonacoEditor/util/log-language.js
new file mode 100644
index 00000000..a3db9c6b
--- /dev/null
+++ b/report-ui/src/components/MonacoEditor/util/log-language.js
@@ -0,0 +1,58 @@
+function registerLanguage(monaco) {
+ monaco.languages.register({
+ id: "log"
+ });
+ monaco.languages.setMonarchTokensProvider("log", {
+ tokenizer: {
+ root: [
+ [/(^[=a-zA-Z].*|\d\s.*)/, "log-normal"],
+ [/\sERROR\s.*/, "log-error"],
+ [/\sWARN\s.*/, "log-warn"],
+ [/\sINFO\s.*/, "log-info"],
+ [
+ /^([0-9]{4}||[0-9]{2})-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}(.[0-9]{3})?/,
+ "log-date",
+ ],
+ [
+ /^[0-9]{2}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}(.[0-9]{3})?/,
+ "log-date",
+ ],
+ [/(^\*\*Waiting queue:.*)/, "log-info"],
+ [/(^\*\*result tips:.*)/, "log-info"],
+ ],
+ },
+ });
+ monaco.editor.defineTheme("log", {
+ base: "vs",
+ inherit: true,
+ rules: [{
+ token: "log-info",
+ foreground: "4b71ca"
+ },
+ {
+ token: "log-error",
+ foreground: "ff0000",
+ fontStyle: "bold"
+ },
+ {
+ token: "log-warn",
+ foreground: "FFA500"
+ },
+ {
+ token: "log-date",
+ foreground: "008800"
+ },
+ {
+ token: "log-normal",
+ foreground: "808080"
+ },
+ ],
+ colors: {
+ "editor.lineHighlightBackground": "#ffffff",
+ "editorGutter.background": "#f7f7f7",
+ },
+ });
+
+ }
+
+ export default registerLanguage;
\ No newline at end of file
diff --git a/report-ui/src/components/MonacoEditor/util/sql-completion.js b/report-ui/src/components/MonacoEditor/util/sql-completion.js
new file mode 100644
index 00000000..9ebcc029
--- /dev/null
+++ b/report-ui/src/components/MonacoEditor/util/sql-completion.js
@@ -0,0 +1,82 @@
+import * as monaco from 'monaco-editor'
+const hints = [
+ "SELECT",
+ "INSERT",
+ "DELETE",
+ "UPDATE",
+ "CREATE TABLE",
+ "DROP TABLE",
+ "ALTER TABLE",
+ "CREATE VIEW",
+ "DROP VIEW",
+ "CREATE INDEX",
+ "DROP INDEX",
+ "CREATE PROCEDURE",
+ "DROP PROCEDURE",
+ "CREATE TRIGGER",
+ "DROP TRIGGER",
+ "CREATE SCHEMA",
+ "DROP SCHEMA",
+ "CREATE DOMAIN",
+ "ALTER DOMAIN",
+ "DROP DOMAIN",
+ "GRANT",
+ "DENY",
+ "REVOKE",
+ "COMMIT",
+ "ROLLBACK",
+ "SET TRANSACTION",
+ "DECLARE",
+ "EXPLAN",
+ "OPEN",
+ "FETCH",
+ "CLOSE",
+ "PREPARE",
+ "EXECUTE",
+ "DESCRIBE",
+ "FROM",
+ "ORDER BY"]
+function createCompleter(getExtraHints) {
+ const createSuggestions = function (model, textUntilPosition) {
+ let text = model.getValue();
+ textUntilPosition = textUntilPosition.replace(/[\*\[\]@\$\(\)]/g, "").replace(/(\s+|\.)/g, " ");
+ let arr = textUntilPosition.split(/[\s;]/);
+ let activeStr = arr[arr.length - 1];
+ let len = activeStr.length;
+ let rexp = new RegExp("([^\\w]|^)" + activeStr + "\\w*", "gim");
+ let match = text.match(rexp);
+ let textHints = !match ? [] :
+ match.map(ele => {
+ let rexp = new RegExp(activeStr, "gim");
+ let search = ele.search(rexp);
+ return ele.substr(search);
+ });
+ let mergeHints = Array.from(new Set([...hints, ...textHints, ...getExtraHints(model)]))
+ .sort()
+ .filter(ele => {
+ let rexp = new RegExp(ele.substr(0, len), "gim");
+ return (match && match.length === 1 && ele === activeStr) ||
+ ele.length === 1 ? false : activeStr.match(rexp);
+ });
+ return mergeHints.map(ele => ({
+ label: ele,
+ kind: hints.indexOf(ele) > -1 ?
+ monaco.languages.CompletionItemKind.Keyword :
+ monaco.languages.CompletionItemKind.Text,
+ documentation: ele,
+ insertText: ele
+ }));
+ };
+ return {
+ provideCompletionItems(model, position) {
+ let textUntilPosition = model.getValueInRange({
+ startLineNumber: position.lineNumber,
+ startColumn: 1,
+ endLineNumber: position.lineNumber,
+ endColumn: position.column
+ });
+ return { suggestions: createSuggestions(model, textUntilPosition) };
+ }
+ }
+}
+export default createCompleter;
diff --git a/report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue b/report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue
index 587cf649..ca74cb6d 100644
--- a/report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue
+++ b/report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue
@@ -12,8 +12,8 @@