vue-editify 0.1.10 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. package/examples/App.vue +21 -96
  2. package/examples/main.ts +4 -0
  3. package/lib/components/button/button.vue.d.ts +143 -0
  4. package/lib/components/button/props.d.ts +73 -0
  5. package/lib/components/checkbox/checkbox.vue.d.ts +80 -0
  6. package/lib/components/checkbox/props.d.ts +36 -0
  7. package/lib/components/colors/colors.vue.d.ts +47 -0
  8. package/lib/components/colors/props.d.ts +22 -0
  9. package/lib/components/icon/icon.vue.d.ts +14 -0
  10. package/lib/components/icon/props.d.ts +9 -0
  11. package/lib/components/insertImage/insertImage.vue.d.ts +74 -0
  12. package/lib/components/insertImage/props.d.ts +34 -0
  13. package/lib/components/insertLink/insertLink.vue.d.ts +27 -0
  14. package/lib/components/insertLink/props.d.ts +13 -0
  15. package/lib/components/insertTable/insertTable.vue.d.ts +36 -0
  16. package/lib/components/insertTable/props.d.ts +22 -0
  17. package/lib/components/insertVideo/insertVideo.vue.d.ts +74 -0
  18. package/lib/components/insertVideo/props.d.ts +34 -0
  19. package/lib/components/layer/layer.vue.d.ts +129 -0
  20. package/lib/components/layer/props.d.ts +53 -0
  21. package/lib/components/menu/menu.vue.d.ts +25 -0
  22. package/lib/components/menu/props.d.ts +14 -0
  23. package/lib/components/toolbar/props.d.ts +27 -0
  24. package/lib/components/toolbar/toolbar.vue.d.ts +56 -0
  25. package/lib/components/tooltip/props.d.ts +17 -0
  26. package/lib/components/tooltip/tooltip.vue.d.ts +39 -0
  27. package/lib/components/triangle/props.d.ts +19 -0
  28. package/lib/components/triangle/triangle.vue.d.ts +34 -0
  29. package/lib/core/function.d.ts +45 -0
  30. package/lib/core/rule.d.ts +9 -0
  31. package/lib/core/tool.d.ts +185 -0
  32. package/lib/editify/editify.vue.d.ts +676 -0
  33. package/lib/editify/props.d.ts +110 -0
  34. package/lib/editify.es.js +5541 -5661
  35. package/lib/editify.umd.js +1 -1
  36. package/lib/hljs/index.d.ts +7 -0
  37. package/lib/index.d.ts +17 -0
  38. package/lib/locale/en_US.d.ts +3 -0
  39. package/lib/locale/index.d.ts +2 -0
  40. package/lib/locale/zh_CN.d.ts +3 -0
  41. package/lib/style.css +1 -1
  42. package/package.json +16 -8
  43. package/src/components/button/button.less +145 -0
  44. package/src/components/button/button.vue +197 -0
  45. package/src/components/button/props.ts +95 -0
  46. package/src/components/checkbox/checkbox.less +84 -0
  47. package/src/components/checkbox/checkbox.vue +68 -0
  48. package/src/components/checkbox/props.ts +49 -0
  49. package/src/components/colors/colors.less +75 -0
  50. package/src/components/colors/colors.vue +36 -0
  51. package/src/components/colors/props.ts +29 -0
  52. package/src/components/{base/Icon.vue → icon/icon.less} +0 -17
  53. package/src/components/icon/icon.vue +12 -0
  54. package/src/components/icon/props.ts +11 -0
  55. package/src/components/insertImage/insertImage.less +135 -0
  56. package/src/components/insertImage/insertImage.vue +146 -0
  57. package/src/components/insertImage/props.ts +43 -0
  58. package/src/components/insertLink/insertLink.less +64 -0
  59. package/src/components/insertLink/insertLink.vue +58 -0
  60. package/src/components/insertLink/props.ts +16 -0
  61. package/src/components/insertTable/insertTable.less +54 -0
  62. package/src/components/insertTable/insertTable.vue +85 -0
  63. package/src/components/insertTable/props.ts +27 -0
  64. package/src/components/insertVideo/insertVideo.less +135 -0
  65. package/src/components/insertVideo/insertVideo.vue +146 -0
  66. package/src/components/insertVideo/props.ts +43 -0
  67. package/src/components/layer/layer.less +49 -0
  68. package/src/components/layer/layer.vue +598 -0
  69. package/src/components/layer/props.ts +71 -0
  70. package/src/components/menu/menu.less +64 -0
  71. package/src/components/menu/menu.vue +1570 -0
  72. package/src/components/menu/props.ts +17 -0
  73. package/src/components/toolbar/props.ts +35 -0
  74. package/src/components/toolbar/toolbar.less +89 -0
  75. package/src/components/toolbar/toolbar.vue +1101 -0
  76. package/src/components/tooltip/props.ts +21 -0
  77. package/src/components/tooltip/tooltip.less +23 -0
  78. package/src/components/tooltip/tooltip.vue +37 -0
  79. package/src/components/triangle/props.ts +26 -0
  80. package/src/components/triangle/triangle.less +79 -0
  81. package/src/components/triangle/triangle.vue +65 -0
  82. package/src/core/{function.js → function.ts} +268 -267
  83. package/src/core/{rule.js → rule.ts} +33 -33
  84. package/src/core/{tool.js → tool.ts} +221 -145
  85. package/src/editify/editify.less +404 -0
  86. package/src/editify/editify.vue +805 -0
  87. package/src/editify/props.ts +141 -0
  88. package/src/hljs/{index.js → index.ts} +7 -4
  89. package/src/index.ts +32 -0
  90. package/src/locale/{en_US.js → en_US.ts} +3 -1
  91. package/src/locale/index.ts +12 -0
  92. package/src/locale/{zh_CN.js → zh_CN.ts} +3 -1
  93. package/tsconfig.json +27 -0
  94. package/tsconfig.node.json +11 -0
  95. package/vite-env.d.ts +1 -0
  96. package/vite.config.ts +39 -0
  97. package/examples/main.js +0 -4
  98. package/src/Editify.vue +0 -1184
  99. package/src/components/Menu.vue +0 -1623
  100. package/src/components/Toolbar.vue +0 -1215
  101. package/src/components/base/Button.vue +0 -450
  102. package/src/components/base/Checkbox.vue +0 -196
  103. package/src/components/base/Layer.vue +0 -713
  104. package/src/components/base/Tooltip.vue +0 -82
  105. package/src/components/base/Triangle.vue +0 -159
  106. package/src/components/common/Colors.vue +0 -138
  107. package/src/components/common/InsertImage.vue +0 -316
  108. package/src/components/common/InsertLink.vue +0 -136
  109. package/src/components/common/InsertTable.vue +0 -157
  110. package/src/components/common/InsertVideo.vue +0 -316
  111. package/src/index.js +0 -24
  112. package/src/locale/index.js +0 -14
@@ -0,0 +1,1570 @@
1
+ <template>
2
+ <div class="editify-menu" :class="{ border: menuShowBorder, source: isSourceView && menuMode == 'inner', fullscreen: isFullScreen }" :data-editify-mode="menuMode" :style="config.style || ''">
3
+ <MenuItem v-for="item in menuNames" :name="item" :disabled="menuDisabled(item)"></MenuItem>
4
+ </div>
5
+ </template>
6
+ <script setup lang="ts">
7
+ import Icon from '../icon/icon.vue'
8
+ import Layer from '../layer/layer.vue'
9
+ import Button from '../button/button.vue'
10
+ import Colors from '../colors/colors.vue'
11
+ import InsertLink from '../insertLink/insertLink.vue'
12
+ import InsertImage from '../insertImage/insertImage.vue'
13
+ import InsertVideo from '../insertVideo/insertVideo.vue'
14
+ import InsertTable from '../insertTable/insertTable.vue'
15
+ import { h, getCurrentInstance, ref, computed, inject, ComponentInternalInstance, Ref, ComputedRef, defineComponent } from 'vue'
16
+ import { common as DapCommon } from 'dap-util'
17
+ import { getRangeText, setHeading, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setTextStyle, setTextMark, removeTextStyle, removeTextMark, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, hasPreInRange, hasTableInRange, hasQuoteInRange, hasLinkInRange, isRangeInQuote, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getCurrentParsedomElement } from '../../core/function'
18
+ import { MenuProps } from './props'
19
+ import { ObjectType } from 'alex-editor/lib/core/tool'
20
+ import { MenuModeType } from '../../core/tool'
21
+ import AlexEditor, { AlexElementsRangeType } from 'alex-editor'
22
+ import { ButtonOptionsItemType } from '../button/props'
23
+
24
+ defineOptions({
25
+ name: 'Menu'
26
+ })
27
+ const props = defineProps(MenuProps)
28
+
29
+ const editify = inject<ComponentInternalInstance>('editify')!
30
+ const isSourceView = inject<Ref<boolean>>('isSourceView')!
31
+ const isFullScreen = inject<Ref<boolean>>('isFullScreen')!
32
+ const canUseMenu = inject<Ref<boolean>>('canUseMenu')!
33
+ const editor = inject<Ref<AlexEditor>>('editor')!
34
+ const dataRangeCaches = inject<Ref<AlexElementsRangeType>>('dataRangeCaches')!
35
+ const showBorder = inject<ComputedRef<boolean>>('showBorder')!
36
+ const $editTrans = inject<(key: string) => any>('$editTrans')!
37
+
38
+ //撤销按钮配置
39
+ const undoConfig = ref<ObjectType>({
40
+ show: props.config.undo!.show,
41
+ leftBorder: props.config.undo!.leftBorder,
42
+ rightBorder: props.config.undo!.rightBorder,
43
+ active: false,
44
+ disabled: false
45
+ })
46
+ //重做按钮配置
47
+ const redoConfig = ref<ObjectType>({
48
+ show: props.config.redo!.show,
49
+ leftBorder: props.config.redo!.leftBorder,
50
+ rightBorder: props.config.redo!.rightBorder,
51
+ active: false,
52
+ disabled: false
53
+ })
54
+ //标题按钮配置
55
+ const headingConfig = ref<ObjectType>({
56
+ show: props.config.heading!.show,
57
+ displayConfig: {
58
+ options: props.config.heading!.options,
59
+ value: '',
60
+ width: props.config.heading!.width,
61
+ maxHeight: props.config.heading!.maxHeight
62
+ },
63
+ defaultValue: props.config.heading!.defaultValue,
64
+ leftBorder: props.config.heading!.leftBorder,
65
+ rightBorder: props.config.heading!.rightBorder,
66
+ active: false,
67
+ disabled: false
68
+ })
69
+ //缩进按钮配置
70
+ const indentConfig = ref<ObjectType>({
71
+ show: props.config.indent!.show,
72
+ selectConfig: {
73
+ options: props.config.indent!.options,
74
+ value: '',
75
+ width: props.config.indent!.width,
76
+ maxHeight: props.config.indent!.maxHeight
77
+ },
78
+ leftBorder: props.config.indent!.leftBorder,
79
+ rightBorder: props.config.indent!.rightBorder,
80
+ active: false,
81
+ disabled: false
82
+ })
83
+ //引用按钮配置
84
+ const quoteConfig = ref<ObjectType>({
85
+ show: props.config.quote!.show,
86
+ leftBorder: props.config.quote!.leftBorder,
87
+ rightBorder: props.config.quote!.rightBorder,
88
+ active: false,
89
+ disabled: false
90
+ })
91
+ //对齐方式按钮配置
92
+ const alignConfig = ref<ObjectType>({
93
+ show: props.config.align!.show,
94
+ selectConfig: {
95
+ options: props.config.align!.options,
96
+ width: props.config.align!.width,
97
+ maxHeight: props.config.align!.maxHeight
98
+ },
99
+ leftBorder: props.config.align!.leftBorder,
100
+ rightBorder: props.config.align!.rightBorder,
101
+ active: false,
102
+ disabled: false
103
+ })
104
+ //有序列表按钮配置
105
+ const orderListConfig = ref<ObjectType>({
106
+ show: props.config.orderList!.show,
107
+ leftBorder: props.config.orderList!.leftBorder,
108
+ rightBorder: props.config.orderList!.rightBorder,
109
+ active: false,
110
+ disabled: false
111
+ })
112
+ //无序列表按钮配置
113
+ const unorderListConfig = ref<ObjectType>({
114
+ show: props.config.unorderList!.show,
115
+ leftBorder: props.config.unorderList!.leftBorder,
116
+ rightBorder: props.config.unorderList!.rightBorder,
117
+ active: false,
118
+ disabled: false
119
+ })
120
+ //任务列表按钮配置
121
+ const taskConfig = ref<ObjectType>({
122
+ show: props.config.task!.show,
123
+ leftBorder: props.config.task!.leftBorder,
124
+ rightBorder: props.config.task!.rightBorder,
125
+ active: false,
126
+ disabled: false
127
+ })
128
+ //粗体按钮配置
129
+ const boldConfig = ref<ObjectType>({
130
+ show: props.config.bold!.show,
131
+ leftBorder: props.config.bold!.leftBorder,
132
+ rightBorder: props.config.bold!.rightBorder,
133
+ active: false,
134
+ disabled: false
135
+ })
136
+ //下划线按钮配置
137
+ const underlineConfig = ref<ObjectType>({
138
+ show: props.config.underline!.show,
139
+ leftBorder: props.config.underline!.leftBorder,
140
+ rightBorder: props.config.underline!.rightBorder,
141
+ active: false,
142
+ disabled: false
143
+ })
144
+ //斜体按钮配置
145
+ const italicConfig = ref<ObjectType>({
146
+ show: props.config.italic!.show,
147
+ leftBorder: props.config.italic!.leftBorder,
148
+ rightBorder: props.config.italic!.rightBorder,
149
+ active: false,
150
+ disabled: false
151
+ })
152
+ //删除线按钮配置
153
+ const strikethroughConfig = ref<ObjectType>({
154
+ show: props.config.strikethrough!.show,
155
+ leftBorder: props.config.strikethrough!.leftBorder,
156
+ rightBorder: props.config.strikethrough!.rightBorder,
157
+ active: false,
158
+ disabled: false
159
+ })
160
+ //行内代码按钮配置
161
+ const codeConfig = ref<ObjectType>({
162
+ show: props.config.code!.show,
163
+ leftBorder: props.config.code!.leftBorder,
164
+ rightBorder: props.config.code!.rightBorder,
165
+ active: false,
166
+ disabled: false
167
+ })
168
+ //上标按钮配置
169
+ const superConfig = ref<ObjectType>({
170
+ show: props.config.super!.show,
171
+ leftBorder: props.config.super!.leftBorder,
172
+ rightBorder: props.config.super!.rightBorder,
173
+ active: false,
174
+ disabled: false
175
+ })
176
+ //下标按钮配置
177
+ const subConfig = ref<ObjectType>({
178
+ show: props.config.sub!.show,
179
+ leftBorder: props.config.sub!.leftBorder,
180
+ rightBorder: props.config.sub!.rightBorder,
181
+ active: false,
182
+ disabled: false
183
+ })
184
+ //清除格式按钮配置
185
+ const formatClearConfig = ref<ObjectType>({
186
+ show: props.config.formatClear!.show,
187
+ leftBorder: props.config.formatClear!.leftBorder,
188
+ rightBorder: props.config.formatClear!.rightBorder,
189
+ active: false,
190
+ disabled: false
191
+ })
192
+ //字号按钮配置
193
+ const fontSizeConfig = ref<ObjectType>({
194
+ show: props.config.fontSize!.show,
195
+ displayConfig: {
196
+ options: props.config.fontSize!.options,
197
+ value: '',
198
+ width: props.config.fontSize!.width,
199
+ maxHeight: props.config.fontSize!.maxHeight
200
+ },
201
+ defaultValue: props.config.fontSize!.defaultValue,
202
+ leftBorder: props.config.fontSize!.leftBorder,
203
+ rightBorder: props.config.fontSize!.rightBorder,
204
+ active: false,
205
+ disabled: false
206
+ })
207
+ //字体按钮配置
208
+ const fontFamilyConfig = ref<ObjectType>({
209
+ show: props.config.fontFamily!.show,
210
+ displayConfig: {
211
+ options: props.config.fontFamily!.options,
212
+ value: '',
213
+ width: props.config.fontFamily!.width,
214
+ maxHeight: props.config.fontFamily!.maxHeight
215
+ },
216
+ defaultValue: props.config.fontFamily!.defaultValue,
217
+ leftBorder: props.config.fontFamily!.leftBorder,
218
+ rightBorder: props.config.fontFamily!.rightBorder,
219
+ active: false,
220
+ disabled: false
221
+ })
222
+ //行高按钮配置
223
+ const lineHeightConfig = ref<ObjectType>({
224
+ show: props.config.lineHeight!.show,
225
+ displayConfig: {
226
+ options: props.config.lineHeight!.options,
227
+ value: '',
228
+ width: props.config.lineHeight!.width,
229
+ maxHeight: props.config.lineHeight!.maxHeight
230
+ },
231
+ defaultValue: props.config.lineHeight!.defaultValue,
232
+ leftBorder: props.config.lineHeight!.leftBorder,
233
+ rightBorder: props.config.lineHeight!.rightBorder,
234
+ active: false,
235
+ disabled: false
236
+ })
237
+ //前景颜色按钮配置
238
+ const foreColorConfig = ref<ObjectType>({
239
+ show: props.config.foreColor!.show,
240
+ selectConfig: {
241
+ options: props.config.foreColor!.options
242
+ },
243
+ leftBorder: props.config.foreColor!.leftBorder,
244
+ rightBorder: props.config.foreColor!.rightBorder,
245
+ value: '', //选择的颜色值
246
+ active: false,
247
+ disabled: false
248
+ })
249
+ //背景颜色按钮配置
250
+ const backColorConfig = ref<ObjectType>({
251
+ show: props.config.backColor!.show,
252
+ selectConfig: {
253
+ options: props.config.backColor!.options
254
+ },
255
+ leftBorder: props.config.backColor!.leftBorder,
256
+ rightBorder: props.config.backColor!.rightBorder,
257
+ value: '', //选择的颜色值
258
+ active: false,
259
+ disabled: false
260
+ })
261
+ //链接按钮配置
262
+ const linkConfig = ref<ObjectType>({
263
+ show: props.config.link!.show,
264
+ leftBorder: props.config.link!.leftBorder,
265
+ rightBorder: props.config.link!.rightBorder,
266
+ active: false,
267
+ disabled: false,
268
+ text: '' //链接的文本
269
+ })
270
+ //插入图片按钮配置
271
+ const imageConfig = ref<ObjectType>({
272
+ show: props.config.image!.show,
273
+ leftBorder: props.config.image!.leftBorder,
274
+ rightBorder: props.config.image!.rightBorder,
275
+ active: false,
276
+ disabled: false,
277
+ accept: props.config.image!.accept,
278
+ multiple: props.config.image!.multiple,
279
+ maxSize: props.config.image!.maxSize,
280
+ minSize: props.config.image!.minSize,
281
+ handleError: props.config.image!.handleError,
282
+ customUpload: props.config.image!.customUpload
283
+ })
284
+ //插入视频按钮配置
285
+ const videoConfig = ref<ObjectType>({
286
+ show: props.config.video!.show,
287
+ leftBorder: props.config.video!.leftBorder,
288
+ rightBorder: props.config.video!.rightBorder,
289
+ active: false,
290
+ disabled: false,
291
+ accept: props.config.video!.accept,
292
+ multiple: props.config.video!.multiple,
293
+ maxSize: props.config.video!.maxSize,
294
+ minSize: props.config.video!.minSize,
295
+ handleError: props.config.video!.handleError,
296
+ customUpload: props.config.video!.customUpload
297
+ })
298
+ //表格按钮配置
299
+ const tableConfig = ref<ObjectType>({
300
+ show: props.config.table!.show,
301
+ leftBorder: props.config.table!.leftBorder,
302
+ rightBorder: props.config.table!.rightBorder,
303
+ active: false,
304
+ disabled: false,
305
+ maxRows: props.config.table!.maxRows,
306
+ maxColumns: props.config.table!.maxColumns
307
+ })
308
+ //代码块按钮配置
309
+ const codeBlockConfig = ref<ObjectType>({
310
+ show: props.config.codeBlock!.show,
311
+ leftBorder: props.config.codeBlock!.leftBorder,
312
+ rightBorder: props.config.codeBlock!.rightBorder,
313
+ active: false,
314
+ disabled: false
315
+ })
316
+ //代码视图按钮配置
317
+ const sourceViewConfig = ref<ObjectType>({
318
+ show: props.config.sourceView!.show,
319
+ leftBorder: props.config.sourceView!.leftBorder,
320
+ rightBorder: props.config.sourceView!.rightBorder,
321
+ active: false,
322
+ disabled: false
323
+ })
324
+ //全屏按钮配置
325
+ const fullScreenConfig = ref<ObjectType>({
326
+ show: props.config.fullScreen!.show,
327
+ leftBorder: props.config.fullScreen!.leftBorder,
328
+ rightBorder: props.config.fullScreen!.rightBorder,
329
+ active: false,
330
+ disabled: false
331
+ })
332
+
333
+ //整个菜单栏是否禁用
334
+ const disabled = computed<boolean>(() => {
335
+ return <boolean>editify.props.disabled || !canUseMenu.value
336
+ })
337
+ //菜单名称数组
338
+ const menuNames = computed<string[]>(() => {
339
+ return Object.keys(props.config.sequence!).sort((a, b) => {
340
+ if (props.config.sequence![a] > props.config.sequence![b]) {
341
+ return 1
342
+ }
343
+ return -1
344
+ })
345
+ })
346
+ //菜单是否禁用
347
+ const menuDisabled = computed<(name: string) => boolean>(() => {
348
+ return (name: string) => {
349
+ if (name == 'sourceView' || name == 'fullScreen') {
350
+ return false
351
+ }
352
+ return isSourceView.value
353
+ }
354
+ })
355
+ //菜单模式
356
+ const menuMode = computed<MenuModeType>(() => {
357
+ //如果是全屏状态下或者高度自适应状态下
358
+ if (isFullScreen.value || editify.props.autoheight) {
359
+ //fixed模式改为默认模式
360
+ if (props.config.mode == 'fixed') {
361
+ return 'default'
362
+ }
363
+ }
364
+ return props.config.mode!
365
+ })
366
+ //菜单栏是否显示边框
367
+ const menuShowBorder = computed(() => {
368
+ //fixed模式下不显示边框
369
+ if (menuMode.value == 'fixed') {
370
+ return false
371
+ }
372
+ //由编辑器的border属性来决定
373
+ return showBorder.value
374
+ })
375
+
376
+ //按钮操作触发函数
377
+ const handleOperate = (name: string, val: string | number | ObjectType) => {
378
+ //菜单栏禁用
379
+ if (disabled.value) {
380
+ return
381
+ }
382
+ //没有获取焦点
383
+ if (!editor.value.range) {
384
+ return
385
+ }
386
+ //撤销
387
+ if (name == 'undo') {
388
+ editify.exposed!.undo()
389
+ }
390
+ //重做
391
+ else if (name == 'redo') {
392
+ editify.exposed!.redo()
393
+ }
394
+ //设置标题
395
+ else if (name == 'heading') {
396
+ setHeading(editor.value, dataRangeCaches.value, $editTrans, <string>val)
397
+ editor.value.formatElementStack()
398
+ editor.value.domRender()
399
+ editor.value.rangeRender()
400
+ }
401
+ //设置缩进
402
+ else if (name == 'indent') {
403
+ //增加缩进
404
+ if (val == 'indent-increase') {
405
+ setIndentIncrease(editor.value, dataRangeCaches.value)
406
+ }
407
+ //减少缩进
408
+ else if (val == 'indent-decrease') {
409
+ setIndentDecrease(editor.value, dataRangeCaches.value)
410
+ }
411
+ editor.value.formatElementStack()
412
+ editor.value.domRender()
413
+ editor.value.rangeRender()
414
+ }
415
+ //设置引用
416
+ else if (name == 'quote') {
417
+ setQuote(editor.value, dataRangeCaches.value)
418
+ editor.value.formatElementStack()
419
+ editor.value.domRender()
420
+ editor.value.rangeRender()
421
+ }
422
+ //设置对齐方式
423
+ else if (name == 'align') {
424
+ setAlign(editor.value, dataRangeCaches.value, <string>val)
425
+ editor.value.formatElementStack()
426
+ editor.value.domRender()
427
+ editor.value.rangeRender()
428
+ }
429
+ //设置有序列表
430
+ else if (name == 'orderList') {
431
+ setList(editor.value, dataRangeCaches.value, true)
432
+ editor.value.formatElementStack()
433
+ editor.value.domRender()
434
+ editor.value.rangeRender()
435
+ }
436
+ //设置无序列表
437
+ else if (name == 'unorderList') {
438
+ setList(editor.value, dataRangeCaches.value, false)
439
+ editor.value.formatElementStack()
440
+ editor.value.domRender()
441
+ editor.value.rangeRender()
442
+ }
443
+ //设置任务列表
444
+ else if (name == 'task') {
445
+ setTask(editor.value, dataRangeCaches.value)
446
+ editor.value.formatElementStack()
447
+ editor.value.domRender()
448
+ editor.value.rangeRender()
449
+ }
450
+ //设置粗体
451
+ else if (name == 'bold') {
452
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'font-weight', 'bold') || queryTextStyle(editor.value, dataRangeCaches.value, 'font-weight', '700')) {
453
+ removeTextStyle(editor.value, dataRangeCaches.value, ['font-weight'])
454
+ } else {
455
+ setTextStyle(editor.value, dataRangeCaches.value, {
456
+ 'font-weight': 'bold'
457
+ })
458
+ }
459
+ editor.value.formatElementStack()
460
+ editor.value.domRender()
461
+ editor.value.rangeRender()
462
+ }
463
+ //设置下划线
464
+ else if (name == 'underline') {
465
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration', 'underline') || queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration-line', 'underline')) {
466
+ removeTextStyle(editor.value, dataRangeCaches.value, ['text-decoration', 'text-decoration-line'])
467
+ } else {
468
+ setTextStyle(editor.value, dataRangeCaches.value, {
469
+ 'text-decoration': 'underline'
470
+ })
471
+ }
472
+ editor.value.formatElementStack()
473
+ editor.value.domRender()
474
+ editor.value.rangeRender()
475
+ }
476
+ //设置斜体
477
+ else if (name == 'italic') {
478
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'font-style', 'italic')) {
479
+ removeTextStyle(editor.value, dataRangeCaches.value, ['font-style'])
480
+ } else {
481
+ setTextStyle(editor.value, dataRangeCaches.value, {
482
+ 'font-style': 'italic'
483
+ })
484
+ }
485
+ editor.value.formatElementStack()
486
+ editor.value.domRender()
487
+ editor.value.rangeRender()
488
+ }
489
+ //设置删除线
490
+ else if (name == 'strikethrough') {
491
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration', 'line-through') || queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration-line', 'line-through')) {
492
+ removeTextStyle(editor.value, dataRangeCaches.value, ['text-decoration', 'text-decoration-line'])
493
+ } else {
494
+ setTextStyle(editor.value, dataRangeCaches.value, {
495
+ 'text-decoration': 'line-through'
496
+ })
497
+ }
498
+ editor.value.formatElementStack()
499
+ editor.value.domRender()
500
+ editor.value.rangeRender()
501
+ }
502
+ //设置行内代码
503
+ else if (name == 'code') {
504
+ if (queryTextMark(editor.value, dataRangeCaches.value, 'data-editify-code')) {
505
+ removeTextMark(editor.value, dataRangeCaches.value, ['data-editify-code'])
506
+ } else {
507
+ setTextMark(editor.value, dataRangeCaches.value, {
508
+ 'data-editify-code': true
509
+ })
510
+ }
511
+ editor.value.formatElementStack()
512
+ editor.value.domRender()
513
+ editor.value.rangeRender()
514
+ }
515
+ //设置上标
516
+ else if (name == 'super') {
517
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'vertical-align', 'super')) {
518
+ removeTextStyle(editor.value, dataRangeCaches.value, ['vertical-align'])
519
+ } else {
520
+ setTextStyle(editor.value, dataRangeCaches.value, {
521
+ 'vertical-align': 'super'
522
+ })
523
+ }
524
+ editor.value.formatElementStack()
525
+ editor.value.domRender()
526
+ editor.value.rangeRender()
527
+ }
528
+ //设置下标
529
+ else if (name == 'sub') {
530
+ if (queryTextStyle(editor.value, dataRangeCaches.value, 'vertical-align', 'sub')) {
531
+ removeTextStyle(editor.value, dataRangeCaches.value, ['vertical-align'])
532
+ } else {
533
+ setTextStyle(editor.value, dataRangeCaches.value, {
534
+ 'vertical-align': 'sub'
535
+ })
536
+ }
537
+ editor.value.formatElementStack()
538
+ editor.value.domRender()
539
+ editor.value.rangeRender()
540
+ }
541
+ //清除格式
542
+ else if (name == 'formatClear') {
543
+ removeTextStyle(editor.value, dataRangeCaches.value)
544
+ removeTextMark(editor.value, dataRangeCaches.value)
545
+ editor.value.formatElementStack()
546
+ editor.value.domRender()
547
+ editor.value.rangeRender()
548
+ }
549
+ //设置字号
550
+ else if (name == 'fontSize') {
551
+ setTextStyle(editor.value, dataRangeCaches.value, {
552
+ 'font-size': val
553
+ })
554
+ editor.value.formatElementStack()
555
+ editor.value.domRender()
556
+ editor.value.rangeRender()
557
+ }
558
+ //设置字体
559
+ else if (name == 'fontFamily') {
560
+ setTextStyle(editor.value, dataRangeCaches.value, {
561
+ 'font-family': val
562
+ })
563
+ editor.value.formatElementStack()
564
+ editor.value.domRender()
565
+ editor.value.rangeRender()
566
+ }
567
+ //设置行高
568
+ else if (name == 'lineHeight') {
569
+ setLineHeight(editor.value, dataRangeCaches.value, <string | number>val)
570
+ editor.value.formatElementStack()
571
+ editor.value.domRender()
572
+ editor.value.rangeRender()
573
+ }
574
+ //设置前景色
575
+ else if (name == 'foreColor') {
576
+ setTextStyle(editor.value, dataRangeCaches.value, {
577
+ color: val
578
+ })
579
+ editor.value.formatElementStack()
580
+ editor.value.domRender()
581
+ editor.value.rangeRender()
582
+ }
583
+ //设置背景色
584
+ else if (name == 'backColor') {
585
+ setTextStyle(editor.value, dataRangeCaches.value, {
586
+ 'background-color': val
587
+ })
588
+ editor.value.formatElementStack()
589
+ editor.value.domRender()
590
+ editor.value.rangeRender()
591
+ }
592
+ //插入链接
593
+ else if (name == 'link') {
594
+ if (!(<ObjectType>val).url) {
595
+ return
596
+ }
597
+ insertLink(editor.value, (<ObjectType>val).text, (<ObjectType>val).url, (<ObjectType>val).newOpen)
598
+ editor.value.formatElementStack()
599
+ editor.value.domRender()
600
+ editor.value.rangeRender()
601
+ }
602
+ //插入图片
603
+ else if (name == 'image') {
604
+ if (!val) {
605
+ return
606
+ }
607
+ insertImage(editor.value, <string>val)
608
+ editor.value.formatElementStack()
609
+ editor.value.domRender()
610
+ editor.value.rangeRender()
611
+ }
612
+ //插入视频
613
+ else if (name == 'video') {
614
+ if (!val) {
615
+ return
616
+ }
617
+ insertVideo(editor.value, <string>val)
618
+ editor.value.formatElementStack()
619
+ editor.value.domRender()
620
+ editor.value.rangeRender()
621
+ }
622
+ //插入表格
623
+ else if (name == 'table') {
624
+ insertTable(editor.value, (<ObjectType>val).row, (<ObjectType>val).column)
625
+ editor.value.formatElementStack()
626
+ editor.value.domRender()
627
+ editor.value.rangeRender()
628
+ }
629
+ //插入代码块
630
+ else if (name == 'codeBlock') {
631
+ insertCodeBlock(editor.value, dataRangeCaches.value)
632
+ editor.value.formatElementStack()
633
+ editor.value.domRender()
634
+ editor.value.rangeRender()
635
+ }
636
+ //代码视图
637
+ else if (name == 'sourceView') {
638
+ isSourceView.value = !isSourceView.value
639
+ sourceViewConfig.value.active = isSourceView.value
640
+ if (!isSourceView.value) {
641
+ editor.value.rangeRender()
642
+ }
643
+ }
644
+ //全屏
645
+ else if (name == 'fullScreen') {
646
+ isFullScreen.value = !isFullScreen.value
647
+ fullScreenConfig.value.active = isFullScreen.value
648
+ editor.value.rangeRender()
649
+ }
650
+ }
651
+ //处理光标更新
652
+ const handleRangeUpdate = () => {
653
+ //选区是否含有代码块
654
+ const value_hasPreInRange = hasPreInRange(editor.value, dataRangeCaches.value)
655
+ //选区是否含有表格元素
656
+ const value_hasTableInRange = hasTableInRange(editor.value, dataRangeCaches.value)
657
+ //选区是否含有引用元素
658
+ const value_hasQuoteInRange = hasQuoteInRange(editor.value, dataRangeCaches.value)
659
+ //选区是否都在引用元素内
660
+ const value_isRangeInQuote = isRangeInQuote(editor.value, dataRangeCaches.value)
661
+ //选区是否含有链接元素
662
+ const value_hasLinkInRange = hasLinkInRange(editor.value, dataRangeCaches.value)
663
+ //选区是否都在有序列表内
664
+ const value_isRangeInOrderList = isRangeInList(editor.value, dataRangeCaches.value, true)
665
+ //选区是否都在无序列表内
666
+ const value_isRangeInUnorderList = isRangeInList(editor.value, dataRangeCaches.value, false)
667
+ //选区是否都在任务列表内
668
+ const value_isRangeInTask = isRangeInTask(editor.value, dataRangeCaches.value)
669
+ //额外禁用判定
670
+ const extraDisabled = (name: string) => {
671
+ if (typeof props.config.extraDisabled == 'function') {
672
+ return props.config.extraDisabled.apply(editify.proxy!, [name]) || false
673
+ }
674
+ return false
675
+ }
676
+
677
+ //撤销按钮禁用
678
+ undoConfig.value.disabled = !editor.value.history.get(-1) || extraDisabled('undo')
679
+
680
+ //重做按钮禁用
681
+ redoConfig.value.disabled = !editor.value.history.get(1) || extraDisabled('redo')
682
+
683
+ //显示已设置标题
684
+ const findHeadingItem = headingConfig.value.displayConfig.options.find((item: string | number | ButtonOptionsItemType) => {
685
+ let val: string | number | ButtonOptionsItemType = item
686
+ if (DapCommon.isObject(item)) {
687
+ val = (<ButtonOptionsItemType>item).value!
688
+ }
689
+ if (editor.value.range!.anchor.isEqual(editor.value.range!.focus)) {
690
+ return editor.value.range!.anchor.element.getBlock().parsedom == val
691
+ }
692
+ return dataRangeCaches.value.list.every(el => {
693
+ if (el.element.isBlock()) {
694
+ return el.element.parsedom == val
695
+ }
696
+ return el.element.getBlock().parsedom == val
697
+ })
698
+ })
699
+ headingConfig.value.displayConfig.value = findHeadingItem ? (DapCommon.isObject(findHeadingItem) ? findHeadingItem.value : findHeadingItem) : headingConfig.value.defaultValue
700
+ //标题禁用
701
+ headingConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('heading')
702
+
703
+ //缩进禁用
704
+ indentConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('indent')
705
+
706
+ //引用按钮激活
707
+ quoteConfig.value.active = value_isRangeInQuote
708
+ //引用按钮禁用
709
+ quoteConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('quote')
710
+
711
+ //对齐方式按钮禁用
712
+ alignConfig.value.disabled = value_hasPreInRange || extraDisabled('align')
713
+
714
+ //有序列表按钮激活
715
+ orderListConfig.value.active = value_isRangeInOrderList
716
+ //有序列表禁用
717
+ orderListConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('orderList')
718
+
719
+ //无序列表按钮激活
720
+ unorderListConfig.value.active = value_isRangeInUnorderList
721
+ //无序列表禁用
722
+ unorderListConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('unorderList')
723
+
724
+ //任务列表按钮激活
725
+ taskConfig.value.active = value_isRangeInTask
726
+ //任务列表禁用
727
+ taskConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('task')
728
+
729
+ //粗体按钮激活
730
+ boldConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'font-weight', 'bold') || queryTextStyle(editor.value, dataRangeCaches.value, 'font-weight', '700')
731
+ //粗体按钮禁用
732
+ boldConfig.value.disabled = value_hasPreInRange || extraDisabled('bold')
733
+
734
+ //下划线按钮激活
735
+ underlineConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration', 'underline') || queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration-line', 'underline')
736
+ //下划线按钮禁用
737
+ underlineConfig.value.disabled = value_hasPreInRange || extraDisabled('underline')
738
+
739
+ //斜体按钮激活
740
+ italicConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'font-style', 'italic')
741
+ //斜体按钮禁用
742
+ italicConfig.value.disabled = value_hasPreInRange || extraDisabled('italic')
743
+
744
+ //删除线按钮激活
745
+ strikethroughConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration', 'line-through') || queryTextStyle(editor.value, dataRangeCaches.value, 'text-decoration-line', 'line-through')
746
+ //删除线按钮禁用
747
+ strikethroughConfig.value.disabled = value_hasPreInRange || extraDisabled('strikethrough')
748
+
749
+ //行内代码按钮激活
750
+ codeConfig.value.active = queryTextMark(editor.value, dataRangeCaches.value, 'data-editify-code')
751
+ //行内代码按钮禁用
752
+ codeConfig.value.disabled = value_hasPreInRange || extraDisabled('code')
753
+
754
+ //上标按钮激活
755
+ superConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'vertical-align', 'super')
756
+ //上标按钮禁用
757
+ superConfig.value.disabled = value_hasPreInRange || extraDisabled('super')
758
+
759
+ //下标按钮激活
760
+ subConfig.value.active = queryTextStyle(editor.value, dataRangeCaches.value, 'vertical-align', 'sub')
761
+ //下标按钮禁用
762
+ subConfig.value.disabled = value_hasPreInRange || extraDisabled('sub')
763
+
764
+ //清除格式按钮禁用
765
+ formatClearConfig.value.disabled = value_hasPreInRange || extraDisabled('formatClear')
766
+
767
+ //显示已选择字号
768
+ const findFontItem = fontSizeConfig.value.displayConfig.options.find((item: string | ButtonOptionsItemType) => {
769
+ if (DapCommon.isObject(item)) {
770
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'font-size', (<ButtonOptionsItemType>item).value)
771
+ }
772
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'font-size', <string>item)
773
+ })
774
+ fontSizeConfig.value.displayConfig.value = findFontItem ? (DapCommon.isObject(findFontItem) ? findFontItem.value : findFontItem) : fontSizeConfig.value.defaultValue
775
+ //字号按钮禁用
776
+ fontSizeConfig.value.disabled = value_hasPreInRange || extraDisabled('fontSize')
777
+
778
+ //显示已选择字体
779
+ const findFamilyItem = fontFamilyConfig.value.displayConfig.options.find((item: string | ButtonOptionsItemType) => {
780
+ if (DapCommon.isObject(item)) {
781
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'font-family', (<ButtonOptionsItemType>item).value)
782
+ }
783
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'font-family', <string>item)
784
+ })
785
+ fontFamilyConfig.value.displayConfig.value = findFamilyItem ? (DapCommon.isObject(findFamilyItem) ? findFamilyItem.value : findFamilyItem) : fontFamilyConfig.value.defaultValue
786
+ //字体按钮禁用
787
+ fontFamilyConfig.value.disabled = value_hasPreInRange || extraDisabled('fontFamily')
788
+
789
+ //显示已设置行高
790
+ const findHeightItem = lineHeightConfig.value.displayConfig.options.find((item: string | number | ButtonOptionsItemType) => {
791
+ let val: string | number | ButtonOptionsItemType = item
792
+ if (DapCommon.isObject(item)) {
793
+ val = (<ButtonOptionsItemType>item).value!
794
+ }
795
+ if (editor.value.range!.anchor.isEqual(editor.value.range!.focus)) {
796
+ const block = editor.value.range!.anchor.element.getBlock()
797
+ return block.hasStyles() && block.styles!['line-height'] == val
798
+ }
799
+ return dataRangeCaches.value.list.every(el => {
800
+ if (el.element.isBlock() || el.element.isInblock()) {
801
+ return el.element.hasStyles() && el.element.styles!['line-height'] == val
802
+ }
803
+ const block = el.element.getBlock()
804
+ const inblock = el.element.getInblock()
805
+ if (inblock) {
806
+ return inblock.hasStyles() && inblock.styles!['line-height'] == val
807
+ }
808
+ return block.hasStyles() && block.styles!['line-height'] == val
809
+ })
810
+ })
811
+ lineHeightConfig.value.displayConfig.value = findHeightItem ? (DapCommon.isObject(findHeightItem) ? findHeightItem.value : findHeightItem) : lineHeightConfig.value.defaultValue
812
+ //行高按钮禁用
813
+ lineHeightConfig.value.disabled = value_hasPreInRange || extraDisabled('lineHeight')
814
+
815
+ //显示已选择的前景色
816
+ const findForeColorItem = foreColorConfig.value.selectConfig.options.find((item: string | ButtonOptionsItemType) => {
817
+ if (DapCommon.isObject(item)) {
818
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'color', (<ButtonOptionsItemType>item).value)
819
+ }
820
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'color', <string>item)
821
+ })
822
+ foreColorConfig.value.value = findForeColorItem ? (DapCommon.isObject(findForeColorItem) ? findForeColorItem.value : findForeColorItem) : ''
823
+ //前景色按钮禁用
824
+ foreColorConfig.value.disabled = value_hasPreInRange || extraDisabled('foreColor')
825
+
826
+ //显示已选择的背景色
827
+ const findBackColorItem = backColorConfig.value.selectConfig.options.find((item: string | ButtonOptionsItemType) => {
828
+ if (DapCommon.isObject(item)) {
829
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'background-color', (<ButtonOptionsItemType>item).value)
830
+ }
831
+ return queryTextStyle(editor.value, dataRangeCaches.value, 'background-color', <string>item)
832
+ })
833
+ backColorConfig.value.value = findBackColorItem ? (DapCommon.isObject(findBackColorItem) ? findBackColorItem.value : findBackColorItem) : ''
834
+ //背景色按钮禁用
835
+ backColorConfig.value.disabled = value_hasPreInRange || extraDisabled('backColor')
836
+
837
+ //链接按钮禁用
838
+ linkConfig.value.disabled = value_hasLinkInRange || value_hasPreInRange || extraDisabled('link')
839
+
840
+ //插入图片按钮禁用
841
+ imageConfig.value.disabled = value_hasPreInRange || extraDisabled('image')
842
+
843
+ //插入视频按钮禁用
844
+ videoConfig.value.disabled = value_hasPreInRange || extraDisabled('video')
845
+
846
+ //表格按钮禁用
847
+ tableConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || value_hasQuoteInRange || extraDisabled('table')
848
+
849
+ //代码块按钮激活
850
+ codeBlockConfig.value.active = !!getCurrentParsedomElement(editor.value, dataRangeCaches.value, 'pre')
851
+ //代码块按钮禁用
852
+ codeBlockConfig.value.disabled = value_hasTableInRange || value_hasQuoteInRange || extraDisabled('codeBlock')
853
+
854
+ //代码视图按钮激活
855
+ sourceViewConfig.value.active = isSourceView.value
856
+
857
+ //全屏按钮激活
858
+ fullScreenConfig.value.active = isFullScreen.value
859
+ }
860
+
861
+ //菜单项子组件
862
+ const MenuItem = defineComponent(
863
+ selfProps => {
864
+ //获取实例
865
+ const itemInstance = getCurrentInstance()!
866
+ //共同设置的属性
867
+ const itemProps = {
868
+ tooltip: props.config.tooltip,
869
+ name: selfProps.name
870
+ }
871
+ return () => {
872
+ //撤销按钮
873
+ if (itemProps.name == 'undo' && undoConfig.value.show) {
874
+ return h(
875
+ Button,
876
+ {
877
+ ...itemProps,
878
+ title: $editTrans('undo'),
879
+ leftBorder: undoConfig.value.leftBorder,
880
+ rightBorder: undoConfig.value.rightBorder,
881
+ disabled: undoConfig.value.disabled || selfProps.disabled || disabled.value,
882
+ color: props.color,
883
+ active: undoConfig.value.active,
884
+ onOperate: handleOperate
885
+ },
886
+ () => h(Icon, { value: 'undo' })
887
+ )
888
+ }
889
+ //重做按钮
890
+ if (itemProps.name == 'redo' && redoConfig.value.show) {
891
+ return h(
892
+ Button,
893
+ {
894
+ ...itemProps,
895
+ title: $editTrans('redo'),
896
+ leftBorder: redoConfig.value.leftBorder,
897
+ rightBorder: redoConfig.value.rightBorder,
898
+ disabled: redoConfig.value.disabled || selfProps.disabled || disabled.value,
899
+ color: props.color,
900
+ active: redoConfig.value.active,
901
+ onOperate: handleOperate
902
+ },
903
+ () => h(Icon, { value: 'redo' })
904
+ )
905
+ }
906
+ //标题按钮
907
+ if (itemProps.name == 'heading' && headingConfig.value.show) {
908
+ return h(Button, {
909
+ ...itemProps,
910
+ type: 'display',
911
+ displayConfig: headingConfig.value.displayConfig,
912
+ title: $editTrans('heading'),
913
+ leftBorder: headingConfig.value.leftBorder,
914
+ rightBorder: headingConfig.value.rightBorder,
915
+ color: props.color,
916
+ disabled: headingConfig.value.disabled || selfProps.disabled || disabled.value,
917
+ active: headingConfig.value.active,
918
+ onOperate: handleOperate
919
+ })
920
+ }
921
+ //缩进按钮
922
+ if (itemProps.name == 'indent' && indentConfig.value.show) {
923
+ return h(
924
+ Button,
925
+ {
926
+ ...itemProps,
927
+ type: 'select',
928
+ selectConfig: indentConfig.value.selectConfig,
929
+ title: $editTrans('indent'),
930
+ leftBorder: indentConfig.value.leftBorder,
931
+ rightBorder: indentConfig.value.rightBorder,
932
+ color: props.color,
933
+ disabled: indentConfig.value.disabled || selfProps.disabled || disabled.value,
934
+ active: indentConfig.value.active,
935
+ onOperate: handleOperate
936
+ },
937
+ () => h(Icon, { value: 'indent-increase' })
938
+ )
939
+ }
940
+ //引用按钮
941
+ if (itemProps.name == 'quote' && quoteConfig.value.show) {
942
+ return h(
943
+ Button,
944
+ {
945
+ ...itemProps,
946
+ title: $editTrans('quote'),
947
+ leftBorder: quoteConfig.value.leftBorder,
948
+ rightBorder: quoteConfig.value.rightBorder,
949
+ color: props.color,
950
+ disabled: quoteConfig.value.disabled || selfProps.disabled || disabled.value,
951
+ active: quoteConfig.value.active,
952
+ onOperate: handleOperate
953
+ },
954
+ () => h(Icon, { value: 'quote' })
955
+ )
956
+ }
957
+ //对齐方式按钮
958
+ if (itemProps.name == 'align' && alignConfig.value.show) {
959
+ return h(
960
+ Button,
961
+ {
962
+ ...itemProps,
963
+ type: 'select',
964
+ selectConfig: alignConfig.value.selectConfig,
965
+ title: $editTrans('align'),
966
+ leftBorder: alignConfig.value.leftBorder,
967
+ rightBorder: alignConfig.value.rightBorder,
968
+ color: props.color,
969
+ disabled: alignConfig.value.disabled || selfProps.disabled || disabled.value,
970
+ active: alignConfig.value.active,
971
+ onOperate: handleOperate
972
+ },
973
+ () => h(Icon, { value: 'align-left' })
974
+ )
975
+ }
976
+ //有序列表按钮
977
+ if (itemProps.name == 'orderList' && orderListConfig.value.show) {
978
+ return h(
979
+ Button,
980
+ {
981
+ ...itemProps,
982
+ title: $editTrans('orderList'),
983
+ leftBorder: orderListConfig.value.leftBorder,
984
+ rightBorder: orderListConfig.value.rightBorder,
985
+ color: props.color,
986
+ disabled: orderListConfig.value.disabled || selfProps.disabled || disabled.value,
987
+ active: orderListConfig.value.active,
988
+ onOperate: handleOperate
989
+ },
990
+ () => h(Icon, { value: 'list-ordered' })
991
+ )
992
+ }
993
+ //无序列表按钮
994
+ if (itemProps.name == 'unorderList' && unorderListConfig.value.show) {
995
+ return h(
996
+ Button,
997
+ {
998
+ ...itemProps,
999
+ title: $editTrans('unorderList'),
1000
+ leftBorder: unorderListConfig.value.leftBorder,
1001
+ rightBorder: unorderListConfig.value.rightBorder,
1002
+ color: props.color,
1003
+ disabled: unorderListConfig.value.disabled || selfProps.disabled || disabled.value,
1004
+ active: unorderListConfig.value.active,
1005
+ onOperate: handleOperate
1006
+ },
1007
+ () => h(Icon, { value: 'list-unordered' })
1008
+ )
1009
+ }
1010
+ //任务列表按钮
1011
+ if (itemProps.name == 'task' && taskConfig.value.show) {
1012
+ return h(
1013
+ Button,
1014
+ {
1015
+ ...itemProps,
1016
+ title: $editTrans('task'),
1017
+ leftBorder: taskConfig.value.leftBorder,
1018
+ rightBorder: taskConfig.value.rightBorder,
1019
+ color: props.color,
1020
+ disabled: taskConfig.value.disabled || selfProps.disabled || disabled.value,
1021
+ active: taskConfig.value.active,
1022
+ onOperate: handleOperate
1023
+ },
1024
+ () => h(Icon, { value: 'task' })
1025
+ )
1026
+ }
1027
+ //粗体按钮
1028
+ if (itemProps.name == 'bold' && boldConfig.value.show) {
1029
+ return h(
1030
+ Button,
1031
+ {
1032
+ ...itemProps,
1033
+ title: $editTrans('bold'),
1034
+ leftBorder: boldConfig.value.leftBorder,
1035
+ rightBorder: boldConfig.value.rightBorder,
1036
+ color: props.color,
1037
+ disabled: boldConfig.value.disabled || selfProps.disabled || disabled.value,
1038
+ active: boldConfig.value.active,
1039
+ onOperate: handleOperate
1040
+ },
1041
+ () => h(Icon, { value: 'bold' })
1042
+ )
1043
+ }
1044
+ //下划线按钮
1045
+ if (itemProps.name == 'underline' && underlineConfig.value.show) {
1046
+ return h(
1047
+ Button,
1048
+ {
1049
+ ...itemProps,
1050
+ title: $editTrans('underline'),
1051
+ leftBorder: underlineConfig.value.leftBorder,
1052
+ rightBorder: underlineConfig.value.rightBorder,
1053
+ color: props.color,
1054
+ disabled: underlineConfig.value.disabled || selfProps.disabled || disabled.value,
1055
+ active: underlineConfig.value.active,
1056
+ onOperate: handleOperate
1057
+ },
1058
+ () => h(Icon, { value: 'underline' })
1059
+ )
1060
+ }
1061
+ //斜体按钮
1062
+ if (itemProps.name == 'italic' && italicConfig.value.show) {
1063
+ return h(
1064
+ Button,
1065
+ {
1066
+ ...itemProps,
1067
+ title: $editTrans('italic'),
1068
+ leftBorder: italicConfig.value.leftBorder,
1069
+ rightBorder: italicConfig.value.rightBorder,
1070
+ color: props.color,
1071
+ disabled: italicConfig.value.disabled || selfProps.disabled || disabled.value,
1072
+ active: italicConfig.value.active,
1073
+ onOperate: handleOperate
1074
+ },
1075
+ () => h(Icon, { value: 'italic' })
1076
+ )
1077
+ }
1078
+ //删除线按钮
1079
+ if (itemProps.name == 'strikethrough' && strikethroughConfig.value.show) {
1080
+ return h(
1081
+ Button,
1082
+ {
1083
+ ...itemProps,
1084
+ title: $editTrans('strikethrough'),
1085
+ leftBorder: strikethroughConfig.value.leftBorder,
1086
+ rightBorder: strikethroughConfig.value.rightBorder,
1087
+ color: props.color,
1088
+ disabled: strikethroughConfig.value.disabled || selfProps.disabled || disabled.value,
1089
+ active: strikethroughConfig.value.active,
1090
+ onOperate: handleOperate
1091
+ },
1092
+ () => h(Icon, { value: 'strikethrough' })
1093
+ )
1094
+ }
1095
+ //行内代码按钮
1096
+ if (itemProps.name == 'code' && codeConfig.value.show) {
1097
+ return h(
1098
+ Button,
1099
+ {
1100
+ ...itemProps,
1101
+ title: $editTrans('code'),
1102
+ leftBorder: codeConfig.value.leftBorder,
1103
+ rightBorder: codeConfig.value.rightBorder,
1104
+ color: props.color,
1105
+ disabled: codeConfig.value.disabled || selfProps.disabled || disabled.value,
1106
+ active: codeConfig.value.active,
1107
+ onOperate: handleOperate
1108
+ },
1109
+ () => h(Icon, { value: 'code' })
1110
+ )
1111
+ }
1112
+ //上标按钮
1113
+ if (itemProps.name == 'super' && superConfig.value.show) {
1114
+ return h(
1115
+ Button,
1116
+ {
1117
+ ...itemProps,
1118
+ title: $editTrans('superscript'),
1119
+ leftBorder: superConfig.value.leftBorder,
1120
+ rightBorder: superConfig.value.rightBorder,
1121
+ color: props.color,
1122
+ disabled: superConfig.value.disabled || selfProps.disabled || disabled.value,
1123
+ active: superConfig.value.active,
1124
+ onOperate: handleOperate
1125
+ },
1126
+ () => h(Icon, { value: 'superscript' })
1127
+ )
1128
+ }
1129
+ //下标按钮
1130
+ if (itemProps.name == 'sub' && subConfig.value.show) {
1131
+ return h(
1132
+ Button,
1133
+ {
1134
+ ...itemProps,
1135
+ title: $editTrans('subscript'),
1136
+ leftBorder: subConfig.value.leftBorder,
1137
+ rightBorder: subConfig.value.rightBorder,
1138
+ color: props.color,
1139
+ disabled: subConfig.value.disabled || selfProps.disabled || disabled.value,
1140
+ active: subConfig.value.active,
1141
+ onOperate: handleOperate
1142
+ },
1143
+ () => h(Icon, { value: 'subscript' })
1144
+ )
1145
+ }
1146
+ //清除格式按钮
1147
+ if (itemProps.name == 'formatClear' && formatClearConfig.value.show) {
1148
+ return h(
1149
+ Button,
1150
+ {
1151
+ ...itemProps,
1152
+ title: $editTrans('formatClear'),
1153
+ leftBorder: formatClearConfig.value.leftBorder,
1154
+ rightBorder: formatClearConfig.value.rightBorder,
1155
+ color: props.color,
1156
+ disabled: formatClearConfig.value.disabled || selfProps.disabled || disabled.value,
1157
+ active: formatClearConfig.value.active,
1158
+ onOperate: handleOperate
1159
+ },
1160
+ () => h(Icon, { value: 'format-clear' })
1161
+ )
1162
+ }
1163
+ //字号按钮
1164
+ if (itemProps.name == 'fontSize' && fontSizeConfig.value.show) {
1165
+ return h(Button, {
1166
+ ...itemProps,
1167
+ type: 'display',
1168
+ displayConfig: fontSizeConfig.value.displayConfig,
1169
+ title: $editTrans('fontSize'),
1170
+ leftBorder: fontSizeConfig.value.leftBorder,
1171
+ rightBorder: fontSizeConfig.value.rightBorder,
1172
+ color: props.color,
1173
+ disabled: fontSizeConfig.value.disabled || selfProps.disabled || disabled.value,
1174
+ active: fontSizeConfig.value.active,
1175
+ onOperate: handleOperate
1176
+ })
1177
+ }
1178
+ //字体按钮
1179
+ if (itemProps.name == 'fontFamily' && fontFamilyConfig.value.show) {
1180
+ return h(Button, {
1181
+ ...itemProps,
1182
+ type: 'display',
1183
+ displayConfig: fontFamilyConfig.value.displayConfig,
1184
+ title: $editTrans('fontFamily'),
1185
+ leftBorder: fontFamilyConfig.value.leftBorder,
1186
+ rightBorder: fontFamilyConfig.value.rightBorder,
1187
+ color: props.color,
1188
+ disabled: fontFamilyConfig.value.disabled || selfProps.disabled || disabled.value,
1189
+ active: fontFamilyConfig.value.active,
1190
+ onOperate: handleOperate
1191
+ })
1192
+ }
1193
+ //行高按钮
1194
+ if (itemProps.name == 'lineHeight' && lineHeightConfig.value.show) {
1195
+ return h(Button, {
1196
+ ...itemProps,
1197
+ type: 'display',
1198
+ displayConfig: lineHeightConfig.value.displayConfig,
1199
+ title: $editTrans('lineHeight'),
1200
+ leftBorder: lineHeightConfig.value.leftBorder,
1201
+ rightBorder: lineHeightConfig.value.rightBorder,
1202
+ color: props.color,
1203
+ disabled: lineHeightConfig.value.disabled || selfProps.disabled || disabled.value,
1204
+ active: lineHeightConfig.value.active,
1205
+ onOperate: handleOperate
1206
+ })
1207
+ }
1208
+ //前景色按钮
1209
+ if (itemProps.name == 'foreColor' && foreColorConfig.value.show) {
1210
+ return h(
1211
+ Button,
1212
+ {
1213
+ ...itemProps,
1214
+ ref: 'btnRef',
1215
+ type: 'select',
1216
+ selectConfig: foreColorConfig.value.selectConfig,
1217
+ title: $editTrans('foreColor'),
1218
+ leftBorder: foreColorConfig.value.leftBorder,
1219
+ rightBorder: foreColorConfig.value.rightBorder,
1220
+ color: props.color,
1221
+ disabled: foreColorConfig.value.disabled || selfProps.disabled || disabled.value,
1222
+ active: foreColorConfig.value.active,
1223
+ hideScroll: true
1224
+ },
1225
+ {
1226
+ default: () =>
1227
+ h(Icon, {
1228
+ value: 'font-color'
1229
+ }),
1230
+ layer: (data: ObjectType) => {
1231
+ return h(Colors, {
1232
+ tooltip: props.config.tooltip,
1233
+ value: foreColorConfig.value.value,
1234
+ data: data.options,
1235
+ color: props.color,
1236
+ onChange: (val: string) => {
1237
+ handleOperate('foreColor', val)
1238
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1239
+ btn.show = false
1240
+ }
1241
+ })
1242
+ }
1243
+ }
1244
+ )
1245
+ }
1246
+ //背景色按钮
1247
+ if (itemProps.name == 'backColor' && backColorConfig.value.show) {
1248
+ return h(
1249
+ Button,
1250
+ {
1251
+ ...itemProps,
1252
+ type: 'select',
1253
+ ref: 'btnRef',
1254
+ selectConfig: backColorConfig.value.selectConfig,
1255
+ title: $editTrans('backColor'),
1256
+ leftBorder: backColorConfig.value.leftBorder,
1257
+ rightBorder: backColorConfig.value.rightBorder,
1258
+ color: props.color,
1259
+ disabled: backColorConfig.value.disabled || selfProps.disabled || disabled.value,
1260
+ active: backColorConfig.value.active,
1261
+ onOperate: handleOperate,
1262
+ hideScroll: true
1263
+ },
1264
+ {
1265
+ default: () =>
1266
+ h(Icon, {
1267
+ value: 'brush'
1268
+ }),
1269
+ layer: (data: ObjectType) =>
1270
+ h(Colors, {
1271
+ tooltip: props.config.tooltip,
1272
+ value: backColorConfig.value.value,
1273
+ data: data.options,
1274
+ color: props.color,
1275
+ onChange: val => {
1276
+ handleOperate('backColor', val)
1277
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1278
+ btn.show = false
1279
+ }
1280
+ })
1281
+ }
1282
+ )
1283
+ }
1284
+ //链接按钮
1285
+ if (itemProps.name == 'link' && linkConfig.value.show) {
1286
+ return h(
1287
+ Button,
1288
+ {
1289
+ ...itemProps,
1290
+ type: 'select',
1291
+ ref: 'btnRef',
1292
+ title: $editTrans('insertLink'),
1293
+ leftBorder: linkConfig.value.leftBorder,
1294
+ rightBorder: linkConfig.value.rightBorder,
1295
+ color: props.color,
1296
+ disabled: linkConfig.value.disabled || selfProps.disabled || disabled.value,
1297
+ active: linkConfig.value.active,
1298
+ hideScroll: true,
1299
+ onLayerShow: () => {
1300
+ //存在选区的情况下预置链接文本值
1301
+ linkConfig.value.text = getRangeText(dataRangeCaches.value)
1302
+ }
1303
+ },
1304
+ {
1305
+ default: () =>
1306
+ h(Icon, {
1307
+ value: 'link'
1308
+ }),
1309
+ layer: () =>
1310
+ h(InsertLink, {
1311
+ color: props.color,
1312
+ text: linkConfig.value.text,
1313
+ onInsert: (text, url, newOpen) => {
1314
+ handleOperate('link', { text, url, newOpen })
1315
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1316
+ btn.show = false
1317
+ }
1318
+ })
1319
+ }
1320
+ )
1321
+ }
1322
+ //图片按钮
1323
+ if (itemProps.name == 'image' && imageConfig.value.show) {
1324
+ return h(
1325
+ Button,
1326
+ {
1327
+ ...itemProps,
1328
+ type: 'select',
1329
+ ref: 'btnRef',
1330
+ title: $editTrans('insertImage'),
1331
+ leftBorder: imageConfig.value.leftBorder,
1332
+ rightBorder: imageConfig.value.rightBorder,
1333
+ color: props.color,
1334
+ disabled: imageConfig.value.disabled || selfProps.disabled || disabled.value,
1335
+ active: imageConfig.value.active,
1336
+ hideScroll: true
1337
+ },
1338
+ {
1339
+ default: () =>
1340
+ h(Icon, {
1341
+ value: 'image'
1342
+ }),
1343
+ layer: () =>
1344
+ h(InsertImage, {
1345
+ color: props.color,
1346
+ accept: imageConfig.value.accept,
1347
+ multiple: imageConfig.value.multiple,
1348
+ maxSize: imageConfig.value.maxSize,
1349
+ minSize: imageConfig.value.minSize,
1350
+ customUpload: imageConfig.value.customUpload,
1351
+ handleError: imageConfig.value.handleError,
1352
+ onChange: () => {
1353
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1354
+ const layer = <InstanceType<typeof Layer>>btn.$refs.layerRef
1355
+ layer.setPosition()
1356
+ },
1357
+ onInsert: url => {
1358
+ handleOperate('image', url)
1359
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1360
+ btn.show = false
1361
+ }
1362
+ })
1363
+ }
1364
+ )
1365
+ }
1366
+ //视频按钮
1367
+ if (itemProps.name == 'video' && videoConfig.value.show) {
1368
+ return h(
1369
+ Button,
1370
+ {
1371
+ ...itemProps,
1372
+ type: 'select',
1373
+ ref: 'btnRef',
1374
+ title: $editTrans('insertVideo'),
1375
+ leftBorder: videoConfig.value.leftBorder,
1376
+ rightBorder: videoConfig.value.rightBorder,
1377
+ color: props.color,
1378
+ disabled: videoConfig.value.disabled || selfProps.disabled || disabled.value,
1379
+ active: videoConfig.value.active,
1380
+ hideScroll: true
1381
+ },
1382
+ {
1383
+ default: () =>
1384
+ h(Icon, {
1385
+ value: 'video'
1386
+ }),
1387
+ layer: () =>
1388
+ h(InsertVideo, {
1389
+ color: props.color,
1390
+ accept: videoConfig.value.accept,
1391
+ multiple: videoConfig.value.multiple,
1392
+ maxSize: videoConfig.value.maxSize,
1393
+ minSize: videoConfig.value.minSize,
1394
+ customUpload: videoConfig.value.customUpload,
1395
+ handleError: videoConfig.value.handleError,
1396
+ onChange: () => {
1397
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1398
+ const layer = <InstanceType<typeof Layer>>btn.$refs.layerRef
1399
+ layer.setPosition()
1400
+ },
1401
+ onInsert: url => {
1402
+ handleOperate('video', url)
1403
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1404
+ btn.show = false
1405
+ }
1406
+ })
1407
+ }
1408
+ )
1409
+ }
1410
+ //表格按钮
1411
+ if (itemProps.name == 'table' && tableConfig.value.show) {
1412
+ return h(
1413
+ Button,
1414
+ {
1415
+ ...itemProps,
1416
+ type: 'select',
1417
+ ref: 'btnRef',
1418
+ title: $editTrans('insertTable'),
1419
+ leftBorder: tableConfig.value.leftBorder,
1420
+ rightBorder: tableConfig.value.rightBorder,
1421
+ color: props.color,
1422
+ disabled: tableConfig.value.disabled || selfProps.disabled || disabled.value,
1423
+ active: tableConfig.value.active,
1424
+ hideScroll: true
1425
+ },
1426
+ {
1427
+ default: () =>
1428
+ h(Icon, {
1429
+ value: 'table'
1430
+ }),
1431
+ layer: () =>
1432
+ h(InsertTable, {
1433
+ color: props.color,
1434
+ maxRows: tableConfig.value.maxRows,
1435
+ maxColumns: tableConfig.value.maxColumns,
1436
+ onInsert: (row, column) => {
1437
+ handleOperate('table', { row, column })
1438
+ const btn = <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef
1439
+ btn.show = false
1440
+ }
1441
+ })
1442
+ }
1443
+ )
1444
+ }
1445
+ //代码块按钮
1446
+ if (itemProps.name == 'codeBlock' && codeBlockConfig.value.show) {
1447
+ return h(
1448
+ Button,
1449
+ {
1450
+ ...itemProps,
1451
+ title: $editTrans('inserCodeBlock'),
1452
+ leftBorder: codeBlockConfig.value.leftBorder,
1453
+ rightBorder: codeBlockConfig.value.rightBorder,
1454
+ color: props.color,
1455
+ disabled: codeBlockConfig.value.disabled || selfProps.disabled || disabled.value,
1456
+ active: codeBlockConfig.value.active,
1457
+ onOperate: handleOperate
1458
+ },
1459
+ () => h(Icon, { value: 'code-block' })
1460
+ )
1461
+ }
1462
+ //代码视图按钮
1463
+ if (itemProps.name == 'sourceView' && sourceViewConfig.value.show) {
1464
+ return h(
1465
+ Button,
1466
+ {
1467
+ ...itemProps,
1468
+ title: $editTrans('sourceView'),
1469
+ leftBorder: sourceViewConfig.value.leftBorder,
1470
+ rightBorder: sourceViewConfig.value.rightBorder,
1471
+ color: props.color,
1472
+ disabled: sourceViewConfig.value.disabled || selfProps.disabled || disabled.value,
1473
+ active: sourceViewConfig.value.active,
1474
+ onOperate: handleOperate
1475
+ },
1476
+ () => h(Icon, { value: 'source-view' })
1477
+ )
1478
+ }
1479
+ //全屏按钮
1480
+ if (itemProps.name == 'fullScreen' && fullScreenConfig.value.show) {
1481
+ return h(
1482
+ Button,
1483
+ {
1484
+ ...itemProps,
1485
+ title: $editTrans('fullScreen'),
1486
+ leftBorder: fullScreenConfig.value.leftBorder,
1487
+ rightBorder: fullScreenConfig.value.rightBorder,
1488
+ color: props.color,
1489
+ disabled: fullScreenConfig.value.disabled || selfProps.disabled || disabled.value,
1490
+ active: fullScreenConfig.value.active,
1491
+ onOperate: handleOperate
1492
+ },
1493
+ () => h(Icon, { value: 'full-screen' })
1494
+ )
1495
+ }
1496
+ /** 下面是拓展菜单的配置 */
1497
+ if (DapCommon.isObject(props.config.extends)) {
1498
+ //获取菜单按钮的配置
1499
+ const configuration = props.config.extends![itemProps.name]
1500
+ if (configuration) {
1501
+ //渲染函数
1502
+ return h(
1503
+ Button,
1504
+ {
1505
+ ...itemProps,
1506
+ ref: 'btnRef',
1507
+ type: configuration.type || 'default',
1508
+ title: configuration.title || '',
1509
+ leftBorder: configuration.leftBorder || false,
1510
+ rightBorder: configuration.rightBorder || false,
1511
+ disabled: configuration.disabled || selfProps.disabled || disabled.value,
1512
+ hideScroll: configuration.hideScroll || false,
1513
+ active: configuration.active || false,
1514
+ selectConfig: {
1515
+ width: configuration.width,
1516
+ maxHeight: configuration.maxHeight,
1517
+ options: configuration.options
1518
+ },
1519
+ displayConfig: {
1520
+ width: configuration.width,
1521
+ maxHeight: configuration.maxHeight,
1522
+ value: configuration.value,
1523
+ options: configuration.options
1524
+ },
1525
+ color: props.color,
1526
+ onLayerShow: () => {
1527
+ if (typeof configuration.onLayerShow == 'function') {
1528
+ configuration.onLayerShow.apply(editify.proxy!, [itemProps.name, <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef])
1529
+ }
1530
+ },
1531
+ onLayerShown: () => {
1532
+ if (typeof configuration.onLayerShown == 'function') {
1533
+ configuration.onLayerShown.apply(editify.proxy!, [itemProps.name, <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef])
1534
+ }
1535
+ },
1536
+ onLayerHidden: () => {
1537
+ if (typeof configuration.onLayerHidden == 'function') {
1538
+ configuration.onLayerHidden.apply(editify.proxy!, [itemProps.name, <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef])
1539
+ }
1540
+ },
1541
+ onOperate: (name, val) => {
1542
+ if (typeof configuration.onOperate == 'function') {
1543
+ configuration.onOperate.apply(editify.proxy!, [name, val, <InstanceType<typeof Button>>itemInstance.proxy!.$refs.btnRef])
1544
+ }
1545
+ }
1546
+ },
1547
+ {
1548
+ default: configuration.default || null,
1549
+ layer: configuration.layer || null,
1550
+ option: configuration.option || null
1551
+ }
1552
+ )
1553
+ }
1554
+ }
1555
+ return null
1556
+ }
1557
+ },
1558
+ {
1559
+ props: {
1560
+ name: String,
1561
+ disabled: Boolean
1562
+ }
1563
+ }
1564
+ )
1565
+
1566
+ defineExpose({
1567
+ handleRangeUpdate
1568
+ })
1569
+ </script>
1570
+ <style scoped src="./menu.less"></style>