diff --git a/web/package.json b/web/package.json
index 75020d5d..990ce676 100644
--- a/web/package.json
+++ b/web/package.json
@@ -28,7 +28,6 @@
"@alova/adapter-xhr": "^2.2.1",
"@eslint/eslintrc": "^3.3.1",
"@fontsource-variable/jetbrains-mono": "^5.2.8",
- "@guolao/vue-monaco-editor": "^1.6.0",
"@vavt/copy2clipboard": "^1.0.3",
"@vue-js-cron/naive-ui": "^2.0.13",
"@vueuse/core": "^14.0.0",
@@ -39,6 +38,7 @@
"@xterm/addon-web-links": "^0.12.0",
"@xterm/addon-webgl": "^0.19.0",
"@xterm/xterm": "^6.0.0",
+ "ace-builds": "^1.43.5",
"alova": "^3.3.4",
"cronstrue": "^3.3.0",
"echarts": "^6.0.0",
@@ -47,7 +47,6 @@
"luxon": "^3.7.2",
"marked": "^17.0.0",
"mitt": "^3.0.1",
- "monaco-editor": "^0.55.1",
"node-forge": "^1.3.1",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
@@ -55,6 +54,7 @@
"vue": "^3.5.22",
"vue-echarts": "^8.0.1",
"vue-router": "^4.6.3",
+ "vue3-ace-editor": "^2.2.4",
"vue3-gettext": "4.0.0-beta.1"
},
"devDependencies": {
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index 3bef0ef8..f848a503 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -17,9 +17,6 @@ importers:
'@fontsource-variable/jetbrains-mono':
specifier: ^5.2.8
version: 5.2.8
- '@guolao/vue-monaco-editor':
- specifier: ^1.6.0
- version: 1.6.0(monaco-editor@0.55.1)(vue@3.5.26(typescript@5.9.3))
'@vavt/copy2clipboard':
specifier: ^1.0.3
version: 1.0.3
@@ -50,6 +47,9 @@ importers:
'@xterm/xterm':
specifier: ^6.0.0
version: 6.0.0
+ ace-builds:
+ specifier: ^1.43.5
+ version: 1.43.5
alova:
specifier: ^3.3.4
version: 3.4.1
@@ -74,9 +74,6 @@ importers:
mitt:
specifier: ^3.0.1
version: 3.0.1
- monaco-editor:
- specifier: ^0.55.1
- version: 0.55.1
node-forge:
specifier: ^1.3.1
version: 1.3.3
@@ -98,6 +95,9 @@ importers:
vue-router:
specifier: ^4.6.3
version: 4.6.4(vue@3.5.26(typescript@5.9.3))
+ vue3-ace-editor:
+ specifier: ^2.2.4
+ version: 2.2.4(ace-builds@1.43.5)(vue@3.5.26(typescript@5.9.3))
vue3-gettext:
specifier: 4.0.0-beta.1
version: 4.0.0-beta.1(@vue/compiler-sfc@3.5.26)(vue@3.5.26(typescript@5.9.3))
@@ -667,16 +667,6 @@ packages:
'@fontsource-variable/jetbrains-mono@5.2.8':
resolution: {integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==}
- '@guolao/vue-monaco-editor@1.6.0':
- resolution: {integrity: sha512-w2IiJ6eJGGeuIgCK6EKZOAfhHTTUB5aZwslzwGbZ5e89Hb4avx6++GkLTW8p84Sng/arFMjLPPxSBI56cFudyQ==}
- peerDependencies:
- '@vue/composition-api': ^1.7.2
- monaco-editor: '>=0.43.0'
- vue: ^2.6.14 || >=3.0.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
-
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -795,9 +785,6 @@ packages:
'@marijn/find-cluster-break@1.0.2':
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
- '@monaco-editor/loader@1.7.0':
- resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
-
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -1058,9 +1045,6 @@ packages:
'@types/node@24.10.4':
resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
- '@types/trusted-types@2.0.7':
- resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
@@ -1378,6 +1362,9 @@ packages:
'@xterm/xterm@6.0.0':
resolution: {integrity: sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==}
+ ace-builds@1.43.5:
+ resolution: {integrity: sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==}
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -1745,9 +1732,6 @@ packages:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
- dompurify@3.2.7:
- resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==}
-
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
@@ -2446,11 +2430,6 @@ packages:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
- marked@14.0.0:
- resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
- engines: {node: '>= 18'}
- hasBin: true
-
marked@17.0.1:
resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==}
engines: {node: '>= 20'}
@@ -2518,9 +2497,6 @@ packages:
resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==}
hasBin: true
- monaco-editor@0.55.1:
- resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==}
-
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -2824,6 +2800,9 @@ packages:
remove@0.1.5:
resolution: {integrity: sha512-AJMA9oWvJzdTjwIGwSQZsjGQiRx73YTmiOWmfCp1fpLa/D4n7jKcpoA+CZiVLJqKcEKUuh1Suq80c5wF+L/qVQ==}
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -2956,9 +2935,6 @@ packages:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
- state-local@1.0.7:
- resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
-
statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -3324,17 +3300,6 @@ packages:
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
- vue-demi@0.14.10:
- resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
- engines: {node: '>=12'}
- hasBin: true
- peerDependencies:
- '@vue/composition-api': ^1.0.0-rc.1
- vue: ^3.0.0-0 || ^2.6.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
-
vue-echarts@8.0.1:
resolution: {integrity: sha512-23rJTFLu1OUEGRWjJGmdGt8fP+8+ja1gVgzMYPIPaHWpXegcO1viIAaeu2H4QHESlVeHzUAHIxKXGrwjsyXAaA==}
peerDependencies:
@@ -3361,6 +3326,12 @@ packages:
peerDependencies:
typescript: '>=5.0.0'
+ vue3-ace-editor@2.2.4:
+ resolution: {integrity: sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==}
+ peerDependencies:
+ ace-builds: '*'
+ vue: ^3
+
vue3-gettext@4.0.0-beta.1:
resolution: {integrity: sha512-1A46SmubgTMyy7i5hj8ay50NFl6/vzwoIVZPuGCin/X3a/NVCAs99G0EbcnfJiR7NZNTJgUjvBzppufC7Kq+4A==}
engines: {node: '>= 20.19.0'}
@@ -4054,13 +4025,6 @@ snapshots:
'@fontsource-variable/jetbrains-mono@5.2.8': {}
- '@guolao/vue-monaco-editor@1.6.0(monaco-editor@0.55.1)(vue@3.5.26(typescript@5.9.3))':
- dependencies:
- '@monaco-editor/loader': 1.7.0
- monaco-editor: 0.55.1
- vue: 3.5.26(typescript@5.9.3)
- vue-demi: 0.14.10(vue@3.5.26(typescript@5.9.3))
-
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.7':
@@ -4225,10 +4189,6 @@ snapshots:
'@marijn/find-cluster-break@1.0.2': {}
- '@monaco-editor/loader@1.7.0':
- dependencies:
- state-local: 1.0.7
-
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -4418,9 +4378,6 @@ snapshots:
dependencies:
undici-types: 7.16.0
- '@types/trusted-types@2.0.7':
- optional: true
-
'@types/web-bluetooth@0.0.21': {}
'@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
@@ -4907,6 +4864,8 @@ snapshots:
'@xterm/xterm@6.0.0': {}
+ ace-builds@1.43.5: {}
+
acorn-jsx@5.3.2(acorn@8.15.0):
dependencies:
acorn: 8.15.0
@@ -5270,10 +5229,6 @@ snapshots:
dependencies:
domelementtype: 2.3.0
- dompurify@3.2.7:
- optionalDependencies:
- '@types/trusted-types': 2.0.7
-
domutils@2.8.0:
dependencies:
dom-serializer: 1.4.1
@@ -6027,8 +5982,6 @@ snapshots:
punycode.js: 2.3.1
uc.micro: 2.1.0
- marked@14.0.0: {}
-
marked@17.0.1: {}
math-intrinsics@1.1.0: {}
@@ -6106,11 +6059,6 @@ snapshots:
dependencies:
commander: 14.0.2
- monaco-editor@0.55.1:
- dependencies:
- dompurify: 3.2.7
- marked: 14.0.0
-
mrmime@2.0.1: {}
ms@2.0.0: {}
@@ -6402,6 +6350,8 @@ snapshots:
dependencies:
seq: 0.3.5
+ resize-observer-polyfill@1.5.1: {}
+
resolve-from@4.0.0: {}
resolve-pkg-maps@1.0.0: {}
@@ -6569,8 +6519,6 @@ snapshots:
speakingurl@14.0.1: {}
- state-local@1.0.7: {}
-
statuses@1.5.0: {}
stop-iteration-iterator@1.1.0:
@@ -7007,10 +6955,6 @@ snapshots:
vscode-uri@3.1.0: {}
- vue-demi@0.14.10(vue@3.5.26(typescript@5.9.3)):
- dependencies:
- vue: 3.5.26(typescript@5.9.3)
-
vue-echarts@8.0.1(echarts@6.0.0)(vue@3.5.26(typescript@5.9.3)):
dependencies:
echarts: 6.0.0
@@ -7041,6 +6985,12 @@ snapshots:
'@vue/language-core': 3.2.1
typescript: 5.9.3
+ vue3-ace-editor@2.2.4(ace-builds@1.43.5)(vue@3.5.26(typescript@5.9.3)):
+ dependencies:
+ ace-builds: 1.43.5
+ resize-observer-polyfill: 1.5.1
+ vue: 3.5.26(typescript@5.9.3)
+
vue3-gettext@4.0.0-beta.1(@vue/compiler-sfc@3.5.26)(vue@3.5.26(typescript@5.9.3)):
dependencies:
'@vue/compiler-sfc': 3.5.26
diff --git a/web/src/components/common/CodeEditor.vue b/web/src/components/common/CodeEditor.vue
deleted file mode 100644
index ae90b2dd..00000000
--- a/web/src/components/common/CodeEditor.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
diff --git a/web/src/components/common/CommonEditor.vue b/web/src/components/common/CommonEditor.vue
new file mode 100644
index 00000000..92db8200
--- /dev/null
+++ b/web/src/components/common/CommonEditor.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
diff --git a/web/src/components/common/FileEditor.vue b/web/src/components/common/FileEditor.vue
new file mode 100644
index 00000000..dbefaab8
--- /dev/null
+++ b/web/src/components/common/FileEditor.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
diff --git a/web/src/main.ts b/web/src/main.ts
index 9c8f2001..684f78fd 100644
--- a/web/src/main.ts
+++ b/web/src/main.ts
@@ -13,61 +13,6 @@ import { gettext, setCurrent, setupNaiveDiscreteApi } from '@/utils'
import home from '@/api/panel/home'
import CronNaivePlugin from '@vue-js-cron/naive-ui'
-async function loadMonacoLocale(locale: string) {
- try {
- switch (locale) {
- case 'zh_CN':
- await import('monaco-editor/esm/nls.messages.zh-cn.js')
- break
- case 'zh_TW':
- await import('monaco-editor/esm/nls.messages.zh-tw.js')
- break
- default:
- // 英语不需要加载
- break
- }
- } catch (error) {
- console.warn(`Failed to load monaco-editor locale: ${locale}`, error)
- }
-}
-
-async function setupMonacoEditor(app: any) {
- const [editorWorker, jsonWorker, cssWorker, htmlWorker, tsWorker] = await Promise.all([
- import('monaco-editor/esm/vs/editor/editor.worker?worker'),
- import('monaco-editor/esm/vs/language/json/json.worker?worker'),
- import('monaco-editor/esm/vs/language/css/css.worker?worker'),
- import('monaco-editor/esm/vs/language/html/html.worker?worker'),
- import('monaco-editor/esm/vs/language/typescript/ts.worker?worker')
- ])
-
- self.MonacoEnvironment = {
- getWorker(_: any, label: string) {
- if (label === 'json') {
- return new jsonWorker.default()
- }
- if (label === 'css' || label === 'scss' || label === 'less') {
- return new cssWorker.default()
- }
- if (label === 'html' || label === 'handlebars' || label === 'razor') {
- return new htmlWorker.default()
- }
- if (label === 'typescript' || label === 'javascript') {
- return new tsWorker.default()
- }
- return new editorWorker.default()
- }
- }
-
- const [{ install: VueMonacoEditorPlugin }, monaco] = await Promise.all([
- import('@guolao/vue-monaco-editor'),
- import('monaco-editor')
- ])
-
- app.use(VueMonacoEditorPlugin, {
- monaco
- })
-}
-
async function setupApp() {
const app = createApp(App)
app.use(CronNaivePlugin)
@@ -78,8 +23,6 @@ async function setupApp() {
app.use(gettext)
})
- await setupMonacoEditor(app)
-
await setupRouter(app)
app.mount('#app')
}
@@ -95,8 +38,6 @@ const setupPanel = async () => {
locale: 'en'
}
}).onSuccess(async ({ data }: { data: any }) => {
- await loadMonacoLocale(data.locale)
-
setCurrent(data.locale)
themeStore.setLocale(data.locale)
themeStore.setName(data.name)
diff --git a/web/src/views/apps/codeserver/IndexView.vue b/web/src/views/apps/codeserver/IndexView.vue
index ff5fa3ac..75966301 100644
--- a/web/src/views/apps/codeserver/IndexView.vue
+++ b/web/src/views/apps/codeserver/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-codeserver-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -41,17 +40,7 @@ const handleSaveConfig = () => {
)
}}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/docker/IndexView.vue b/web/src/views/apps/docker/IndexView.vue
index 6fcc2b1b..31abfb47 100644
--- a/web/src/views/apps/docker/IndexView.vue
+++ b/web/src/views/apps/docker/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-docker-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -37,17 +36,7 @@ const handleSaveConfig = () => {
{{ $gettext('This modifies the Docker configuration file (/etc/docker/daemon.json)') }}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/frp/IndexView.vue b/web/src/views/apps/frp/IndexView.vue
index fe9439fe..c9c7d44c 100644
--- a/web/src/views/apps/frp/IndexView.vue
+++ b/web/src/views/apps/frp/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-frp-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -47,17 +46,7 @@ onMounted(() => {
{{ $gettext('Save') }}
-
+
@@ -70,17 +59,7 @@ onMounted(() => {
{{ $gettext('Save') }}
-
+
diff --git a/web/src/views/apps/gitea/IndexView.vue b/web/src/views/apps/gitea/IndexView.vue
index f7a6bf32..077686fb 100644
--- a/web/src/views/apps/gitea/IndexView.vue
+++ b/web/src/views/apps/gitea/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-gitea-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -39,17 +38,7 @@ const handleSaveConfig = () => {
)
}}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/memcached/IndexView.vue b/web/src/views/apps/memcached/IndexView.vue
index 6ca411b8..3a281e95 100644
--- a/web/src/views/apps/memcached/IndexView.vue
+++ b/web/src/views/apps/memcached/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-memcached-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton, NDataTable } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -54,17 +53,7 @@ const handleSaveConfig = () => {
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/minio/IndexView.vue b/web/src/views/apps/minio/IndexView.vue
index 445e4ced..ae3933a3 100644
--- a/web/src/views/apps/minio/IndexView.vue
+++ b/web/src/views/apps/minio/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-minio-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -39,17 +38,7 @@ const handleSaveEnv = () => {
)
}}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/mysql/IndexView.vue b/web/src/views/apps/mysql/IndexView.vue
index e046da4a..11b83575 100644
--- a/web/src/views/apps/mysql/IndexView.vue
+++ b/web/src/views/apps/mysql/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-mysql-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton, NDataTable, NInput } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -91,17 +90,7 @@ const handleSetRootPassword = async () => {
)
}}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/nginx/IndexView.vue b/web/src/views/apps/nginx/IndexView.vue
index 125f19ed..449755b2 100644
--- a/web/src/views/apps/nginx/IndexView.vue
+++ b/web/src/views/apps/nginx/IndexView.vue
@@ -3,7 +3,6 @@ defineOptions({
name: 'apps-nginx-index'
})
-import Editor from '@guolao/vue-monaco-editor'
import { NButton, NDataTable } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
@@ -67,17 +66,7 @@ const handleClearErrorLog = () => {
)
}}
-
+
{{ $gettext('Save') }}
diff --git a/web/src/views/apps/php/PhpView.vue b/web/src/views/apps/php/PhpView.vue
index d652f369..5abdae1a 100644
--- a/web/src/views/apps/php/PhpView.vue
+++ b/web/src/views/apps/php/PhpView.vue
@@ -1,5 +1,4 @@