Skip to content

Commit 4f2e698

Browse files
author
汪航洋
committed
引入MonacoEditor 及 jsonc , 让模板支持注释
1 parent d6fda1c commit 4f2e698

File tree

14 files changed

+177
-44
lines changed

14 files changed

+177
-44
lines changed

package-lock.json

Lines changed: 48 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717
"events": "^3.3.0",
1818
"i": "^0.3.7",
1919
"jsonc": "^2.0.0",
20+
"jsonc-parser": "^3.2.0",
21+
"monaco-editor": "^0.39.0",
2022
"npm": "^10.2.3",
2123
"qs": "^6.11.2",
2224
"react": "^18.2.0",
2325
"react-dom": "^18.2.0",
26+
"react-monaco-editor": "^0.54.0",
2427
"uuid": "^9.0.1"
2528
},
2629
"devDependencies": {

src/App.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#root {
22
width: 100%;
33
}
4+
.g-boder {
5+
border: 1px solid #ccc;
6+
}

src/App.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ import Ctx from "./uitls/ctx";
1515
import { init, logout, useGolstCofnig } from "./uitls/server";
1616
import * as API from "./api";
1717
import Home from "./Pages/Home";
18-
import Services from "./components/List/Services";
19-
import Chains from "./components/List/Chains";
18+
// import Services from "./components/List/Services";
19+
// import Chains from "./components/List/Chains";
20+
// import PublicList from "./components/List/Public";
2021
import "./App.css";
2122
import { configEvent } from "./uitls/events";
22-
import PublicList from "./components/List/Public";
2323
import { download, jsonFormat } from "./uitls";
24-
import { saveCofnig } from "./api";
2524
import ListCard from "./components/ListCard";
2625
import ChainCard from "./components/ListCard/Chains";
2726
import ServiceCard from "./components/ListCard/Services";
@@ -54,7 +53,9 @@ function App() {
5453

5554
useEffect(() => {
5655
init();
57-
const updateConfig = () => {
56+
const updateConfig = (reqConfig: any) => {
57+
console.log("reqConfig", reqConfig);
58+
if(reqConfig.url === API.apis.config) return;
5859
return API.getConfig().then((data) => {
5960
setGostConfig(data);
6061
return data;
@@ -103,7 +104,7 @@ function App() {
103104
<Button
104105
// type="link"
105106
onClick={() => {
106-
saveCofnig();
107+
API.saveCofnig();
107108
}}
108109
>
109110
保存配置

src/api/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import require from "../uitls/require";
22
import type * as Gost from "./types";
33

4-
const apis = {
4+
type Format = "json" | "yaml";
5+
6+
export const apis = {
57
config: "/config",
68
admissions: "/config/admissions",
79
authers: "/config/authers",
@@ -42,8 +44,8 @@ export const resolvers = getRESTfulApi<Gost.ResolverConfig>(apis["resolvers"]);
4244
export const services = getRESTfulApi<Gost.ServiceConfig>(apis["services"]);
4345

4446
// 获取当前config
45-
export const getConfig = () =>
46-
require.get(apis.config);
47+
export const getConfig = (format?: Format) => require.get(apis.config);
4748

48-
// 保存当前config(使之重启也生效)
49-
export const saveCofnig = () => require.post(apis.config)
49+
// 保存当前config到服务器
50+
export const saveCofnig = (format: Format = "json") =>
51+
require.post(apis.config, null, { params: { format } });

src/components/Forms/AddButton.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button, message } from "antd";
55
import { getRESTfulApi } from "../../api";
66
import { PlusOutlined } from "@ant-design/icons";
77
import Ctx from "../../uitls/ctx";
8+
import { jsonParse } from "../../uitls";
89

910
type Props = {
1011
name: string;
@@ -22,7 +23,7 @@ const AddButton: React.FC<Props> = (props) => {
2223
}, []);
2324

2425
const addService = async (servic: any) => {
25-
const data = JSON.parse(servic);
26+
const data = jsonParse(servic);
2627
await api.post(data);
2728
};
2829

@@ -37,7 +38,7 @@ const AddButton: React.FC<Props> = (props) => {
3738
// return true;
3839

3940
const { value } = values;
40-
const json = JSON.parse(value);
41+
const json = jsonParse(value);
4142
let addName = json.name || `${name}-0`;
4243
let rename = json.name ? false : true;
4344
const hasName = () => {

src/components/Forms/Json.tsx

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import {
44
ModalForm,
55
ProFormInstance,
66
} from "@ant-design/pro-components";
7-
import { Button, Dropdown, Space } from "antd";
7+
import { Button, Dropdown, Form, Space } from "antd";
88
import { DownOutlined } from "@ant-design/icons";
9-
import { jsonFormat, jsonStringFormat } from "../../uitls";
9+
import { jsonFormat, jsonStringFormat, jsonParse } from "../../uitls";
10+
import MonacoEditor, { MonacoEditorProps } from "react-monaco-editor";
11+
import "./userMonacoWorker";
1012

1113
type Template = {
1214
label: string;
@@ -53,8 +55,8 @@ const JsonForm: React.FC<any> = (props) => {
5355
const templateHandle = (json: string) => {
5456
let value;
5557
if (props.initialValues?.value) {
56-
const _json = JSON.parse(json);
57-
const _old = JSON.parse(props.initialValues.value);
58+
const _json = jsonParse(json);
59+
const _old = jsonParse(props.initialValues.value);
5860
_json.name = _old.name ? _old.name : _json.name;
5961
value = jsonFormat(_json);
6062
} else {
@@ -146,21 +148,51 @@ const JsonForm: React.FC<any> = (props) => {
146148
})}
147149
</Space>
148150
)}
149-
<ProFormTextArea
150-
fieldProps={{ rows: 16 }}
151+
{/* <ProFormTextArea
152+
fieldProps={{ rows: 8 }}
151153
name="value"
152154
rules={[
153155
{ required: true, message: "不能为空" },
154156
{
155157
validator: (rule, value) => {
156158
return new Promise((resolve, reject) => {
157-
if (value) JSON.parse(value);
159+
if (value) jsonParse(value);
158160
resolve(null);
159161
});
160-
}
162+
},
163+
},
164+
]}
165+
></ProFormTextArea> */}
166+
<Form.Item
167+
name="value"
168+
rules={[
169+
{ required: true, message: "不能为空" },
170+
{
171+
validator: (rule, value) => {
172+
return new Promise((resolve, reject) => {
173+
if (value) {
174+
jsonParse(value);
175+
}
176+
resolve(null)
177+
}).catch((err) => {
178+
console.error(err);
179+
throw new Error('json 格式错误');
180+
} );
181+
},
161182
},
162183
]}
163-
></ProFormTextArea>
184+
>
185+
<MonacoEditor
186+
className={"g-boder"}
187+
height={300}
188+
language="json"
189+
options={{
190+
// selectOnLineNumbers: true,
191+
minimap: { enabled: false },
192+
// readOnly: readOnly,
193+
}}
194+
></MonacoEditor>
195+
</Form.Item>
164196
</ModalForm>
165197
</>
166198
);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* eslint-disable */
2+
import * as monaco from "monaco-editor";
3+
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
4+
import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
5+
// import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
6+
// import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
7+
// import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
8+
// @ts-ignore
9+
import { language as yamlLanguage } from "monaco-editor/esm/vs/basic-languages/yaml/yaml";
10+
11+
// eslint-disable-next-line
12+
// @ts-ignore
13+
self.MonacoEnvironment = {
14+
getWorker(_: any, label: string) {
15+
console.log('[label]',label);
16+
// setLocaleData(zh_CN.contents);
17+
if (label === "json") {
18+
return new jsonWorker();
19+
}
20+
// if (label === "css" || label === "scss" || label === "less") {
21+
// return new cssWorker();
22+
// }
23+
// if (label === "html" || label === "handlebars" || label === "razor") {
24+
// return new htmlWorker();
25+
// }
26+
// if (label === "typescript" || label === "javascript") {
27+
// return new tsWorker();
28+
// }
29+
return new editorWorker();
30+
},
31+
};
32+
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
33+
allowComments: true,
34+
trailingCommas: 'warning',
35+
})
36+
monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true);
37+

0 commit comments

Comments
 (0)