vome-core 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/config/plugin-dev.js +1 -1
- package/dist/admin/crud/components/vm-richtext.vue +180 -236
- package/dist/admin/crud/config.js +1 -1
- package/dist/admin/crud/confirm.js +1 -1
- package/dist/admin/crud/dict.js +1 -1
- package/dist/admin/crud/key.js +1 -1
- package/dist/admin/crud/mitt.js +1 -1
- package/dist/admin/crud/plugins.js +1 -1
- package/dist/admin/crud/span.js +1 -1
- package/dist/admin/crud/style.js +1 -1
- package/dist/admin/crud/validate.js +1 -1
- package/dist/admin/directives/perm.js +1 -1
- package/dist/admin/hooks/useUpload.js +1 -1
- package/dist/admin/lib/browser.js +1 -1
- package/dist/admin/lib/cn.js +1 -1
- package/dist/admin/lib/dialog-float.js +1 -1
- package/dist/admin/lib/export-excel.js +1 -1
- package/dist/admin/lib/import-excel.js +1 -1
- package/dist/admin/lib/json.js +1 -1
- package/dist/admin/lib/menu.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- package/dist/admin/lib/upload.js +1 -1
- package/dist/admin/lib/video-frame.js +1 -1
- package/dist/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/excel.js +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/locale-json.js +1 -1
- package/dist/shared/tree.js +1 -1
- package/package.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x245ea6=_0x5738;(function(_0x217bd0,_0x3783bd){const _0x8ef90f=_0x5738,_0x24f6a2=_0x217bd0();while(!![]){try{const _0x19b1e6=parseInt(_0x8ef90f(0x178))/0x1+-parseInt(_0x8ef90f(0x193))/0x2+parseInt(_0x8ef90f(0x189))/0x3+-parseInt(_0x8ef90f(0x18f))/0x4+parseInt(_0x8ef90f(0x191))/0x5*(-parseInt(_0x8ef90f(0x183))/0x6)+-parseInt(_0x8ef90f(0x190))/0x7*(parseInt(_0x8ef90f(0x17d))/0x8)+parseInt(_0x8ef90f(0x186))/0x9*(parseInt(_0x8ef90f(0x181))/0xa);if(_0x19b1e6===_0x3783bd)break;else _0x24f6a2['push'](_0x24f6a2['shift']());}catch(_0x318829){_0x24f6a2['push'](_0x24f6a2['shift']());}}}(_0x1ba4,0xadcb7));const ORG=_0x245ea6(0x17e);export function serviceUrlFromDocs(_0x518aec){const _0x368b3f=_0x245ea6,_0x12bba5=new URL(_0x518aec),_0x515ef0=_0x12bba5['hostname'][_0x368b3f(0x18c)](/^www\./,'')['replace'](/^service\./,'');return _0x12bba5[_0x368b3f(0x182)]+'//service.'+_0x515ef0;}export function seatApiBaseFromDocs(_0x167144){const _0xd6b169=_0x245ea6;return serviceUrlFromDocs(_0x167144)+_0xd6b169(0x17a);}export function licenseIssueUrlFromDocs(_0x58196e){const _0x84dd57=_0x245ea6;return serviceUrlFromDocs(_0x58196e)+_0x84dd57(0x180);}function _0x1ba4(){const _0x4d745a=['mtGZmJK5mhHjEMPQDa','ChjVDg9JB2W','nte3og1TtwHdzG','5yMn56UVicSG5zco56UV','DM9Tzs1WBhvNAw4TC2vYDMLJzq','mta4z1fTwgn4','z2L0zwu','l2fYy2HPDMuVCMvMCY9OzwfKCY9Tyxn0zxiUEMLW','mZyYnJG3neros2Dctq','zNvSBa','DM9Tzs1WBhvNAw4TzNvSBa','CMvWBgfJzq','5zco5y+W5B6U5BQu55sO6isA5OMl5P6277YilNzVBwxVVjRLKkSGD2vIl++8IE+8Jos7Psb3DwPPzsdMJilOVB3NI6ZNQ4VLIy3NQ6/POBxPNAlJGii','57QV5yMn56UV','ndyXnJe2ohH4ywDSDG','n0XvsfjNwG','nJq3mgnMwNrvwG','Ahr0Chm6lY9NAxrODwiUy29TlW','mJuYota4mNzTs0rbrW','6zkP5A2qic8G5PYn5yQH56UV5O+s5lU26isA5OMl5P6277YilNzVBwxVVjRKU4uGC2vYDMvY77Yj77Ym6ycc5zci5lIk5lYG44cb55+T5l+H44cb5PsV5lUy562j6io95yQB5OMP5Bgv44cc','Ahr0Chm6lY9NAxrLzs5JB20V','DM9Tzs1WBhvNAw4TzNjVBNq','mteYnZC3m0zey2L4sG','yMfJA2vUza','l2fWCc9WBhvNAw5tDg9Yzs9Zzwf0','5A6m5Pw05lIA5yQH5QIH5z2x6isA5OMl5P6277YilNzVBwxVVjRLKkSGC2vYDMvYios4JIb3zwlVViNVViZMNkZLNldLVidLJ5hMIzpLJixLKi7LJ5hLUipJGii','zNjVBNrLBMq','mJmXmZiWohLmDhH6uq','DM9TzwTQ','l3bSDwDPBNmVDxbSB2fK','l2fWCc9WBhvNAw5tDg9Yzs93ywXSzxqVBgLJzw5Zzs9PC3n1zq'];_0x1ba4=function(){return _0x4d745a;};return _0x1ba4();}function giteeArchive(_0x31818e){const _0x3f07f3=_0x245ea6;return _0x3f07f3(0x176)+ORG+'/'+_0x31818e+'/repository/archive/master.zip';}function githubArchive(_0x37a8f5){const _0x51d5ee=_0x245ea6;return _0x51d5ee(0x192)+ORG+'/'+_0x37a8f5+_0x51d5ee(0x188);}function giteeRepo(_0x649b87){return'https://gitee.com/'+ORG+'/'+_0x649b87;}function githubRepo(_0x39d849){return'https://github.com/'+ORG+'/'+_0x39d849;}function _0x5738(_0x3d205a,_0x49a45f){_0x3d205a=_0x3d205a-0x175;const _0x1ba4c1=_0x1ba4();let _0x573808=_0x1ba4c1[_0x3d205a];if(_0x5738['BzNZAs']===undefined){var _0x32c628=function(_0x3248e0){const _0x9056ea='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x518aec='',_0x12bba5='';for(let _0x515ef0=0x0,_0x167144,_0x58196e,_0x31818e=0x0;_0x58196e=_0x3248e0['charAt'](_0x31818e++);~_0x58196e&&(_0x167144=_0x515ef0%0x4?_0x167144*0x40+_0x58196e:_0x58196e,_0x515ef0++%0x4)?_0x518aec+=String['fromCharCode'](0xff&_0x167144>>(-0x2*_0x515ef0&0x6)):0x0){_0x58196e=_0x9056ea['indexOf'](_0x58196e);}for(let _0x37a8f5=0x0,_0x649b87=_0x518aec['length'];_0x37a8f5<_0x649b87;_0x37a8f5++){_0x12bba5+='%'+('00'+_0x518aec['charCodeAt'](_0x37a8f5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x12bba5);};_0x5738['UlgIzL']=_0x32c628,_0x5738['zMFEqs']={},_0x5738['BzNZAs']=!![];}const _0x956bbb=_0x1ba4c1[0x0],_0x506e04=_0x3d205a+_0x956bbb,_0x1be382=_0x5738['zMFEqs'][_0x506e04];return!_0x1be382?(_0x573808=_0x5738['UlgIzL'](_0x573808),_0x5738['zMFEqs'][_0x506e04]=_0x573808):_0x573808=_0x1be382,_0x573808;}const docsUrl='https://vomekj.com';export const pluginDev={'docsUrl':docsUrl,'serviceUrl':serviceUrlFromDocs(docsUrl),'uploadUrl':docsUrl+_0x245ea6(0x17f),'mirrors':{'prefer':_0x245ea6(0x187),'giteeOrg':_0x245ea6(0x176)+ORG,'githubOrg':_0x245ea6(0x192)+ORG},'scaffolds':{'full':{'key':_0x245ea6(0x18a),'title':_0x245ea6(0x184),'desc':_0x245ea6(0x17b),'repo':'vome-plugin-full','repoUrl':giteeRepo(_0x245ea6(0x18b)),'githubRepoUrl':githubRepo(_0x245ea6(0x18b)),'downloadUrl':giteeArchive('vome-plugin-full'),'githubDownloadUrl':githubArchive(_0x245ea6(0x18b))},'backend':{'key':_0x245ea6(0x179),'title':'纯后端','desc':_0x245ea6(0x175),'repo':_0x245ea6(0x185),'repoUrl':giteeRepo(_0x245ea6(0x185)),'githubRepoUrl':githubRepo('vome-plugin-service'),'downloadUrl':giteeArchive(_0x245ea6(0x185)),'githubDownloadUrl':githubArchive(_0x245ea6(0x185))},'frontend':{'key':_0x245ea6(0x17c),'title':_0x245ea6(0x18e),'desc':_0x245ea6(0x18d),'repo':'vome-plugin-front','repoUrl':giteeRepo(_0x245ea6(0x177)),'githubRepoUrl':githubRepo(_0x245ea6(0x177)),'downloadUrl':giteeArchive(_0x245ea6(0x177)),'githubDownloadUrl':githubArchive(_0x245ea6(0x177))}}};
|
|
@@ -1,41 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
class="vm-richtext"
|
|
4
|
-
:class="{
|
|
4
|
+
:class="{
|
|
5
|
+
'is-readonly': readOnlyMode,
|
|
6
|
+
'is-disabled': disabled,
|
|
7
|
+
}"
|
|
5
8
|
>
|
|
6
|
-
<div v-if="!readOnlyMode" class="vm-richtext__toolbar" role="toolbar">
|
|
7
|
-
<button
|
|
8
|
-
v-for="btn in toolbar"
|
|
9
|
-
:key="btn.cmd"
|
|
10
|
-
type="button"
|
|
11
|
-
class="vm-richtext__tool"
|
|
12
|
-
:title="btn.title"
|
|
13
|
-
:disabled="disabled"
|
|
14
|
-
@mousedown.prevent
|
|
15
|
-
@click="runCmd(btn.cmd, 'value' in btn ? btn.value : undefined)"
|
|
16
|
-
>
|
|
17
|
-
<i :class="btn.icon" aria-hidden="true" />
|
|
18
|
-
</button>
|
|
19
|
-
<button
|
|
20
|
-
type="button"
|
|
21
|
-
class="vm-richtext__tool"
|
|
22
|
-
title="插入图片"
|
|
23
|
-
:disabled="disabled || uploading || !uploadImage"
|
|
24
|
-
@mousedown.prevent
|
|
25
|
-
@click="pickImage"
|
|
26
|
-
>
|
|
27
|
-
<i class="ri-image-add-line" aria-hidden="true" />
|
|
28
|
-
</button>
|
|
29
|
-
<input
|
|
30
|
-
ref="fileRef"
|
|
31
|
-
type="file"
|
|
32
|
-
accept="image/*"
|
|
33
|
-
multiple
|
|
34
|
-
class="vm-richtext__file"
|
|
35
|
-
@change="onFileChange"
|
|
36
|
-
/>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
9
|
<div
|
|
40
10
|
v-if="readOnlyMode"
|
|
41
11
|
class="vm-richtext__html"
|
|
@@ -44,32 +14,49 @@
|
|
|
44
14
|
|
|
45
15
|
<div
|
|
46
16
|
v-else
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
17
|
+
class="vm-richtext__shell"
|
|
18
|
+
:style="shellStyle"
|
|
19
|
+
>
|
|
20
|
+
<Toolbar
|
|
21
|
+
class="vm-richtext__toolbar"
|
|
22
|
+
:editor="editorRef"
|
|
23
|
+
:default-config="toolbarConfig"
|
|
24
|
+
mode="default"
|
|
25
|
+
/>
|
|
26
|
+
<Editor
|
|
27
|
+
class="vm-richtext__editor"
|
|
28
|
+
:default-config="editorConfig"
|
|
29
|
+
mode="default"
|
|
30
|
+
@on-created="onEditorCreated"
|
|
31
|
+
@on-change="onEditorChange"
|
|
32
|
+
/>
|
|
33
|
+
</div>
|
|
56
34
|
</div>
|
|
57
35
|
</template>
|
|
58
36
|
|
|
59
37
|
<script setup lang="ts">
|
|
60
|
-
import
|
|
38
|
+
import '@wangeditor/editor/dist/css/style.css'
|
|
39
|
+
import { computed, onBeforeUnmount, shallowRef, watch } from 'vue'
|
|
61
40
|
import DOMPurify from 'dompurify'
|
|
41
|
+
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
|
|
42
|
+
import type { IDomEditor, IEditorConfig, IToolbarConfig } from '@wangeditor/editor'
|
|
43
|
+
import { useUpload } from '../../hooks/useUpload'
|
|
62
44
|
|
|
63
45
|
defineOptions({ name: 'vm-richtext' })
|
|
64
46
|
|
|
65
47
|
const RICH_TAGS = [
|
|
66
48
|
'p',
|
|
67
49
|
'br',
|
|
50
|
+
'div',
|
|
51
|
+
'span',
|
|
68
52
|
'strong',
|
|
69
53
|
'b',
|
|
70
54
|
'em',
|
|
71
55
|
'i',
|
|
72
56
|
'u',
|
|
57
|
+
's',
|
|
58
|
+
'del',
|
|
59
|
+
'strike',
|
|
73
60
|
'a',
|
|
74
61
|
'ul',
|
|
75
62
|
'ol',
|
|
@@ -78,30 +65,43 @@ const RICH_TAGS = [
|
|
|
78
65
|
'h2',
|
|
79
66
|
'h3',
|
|
80
67
|
'h4',
|
|
68
|
+
'h5',
|
|
69
|
+
'h6',
|
|
81
70
|
'blockquote',
|
|
82
71
|
'code',
|
|
83
72
|
'pre',
|
|
84
|
-
'span',
|
|
85
|
-
'div',
|
|
86
73
|
'img',
|
|
74
|
+
'table',
|
|
75
|
+
'thead',
|
|
76
|
+
'tbody',
|
|
77
|
+
'tr',
|
|
78
|
+
'th',
|
|
79
|
+
'td',
|
|
80
|
+
'hr',
|
|
81
|
+
'sup',
|
|
82
|
+
'sub',
|
|
87
83
|
]
|
|
88
84
|
|
|
89
85
|
const props = withDefaults(
|
|
90
86
|
defineProps<{
|
|
91
87
|
modelValue?: string | null
|
|
92
|
-
/** 只读展示(表格列) */
|
|
93
88
|
readonly?: boolean
|
|
94
89
|
disabled?: boolean
|
|
95
90
|
placeholder?: string
|
|
96
|
-
/** 编辑区高度 */
|
|
97
91
|
height?: number | string
|
|
98
|
-
/**
|
|
92
|
+
/** 自定义上传;未传且 autoUpload=true 时走 useUpload 直传 OSS */
|
|
99
93
|
uploadImage?: (file: File) => Promise<string>
|
|
94
|
+
/** autoUpload 默认前缀(须 app/public/**) */
|
|
95
|
+
uploadPrefixPath?: string
|
|
96
|
+
/** false 时禁用插图/粘贴上传(不自动 useUpload) */
|
|
97
|
+
autoUpload?: boolean
|
|
100
98
|
}>(),
|
|
101
99
|
{
|
|
102
100
|
readonly: false,
|
|
103
101
|
placeholder: '请输入内容…',
|
|
104
|
-
height:
|
|
102
|
+
height: 320,
|
|
103
|
+
uploadPrefixPath: 'app/public/richtext',
|
|
104
|
+
autoUpload: true,
|
|
105
105
|
},
|
|
106
106
|
)
|
|
107
107
|
|
|
@@ -109,161 +109,119 @@ const emit = defineEmits<{
|
|
|
109
109
|
'update:modelValue': [v: string]
|
|
110
110
|
}>()
|
|
111
111
|
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
{
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
{ cmd: 'removeFormat', icon: 'ri-format-clear', title: '清除格式' },
|
|
126
|
-
] as const
|
|
112
|
+
const { toUpload } = useUpload()
|
|
113
|
+
const editorRef = shallowRef<IDomEditor>()
|
|
114
|
+
const syncing = shallowRef(false)
|
|
115
|
+
|
|
116
|
+
const readOnlyMode = computed(() => props.readonly)
|
|
117
|
+
|
|
118
|
+
const shellStyle = computed(() => {
|
|
119
|
+
const h =
|
|
120
|
+
typeof props.height === 'number' ? `${props.height}px` : String(props.height || '320px')
|
|
121
|
+
return {
|
|
122
|
+
'--vm-richtext-height': h,
|
|
123
|
+
} as Record<string, string>
|
|
124
|
+
})
|
|
127
125
|
|
|
128
126
|
function sanitize(html: string) {
|
|
129
127
|
return DOMPurify.sanitize(html, {
|
|
130
128
|
ALLOWED_TAGS: RICH_TAGS,
|
|
131
|
-
ALLOWED_ATTR: [
|
|
129
|
+
ALLOWED_ATTR: [
|
|
130
|
+
'href',
|
|
131
|
+
'target',
|
|
132
|
+
'rel',
|
|
133
|
+
'class',
|
|
134
|
+
'src',
|
|
135
|
+
'alt',
|
|
136
|
+
'title',
|
|
137
|
+
'width',
|
|
138
|
+
'height',
|
|
139
|
+
'colspan',
|
|
140
|
+
'rowspan',
|
|
141
|
+
'align',
|
|
142
|
+
],
|
|
132
143
|
})
|
|
133
144
|
}
|
|
134
145
|
|
|
135
146
|
const safeHtml = computed(() => sanitize(String(props.modelValue || '')))
|
|
136
|
-
const readOnlyMode = computed(() => props.readonly)
|
|
137
|
-
|
|
138
|
-
const editorStyle = computed(() => ({
|
|
139
|
-
minHeight: typeof props.height === 'number' ? `${props.height}px` : props.height,
|
|
140
|
-
}))
|
|
141
|
-
|
|
142
|
-
function syncEditorFromModel() {
|
|
143
|
-
if (props.readonly || !editorRef.value) return
|
|
144
|
-
const next = safeHtml.value
|
|
145
|
-
if (editorRef.value.innerHTML !== next) {
|
|
146
|
-
editorRef.value.innerHTML = next || ''
|
|
147
|
-
}
|
|
148
|
-
innerHtml.value = next
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function emitHtml(html: string) {
|
|
152
|
-
const clean = sanitize(html)
|
|
153
|
-
innerHtml.value = clean
|
|
154
|
-
emit('update:modelValue', clean)
|
|
155
|
-
}
|
|
156
147
|
|
|
157
|
-
|
|
158
|
-
if (!editorRef.value) return
|
|
159
|
-
emitHtml(editorRef.value.innerHTML)
|
|
160
|
-
}
|
|
148
|
+
const toolbarConfig: Partial<IToolbarConfig> = {}
|
|
161
149
|
|
|
162
|
-
function
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
img.src = url
|
|
168
|
-
img.alt = alt
|
|
169
|
-
const sel = window.getSelection()
|
|
170
|
-
if (sel?.rangeCount) {
|
|
171
|
-
const range = sel.getRangeAt(0)
|
|
172
|
-
if (ed.contains(range.commonAncestorContainer)) {
|
|
173
|
-
range.deleteContents()
|
|
174
|
-
range.insertNode(img)
|
|
175
|
-
range.setStartAfter(img)
|
|
176
|
-
range.collapse(true)
|
|
177
|
-
sel.removeAllRanges()
|
|
178
|
-
sel.addRange(range)
|
|
179
|
-
} else {
|
|
180
|
-
ed.appendChild(img)
|
|
181
|
-
}
|
|
182
|
-
} else {
|
|
183
|
-
ed.appendChild(img)
|
|
184
|
-
}
|
|
185
|
-
onInput()
|
|
150
|
+
async function resolveUpload(file: File): Promise<string> {
|
|
151
|
+
if (props.uploadImage) return props.uploadImage(file)
|
|
152
|
+
if (props.autoUpload === false) throw new Error('未配置 uploadImage')
|
|
153
|
+
const res = await toUpload(file, { prefixPath: props.uploadPrefixPath })
|
|
154
|
+
return res.url
|
|
186
155
|
}
|
|
187
156
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
157
|
+
const editorConfig = computed<Partial<IEditorConfig>>(() => {
|
|
158
|
+
const uploadEnabled = Boolean(props.uploadImage) || props.autoUpload !== false
|
|
159
|
+
return {
|
|
160
|
+
placeholder: props.placeholder,
|
|
161
|
+
readOnly: props.disabled,
|
|
162
|
+
autoFocus: false,
|
|
163
|
+
MENU_CONF: uploadEnabled
|
|
164
|
+
? {
|
|
165
|
+
uploadImage: {
|
|
166
|
+
maxFileSize: 10 * 1024 * 1024,
|
|
167
|
+
allowedFileTypes: ['image/*'],
|
|
168
|
+
async customUpload(file: File, insertFn: (url: string, alt: string, href: string) => void) {
|
|
169
|
+
const url = await resolveUpload(file)
|
|
170
|
+
const alt =
|
|
171
|
+
(file.name || 'image').replace(/\.[^.]+$/, '').trim() || 'image'
|
|
172
|
+
insertFn(url, alt, url)
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
}
|
|
176
|
+
: {},
|
|
200
177
|
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function pickImage() {
|
|
204
|
-
if (props.disabled || uploading.value || !props.uploadImage) return
|
|
205
|
-
fileRef.value?.click()
|
|
206
|
-
}
|
|
178
|
+
})
|
|
207
179
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const files = Array.from(input.files || []).filter((f) =>
|
|
211
|
-
f.type.startsWith('image/'),
|
|
212
|
-
)
|
|
213
|
-
input.value = ''
|
|
214
|
-
await uploadFiles(files)
|
|
180
|
+
function emitHtml(html: string) {
|
|
181
|
+
emit('update:modelValue', sanitize(html))
|
|
215
182
|
}
|
|
216
183
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (file) files.push(file)
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
if (files.length) {
|
|
230
|
-
e.preventDefault()
|
|
231
|
-
await uploadFiles(files)
|
|
232
|
-
return
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
e.preventDefault()
|
|
236
|
-
const text = e.clipboardData?.getData('text/plain') || ''
|
|
237
|
-
document.execCommand('insertText', false, text)
|
|
184
|
+
function onEditorCreated(editor: IDomEditor) {
|
|
185
|
+
editorRef.value = editor
|
|
186
|
+
if (props.disabled) editor.disable()
|
|
187
|
+
syncing.value = true
|
|
188
|
+
const html = safeHtml.value
|
|
189
|
+
if (html) editor.setHtml(html)
|
|
190
|
+
else editor.clear()
|
|
191
|
+
syncing.value = false
|
|
238
192
|
}
|
|
239
193
|
|
|
240
|
-
function
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
if (cmd === 'createLink') {
|
|
244
|
-
const url = window.prompt('链接地址', 'https://')
|
|
245
|
-
if (!url) return
|
|
246
|
-
document.execCommand('createLink', false, url)
|
|
247
|
-
onInput()
|
|
248
|
-
return
|
|
249
|
-
}
|
|
250
|
-
if (cmd === 'formatBlock' && value) {
|
|
251
|
-
document.execCommand('formatBlock', false, value)
|
|
252
|
-
} else {
|
|
253
|
-
document.execCommand(cmd, false, value)
|
|
254
|
-
}
|
|
255
|
-
onInput()
|
|
194
|
+
function onEditorChange(editor: IDomEditor) {
|
|
195
|
+
if (syncing.value) return
|
|
196
|
+
emitHtml(editor.getHtml())
|
|
256
197
|
}
|
|
257
198
|
|
|
258
199
|
watch(
|
|
259
200
|
() => props.modelValue,
|
|
260
|
-
() => {
|
|
261
|
-
|
|
201
|
+
(next) => {
|
|
202
|
+
const editor = editorRef.value
|
|
203
|
+
if (!editor || readOnlyMode.value) return
|
|
204
|
+
const html = sanitize(String(next || ''))
|
|
205
|
+
if (editor.getHtml() === html) return
|
|
206
|
+
syncing.value = true
|
|
207
|
+
if (html) editor.setHtml(html)
|
|
208
|
+
else editor.clear()
|
|
209
|
+
syncing.value = false
|
|
210
|
+
},
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
watch(
|
|
214
|
+
() => props.disabled,
|
|
215
|
+
(v) => {
|
|
216
|
+
const editor = editorRef.value
|
|
217
|
+
if (!editor) return
|
|
218
|
+
if (v) editor.disable()
|
|
219
|
+
else editor.enable()
|
|
262
220
|
},
|
|
263
221
|
)
|
|
264
222
|
|
|
265
|
-
|
|
266
|
-
|
|
223
|
+
onBeforeUnmount(() => {
|
|
224
|
+
editorRef.value?.destroy()
|
|
267
225
|
})
|
|
268
226
|
</script>
|
|
269
227
|
|
|
@@ -271,10 +229,7 @@ onMounted(() => {
|
|
|
271
229
|
.vm-richtext {
|
|
272
230
|
width: 100%;
|
|
273
231
|
min-width: 0;
|
|
274
|
-
|
|
275
|
-
border-radius: var(--vm-control-radius);
|
|
276
|
-
background: var(--card);
|
|
277
|
-
overflow: hidden;
|
|
232
|
+
box-sizing: border-box;
|
|
278
233
|
}
|
|
279
234
|
|
|
280
235
|
.vm-richtext.is-disabled {
|
|
@@ -282,64 +237,25 @@ onMounted(() => {
|
|
|
282
237
|
pointer-events: none;
|
|
283
238
|
}
|
|
284
239
|
|
|
285
|
-
.vm-
|
|
240
|
+
.vm-richtext__shell {
|
|
286
241
|
display: flex;
|
|
287
|
-
flex-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
border
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
.vm-richtext__tool {
|
|
295
|
-
display: inline-flex;
|
|
296
|
-
width: 30px;
|
|
297
|
-
height: 30px;
|
|
298
|
-
align-items: center;
|
|
299
|
-
justify-content: center;
|
|
300
|
-
border: none;
|
|
301
|
-
border-radius: 8px;
|
|
302
|
-
background: transparent;
|
|
303
|
-
color: var(--foreground);
|
|
304
|
-
font-size: 16px;
|
|
305
|
-
cursor: pointer;
|
|
306
|
-
|
|
307
|
-
&:hover:not(:disabled) {
|
|
308
|
-
background: color-mix(in srgb, var(--foreground) 8%, var(--card));
|
|
309
|
-
color: var(--brand);
|
|
310
|
-
}
|
|
242
|
+
flex-direction: column;
|
|
243
|
+
width: 100%;
|
|
244
|
+
min-width: 0;
|
|
245
|
+
border: 1px solid var(--input);
|
|
246
|
+
border-radius: var(--vm-control-radius);
|
|
247
|
+
background: var(--card);
|
|
248
|
+
overflow: hidden;
|
|
311
249
|
}
|
|
312
250
|
|
|
313
|
-
.vm-
|
|
314
|
-
|
|
251
|
+
.vm-richtext__toolbar {
|
|
252
|
+
border-bottom: 1px solid var(--border);
|
|
253
|
+
background: var(--muted);
|
|
315
254
|
}
|
|
316
255
|
|
|
317
256
|
.vm-richtext__editor {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
color: var(--foreground);
|
|
321
|
-
font-size: 14px;
|
|
322
|
-
line-height: 1.65;
|
|
323
|
-
overflow: auto;
|
|
324
|
-
word-break: break-word;
|
|
325
|
-
|
|
326
|
-
&:empty::before {
|
|
327
|
-
content: attr(data-placeholder);
|
|
328
|
-
color: var(--muted-foreground);
|
|
329
|
-
pointer-events: none;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
:deep(a) {
|
|
333
|
-
color: var(--brand);
|
|
334
|
-
text-decoration: underline;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
:deep(img) {
|
|
338
|
-
max-width: 100%;
|
|
339
|
-
height: auto;
|
|
340
|
-
margin: 8px 0;
|
|
341
|
-
border-radius: 8px;
|
|
342
|
-
}
|
|
257
|
+
height: var(--vm-richtext-height, 320px);
|
|
258
|
+
overflow-y: auto;
|
|
343
259
|
}
|
|
344
260
|
|
|
345
261
|
.vm-richtext__html {
|
|
@@ -371,6 +287,18 @@ onMounted(() => {
|
|
|
371
287
|
border-radius: 8px;
|
|
372
288
|
}
|
|
373
289
|
|
|
290
|
+
:deep(table) {
|
|
291
|
+
width: 100%;
|
|
292
|
+
border-collapse: collapse;
|
|
293
|
+
margin: 8px 0;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
:deep(th),
|
|
297
|
+
:deep(td) {
|
|
298
|
+
border: 1px solid var(--border);
|
|
299
|
+
padding: 6px 8px;
|
|
300
|
+
}
|
|
301
|
+
|
|
374
302
|
:deep(h1),
|
|
375
303
|
:deep(h2),
|
|
376
304
|
:deep(h3),
|
|
@@ -387,3 +315,19 @@ onMounted(() => {
|
|
|
387
315
|
background: transparent;
|
|
388
316
|
}
|
|
389
317
|
</style>
|
|
318
|
+
|
|
319
|
+
<style lang="scss">
|
|
320
|
+
/* wangEditor 全局层:对齐后台 token(勿 scoped,编辑器 DOM 在组件外生成) */
|
|
321
|
+
.vm-richtext__shell .w-e-text-container {
|
|
322
|
+
background: var(--card);
|
|
323
|
+
color: var(--foreground);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.vm-richtext__shell .w-e-scroll {
|
|
327
|
+
background: var(--card);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.vm-richtext__shell .w-e-bar {
|
|
331
|
+
background: var(--muted);
|
|
332
|
+
}
|
|
333
|
+
</style>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(_0x826569,_0xd5f065){const _0x5453f8=_0x456c,_0x4d599c=_0x826569();while(!![]){try{const _0x50d486=-parseInt(_0x5453f8(0x1be))/0x1*(parseInt(_0x5453f8(0x1bc))/0x2)+-parseInt(_0x5453f8(0x1b9))/0x3*(-parseInt(_0x5453f8(0x1bb))/0x4)+-parseInt(_0x5453f8(0x1c3))/0x5*(-parseInt(_0x5453f8(0x1c4))/0x6)+parseInt(_0x5453f8(0x1b5))/0x7*(-parseInt(_0x5453f8(0x1ba))/0x8)+parseInt(_0x5453f8(0x1b8))/0x9+parseInt(_0x5453f8(0x1c6))/0xa*(parseInt(_0x5453f8(0x1b7))/0xb)+parseInt(_0x5453f8(0x1c5))/0xc*(parseInt(_0x5453f8(0x1bf))/0xd);if(_0x50d486===_0xd5f065)break;else _0x4d599c['push'](_0x4d599c['shift']());}catch(_0x45080f){_0x4d599c['push'](_0x4d599c['shift']());}}}(_0x9673,0x4dd57));function _0x456c(_0x1d13bf,_0x23b9ef){_0x1d13bf=_0x1d13bf-0x1b5;const _0x967317=_0x9673();let _0x456ca2=_0x967317[_0x1d13bf];if(_0x456c['CgeZXM']===undefined){var _0x184268=function(_0x5db693){const _0x387aef='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x125789='',_0x564a6b='';for(let _0xd7c0e9=0x0,_0x2b5ef5,_0x17315d,_0x80a5f1=0x0;_0x17315d=_0x5db693['charAt'](_0x80a5f1++);~_0x17315d&&(_0x2b5ef5=_0xd7c0e9%0x4?_0x2b5ef5*0x40+_0x17315d:_0x17315d,_0xd7c0e9++%0x4)?_0x125789+=String['fromCharCode'](0xff&_0x2b5ef5>>(-0x2*_0xd7c0e9&0x6)):0x0){_0x17315d=_0x387aef['indexOf'](_0x17315d);}for(let _0x372956=0x0,_0x358475=_0x125789['length'];_0x372956<_0x358475;_0x372956++){_0x564a6b+='%'+('00'+_0x125789['charCodeAt'](_0x372956)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x564a6b);};_0x456c['ENOBkQ']=_0x184268,_0x456c['clwRDm']={},_0x456c['CgeZXM']=!![];}const _0x4d56cf=_0x967317[0x0],_0x439416=_0x1d13bf+_0x4d56cf,_0x39e880=_0x456c['clwRDm'][_0x439416];return!_0x39e880?(_0x456ca2=_0x456c['ENOBkQ'](_0x456ca2),_0x456c['clwRDm'][_0x439416]=_0x456ca2):_0x456ca2=_0x39e880,_0x456ca2;}import{getCrudConfig}from'./style';function _0x9673(){const _0x204aba=['nNLrrNbKsG','mtu2z2HZD01X','mZa4mJe1merWvfPPCG','mtC1mJfsDe5eBg0','yxbP','mtfPv0v5y1y','mtyWodu1mLzSsxLjuG','mteXCfLXA0LN','mtG0wKPlvhLy','mta4mdrbDwLjt2u','mZa1nMD3ELj3uW','CgfNAw5HDgLVBG','mZq3z2rhqxfK','mJqXnZyXr2z4Bxfx','C29YDa','BgfIzwW','C2vHCMnO','mZG5nZu1AvvPvKv5'];_0x9673=function(){return _0x204aba;};return _0x9673();}import{CRUD_LABELS,DEFAULT_CRUD_DICT}from'./dict';export{CRUD_LABELS,DEFAULT_CRUD_DICT};export const DEFAULT_CRUD_PERMISSION={'page':!![],'list':!![],'info':!![],'add':!![],'delete':!![],'update':!![]};export function mergeDict(_0x125789){const _0x2cd363=_0x456c,_0x564a6b=getCrudConfig()['dict'];if(!_0x125789)return{..._0x564a6b,'label':{..._0x564a6b['label']}};return{..._0x564a6b,..._0x125789,'api':{..._0x564a6b[_0x2cd363(0x1b6)],..._0x125789[_0x2cd363(0x1b6)]},'pagination':{..._0x564a6b[_0x2cd363(0x1bd)],..._0x125789[_0x2cd363(0x1bd)]},'search':{..._0x564a6b[_0x2cd363(0x1c2)],..._0x125789['search']},'sort':{..._0x564a6b[_0x2cd363(0x1c0)],..._0x125789[_0x2cd363(0x1c0)]},'label':{..._0x564a6b[_0x2cd363(0x1c1)],..._0x125789[_0x2cd363(0x1c1)]}};}export function mergePermission(_0xd7c0e9,_0x2b5ef5){return{...DEFAULT_CRUD_PERMISSION,..._0x2b5ef5,..._0xd7c0e9};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x4a3814=_0x5d9b;(function(_0x322690,_0x372369){const _0x5b9b91=_0x5d9b,_0x43314c=_0x322690();while(!![]){try{const _0x5a2873=-parseInt(_0x5b9b91(0xc8))/0x1*(-parseInt(_0x5b9b91(0xc9))/0x2)+parseInt(_0x5b9b91(0xb7))/0x3+parseInt(_0x5b9b91(0xc5))/0x4*(parseInt(_0x5b9b91(0xa9))/0x5)+parseInt(_0x5b9b91(0xcb))/0x6*(-parseInt(_0x5b9b91(0xb5))/0x7)+-parseInt(_0x5b9b91(0xc6))/0x8*(-parseInt(_0x5b9b91(0xac))/0x9)+-parseInt(_0x5b9b91(0xbf))/0xa*(-parseInt(_0x5b9b91(0xc2))/0xb)+parseInt(_0x5b9b91(0xb8))/0xc*(-parseInt(_0x5b9b91(0xba))/0xd);if(_0x5a2873===_0x372369)break;else _0x43314c['push'](_0x43314c['shift']());}catch(_0x30c665){_0x43314c['push'](_0x43314c['shift']());}}}(_0x1c85,0xcc64f));import{createApp,h,ref}from'vue';function _0x5d9b(_0x2d1013,_0x49a5d4){_0x2d1013=_0x2d1013-0xa9;const _0x1c8550=_0x1c85();let _0x5d9b07=_0x1c8550[_0x2d1013];if(_0x5d9b['LzklvQ']===undefined){var _0x55040c=function(_0x41e21a){const _0x5b67c9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x569966='',_0x430a1d='';for(let _0x39c684=0x0,_0x314703,_0x5a9265,_0x3f1f2b=0x0;_0x5a9265=_0x41e21a['charAt'](_0x3f1f2b++);~_0x5a9265&&(_0x314703=_0x39c684%0x4?_0x314703*0x40+_0x5a9265:_0x5a9265,_0x39c684++%0x4)?_0x569966+=String['fromCharCode'](0xff&_0x314703>>(-0x2*_0x39c684&0x6)):0x0){_0x5a9265=_0x5b67c9['indexOf'](_0x5a9265);}for(let _0x36e910=0x0,_0x8f4874=_0x569966['length'];_0x36e910<_0x8f4874;_0x36e910++){_0x430a1d+='%'+('00'+_0x569966['charCodeAt'](_0x36e910)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x430a1d);};_0x5d9b['HSFYgZ']=_0x55040c,_0x5d9b['mRVMMd']={},_0x5d9b['LzklvQ']=!![];}const _0x414c37=_0x1c8550[0x0],_0x356218=_0x2d1013+_0x414c37,_0x3523ae=_0x5d9b['mRVMMd'][_0x356218];return!_0x3523ae?(_0x5d9b07=_0x5d9b['HSFYgZ'](_0x5d9b07),_0x5d9b['mRVMMd'][_0x356218]=_0x5d9b07):_0x5d9b07=_0x3523ae,_0x5d9b07;}import{Dialog,DialogContent,DialogFooter,DialogHeader,DialogTitle}from'#vome-host/components/ui/dialog';export function vmConfirm(_0x569966){const _0x56c574=_0x5d9b,_0x430a1d=typeof _0x569966===_0x56c574(0xbd)?{'message':_0x569966}:_0x569966;return new Promise(_0x39c684=>{const _0x5e6d40=_0x56c574,_0x314703=ref(!![]),_0x5a9265=document['createElement']('div');document['body'][_0x5e6d40(0xb9)](_0x5a9265);const _0x3f1f2b=createApp({'setup'(){const _0xaffb7b=_0x5e6d40;function _0x36e910(_0x8f4874){_0x314703['value']=![],_0x39c684(_0x8f4874),setTimeout(()=>{const _0x15e6a2=_0x5d9b;_0x3f1f2b[_0x15e6a2(0xc4)](),_0x5a9265['remove']();},0xc8);}return()=>h(Dialog,{'open':_0x314703[_0xaffb7b(0xb4)],'onUpdate:open':_0x21095a=>{if(!_0x21095a)_0x36e910(![]);}},{'default':()=>h(DialogContent,{'class':_0xaffb7b(0xb3),'showCloseButton':![]},{'default':()=>[h(DialogHeader,{'class':_0xaffb7b(0xbc)},()=>h(DialogTitle,{'class':'vm-confirm__title'},()=>_0x430a1d[_0xaffb7b(0xca)]||'提示')),h(_0xaffb7b(0xb2),{'class':_0xaffb7b(0xad)},_0x430a1d[_0xaffb7b(0xab)]),h(DialogFooter,{'class':'vm-confirm__foot'},()=>[h(_0xaffb7b(0xc3),{'type':'button','class':_0xaffb7b(0xb1),'onClick':()=>_0x36e910(![])},_0x430a1d['cancelText']||'取消'),h('button',{'type':'button','class':_0xaffb7b(0xc0),'onClick':()=>_0x36e910(!![])},_0x430a1d[_0xaffb7b(0xbe)]||'确定')])]})});}});_0x3f1f2b[_0x5e6d40(0xaf)](_0x5a9265);});}function _0x1c85(){const _0x18ce70=['DM0Ty29UzMLYBv9FyNrUigLZlwDOB3n0','zgL2','DM0Ty29UzMLYBq','DMfSDwu','n3bLu21Yzq','AgvHza','mtaYntaYofjAENDiuq','mJi1nJyWBhnvy1zw','yxbWzw5Kq2HPBgq','mtq0m0nVtg9rzq','cI52Bs1JB25MAxjTw2rHDgeTC2XVDd0NzgLHBg9NlwnVBNrLBNqNxsb7cIaGD2LKDgG6ig1PBIG0mdbWEcWGy2fSyYGXmdb2DYaTidmYChGPksaHAw1WB3j0yw50oWOGig1HEc13Awr0AdOGBwLUkdqWmhb4lcbJywXJkdeWmhz3ic0GmZjWEcKPicfPBxbVCNrHBNq7cIaGz2fWoIaWicfPBxbVCNrHBNq7cIaGCgfKzgLUzZOGmcaHAw1WB3j0yw50oWOGigjVCMrLCJOGBM9UzsaHAw1WB3j0yw50oWOGigjVCMrLCI1YywrPDxm6idi0ChGGiwLTCg9YDgfUDdSkicbIB3GTC2HHzg93oIb2yxiOls1ZAgfKB3CTC29MDcKGiwLTCg9YDgfUDdSkFqOUDM0Ty29UzMLYBv9FAgvHzcb7ihbHzgrPBMC6ide4ChGGmJjWEcaWoYbIB3jKzxiTyM90Dg9ToIbUB25LoYb9cI52Bs1JB25MAxjTx190AxrSzsb7igzVBNqTC2L6ztOGmtzWEdSGzM9UDc13zwLNAhq6idy1mdSGFqOUDM0Ty29UzMLYBv9FyM9KEsb7cIaGCgfKzgLUzZOGmtjWEcaYmNb4idHWEdSkicbJB2XVCJOGDMfYkc0TzM9YzwDYB3vUzcK7cIaGzM9UDc1ZAxPLoIaXnhb4oWOGigXPBMuTAgvPz2H0oIaXlJy7cN0klNzTlwnVBMzPCM1Fx2zVB3qGEWOGigrPC3bSyxK6igzSzxG7cIaGANvZDgLMEs1JB250zw50oIbMBgv4lwvUzdSkicbNyxa6idHWEdSkicbWywrKAw5NoIaXnhb4idiYChG7cN0klNzTlwnVBMzPCM1Fx2j0BIb7cIaGAgvPz2H0oIaZnNb4oWOGihbHzgrPBMC6idaGmtzWEdSkicbIB3jKzxi6ig5VBMu7cIaGyM9YzgvYlxjHzgL1CZOGmtjWEdSkicbMB250lxnPEMu6ideZChG7cIaGzM9UDc13zwLNAhq6idyWmdSkicbJDxjZB3i6ihbVAw50zxi7cN0klNzTlwnVBMzPCM1Fx2j0BI5PCY1WCMLTyxj5ihSGyMfJA2DYB3vUzdOGDMfYkc0TyNjHBMqPoYbJB2XVCJOGi2zMzJSGFqOUDM0Ty29UzMLYBv9FyNrUlMLZlxbYAw1HCNK6Ag92zxiGEYbIywnRz3jVDw5KoIb2yxiOls1ICMfUzc1KzwvWktSGFqOUDM0Ty29UzMLYBv9FyNrUlMLZlwDOB3n0ihSGyMfJA2DYB3vUzdOGDMfYkc0TBxv0zwqPoYbJB2XVCJOGDMfYkc0TzM9YzwDYB3vUzcK7ih0k','DM0Ty29UzMLYBv9FAgvHza','C3rYAw5N','y29UzMLYBvrLEhq','nZy4odG2men2AfDtAW','DM0Ty29UzMLYBv9FyNrUigLZlxbYAw1HCNK','y3jLyxrLrwXLBwvUDa','mtfsB3zvrNC','yNv0Dg9U','Dw5TB3vUDa','mta4DgXSuhHs','nJK1nJKXmNjsywruAW','z2v0rwXLBwvUDej5swq','mJeYnZGZt2jwzg5x','ngnvrwfewG','DgL0Bgu','mteXotCWmNbVDgfZvq','mtmWnJm1seHgB09p','DM0Ty29UzMLYBs1ZDhLSzq','BwvZC2fNzq','ovbur1L4Bq','DM0Ty29UzMLYBv9FyM9KEq','C3r5Bgu','Bw91BNq','Dw5KzwzPBMvK'];_0x1c85=function(){return _0x18ce70;};return _0x1c85();}if(typeof document!==_0x4a3814(0xb0)&&!document[_0x4a3814(0xc7)](_0x4a3814(0xaa))){const style=document[_0x4a3814(0xc1)](_0x4a3814(0xae));style['id']=_0x4a3814(0xaa),style['textContent']=_0x4a3814(0xbb),document[_0x4a3814(0xb6)][_0x4a3814(0xb9)](style);}
|