vue-editify 0.0.47 → 0.0.49
Sign up to get free protection for your applications and to get access to all the features.
- package/examples/App.vue +6 -17
- package/lib/editify.es.js +402 -291
- package/lib/editify.umd.js +1 -1
- package/lib/style.css +1 -1
- package/package.json +2 -2
- package/src/Editify.vue +148 -69
- package/src/components/bussiness/Menu.vue +80 -17
- package/src/components/bussiness/Toolbar.vue +31 -31
- package/src/core/index.js +12 -2
- package/src/icon/iconfont.css +4 -0
- package/src/icon/iconfont.ttf +0 -0
- package/src/icon/iconfont.woff +0 -0
- package/src/index.js +1 -1
- package/src/locale/en_US.js +2 -1
- package/src/locale/zh_CN.js +2 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<div class="editify-menu" :class="{ border: $parent.
|
2
|
+
<div class="editify-menu" :class="{ border: menuShowBorder, source: $parent.isSourceView && menuMode == 'inner', fullscreen: $parent.isFullScreen }" :data-editify-mode="menuMode" :style="config.style || ''">
|
3
3
|
<MenuItem v-for="item in menuNames" :name="item" :disabled="menuDisabled(item)"></MenuItem>
|
4
4
|
</div>
|
5
5
|
</template>
|
@@ -326,6 +326,14 @@ export default {
|
|
326
326
|
rightBorder: this.config.sourceView.rightBorder,
|
327
327
|
active: false,
|
328
328
|
disabled: false
|
329
|
+
},
|
330
|
+
//全屏按钮配置
|
331
|
+
fullScreenConfig: {
|
332
|
+
show: this.config.fullScreen.show,
|
333
|
+
leftBorder: this.config.fullScreen.leftBorder,
|
334
|
+
rightBorder: this.config.fullScreen.rightBorder,
|
335
|
+
active: false,
|
336
|
+
disabled: false
|
329
337
|
}
|
330
338
|
}
|
331
339
|
},
|
@@ -342,11 +350,31 @@ export default {
|
|
342
350
|
//菜单是否禁用
|
343
351
|
menuDisabled() {
|
344
352
|
return name => {
|
345
|
-
if (name == 'sourceView') {
|
353
|
+
if (name == 'sourceView' || name == 'fullScreen') {
|
346
354
|
return false
|
347
355
|
}
|
348
356
|
return this.$parent.isSourceView
|
349
357
|
}
|
358
|
+
},
|
359
|
+
//菜单模式
|
360
|
+
menuMode() {
|
361
|
+
//如果是全屏状态下或者高度自适应情况下
|
362
|
+
if (this.$parent.isFullScreen || this.$parent.height === true) {
|
363
|
+
//fixed模式改为默认模式
|
364
|
+
if (this.config.mode == 'fixed') {
|
365
|
+
return 'default'
|
366
|
+
}
|
367
|
+
}
|
368
|
+
return this.config.mode
|
369
|
+
},
|
370
|
+
//菜单栏是否显示边框
|
371
|
+
menuShowBorder() {
|
372
|
+
//fixed模式下不显示边框
|
373
|
+
if (this.menuMode == 'fixed') {
|
374
|
+
return false
|
375
|
+
}
|
376
|
+
//由编辑器的border属性来决定
|
377
|
+
return this.$parent.showBorder
|
350
378
|
}
|
351
379
|
},
|
352
380
|
components: {
|
@@ -789,7 +817,7 @@ export default {
|
|
789
817
|
onLayerShow: () => {
|
790
818
|
//存在选区的情况下预置链接文本值
|
791
819
|
let text = ''
|
792
|
-
const result = this.$parent.$parent.editor.getElementsByRange(
|
820
|
+
const result = this.$parent.$parent.editor.getElementsByRange().flatIncludes
|
793
821
|
result.forEach(item => {
|
794
822
|
if (item.element.isText()) {
|
795
823
|
if (item.offset) {
|
@@ -969,6 +997,23 @@ export default {
|
|
969
997
|
() => h(Icon, { value: 'source-view' })
|
970
998
|
)
|
971
999
|
}
|
1000
|
+
//全屏按钮
|
1001
|
+
if (this.name == 'fullScreen' && this.$parent.fullScreenConfig.show) {
|
1002
|
+
return h(
|
1003
|
+
Button,
|
1004
|
+
{
|
1005
|
+
...props,
|
1006
|
+
title: this.$editTrans('fullScreen'),
|
1007
|
+
leftBorder: this.$parent.fullScreenConfig.leftBorder,
|
1008
|
+
rightBorder: this.$parent.fullScreenConfig.rightBorder,
|
1009
|
+
color: this.$parent.color,
|
1010
|
+
disabled: this.$parent.fullScreenConfig.disabled || this.disabled || this.$parent.disabled,
|
1011
|
+
active: this.$parent.fullScreenConfig.active,
|
1012
|
+
onOperate: this.$parent.handleOperate
|
1013
|
+
},
|
1014
|
+
() => h(Icon, { value: 'full-screen' })
|
1015
|
+
)
|
1016
|
+
}
|
972
1017
|
|
973
1018
|
/** 下面是拓展菜单的配置 */
|
974
1019
|
if (Dap.common.isObject(this.$parent.config.extends)) {
|
@@ -1187,14 +1232,20 @@ export default {
|
|
1187
1232
|
this.$parent.editor.rangeRender()
|
1188
1233
|
}
|
1189
1234
|
}
|
1235
|
+
//全屏
|
1236
|
+
else if (name == 'fullScreen') {
|
1237
|
+
this.$parent.isFullScreen = !this.$parent.isFullScreen
|
1238
|
+
this.fullScreenConfig.active = this.$parent.isFullScreen
|
1239
|
+
this.$parent.editor.rangeRender()
|
1240
|
+
}
|
1190
1241
|
},
|
1191
1242
|
//处理光标更新
|
1192
|
-
handleRangeUpdate() {
|
1243
|
+
handleRangeUpdate(useCache = false) {
|
1193
1244
|
if (this.disabled) {
|
1194
1245
|
return
|
1195
1246
|
}
|
1196
1247
|
//获取选区的元素
|
1197
|
-
const result = this.$parent.editor.getElementsByRange(
|
1248
|
+
const result = this.$parent.editor.getElementsByRange(useCache).includes
|
1198
1249
|
//选区是否含有代码块元素
|
1199
1250
|
const hasPreStyle = this.$parent.hasPreStyle(true)
|
1200
1251
|
//选区是否含有表格元素
|
@@ -1203,10 +1254,8 @@ export default {
|
|
1203
1254
|
const hasQuote = this.$parent.hasQuote(true)
|
1204
1255
|
//选区是否都在引用元素内
|
1205
1256
|
const inQuote = this.$parent.inQuote(true)
|
1206
|
-
|
1207
1257
|
//选区是否含有链接元素
|
1208
1258
|
const hasLink = this.$parent.hasLink(true)
|
1209
|
-
|
1210
1259
|
//选区是否都在有序列表内
|
1211
1260
|
const inOrderList = this.$parent.inList(true, true)
|
1212
1261
|
//选区是否都在无序列表内
|
@@ -1400,6 +1449,9 @@ export default {
|
|
1400
1449
|
|
1401
1450
|
//代码视图按钮激活
|
1402
1451
|
this.sourceViewConfig.active = this.$parent.isSourceView
|
1452
|
+
|
1453
|
+
//全屏按钮激活
|
1454
|
+
this.fullScreenConfig.active = this.$parent.isFullScreen
|
1403
1455
|
}
|
1404
1456
|
}
|
1405
1457
|
}
|
@@ -1414,39 +1466,50 @@ export default {
|
|
1414
1466
|
position: relative;
|
1415
1467
|
z-index: 2;
|
1416
1468
|
|
1469
|
+
//默认菜单模式
|
1417
1470
|
&[data-editify-mode='default'] {
|
1418
1471
|
margin-bottom: 10px;
|
1419
1472
|
padding: 6px 10px;
|
1420
1473
|
|
1474
|
+
//默认菜单模式显示边框,同时显示圆角
|
1421
1475
|
&.border {
|
1422
1476
|
border: 1px solid @border-color;
|
1423
1477
|
border-radius: 4px;
|
1424
1478
|
}
|
1479
|
+
|
1480
|
+
//全屏模式下,默认菜单的边框失效,此时加一个下边框
|
1481
|
+
&.fullscreen {
|
1482
|
+
border-bottom: 1px solid @border-color;
|
1483
|
+
}
|
1425
1484
|
}
|
1426
1485
|
|
1486
|
+
//inner菜单模式
|
1427
1487
|
&[data-editify-mode='inner'] {
|
1428
1488
|
padding: 10px;
|
1429
1489
|
margin-bottom: -20px;
|
1430
1490
|
|
1491
|
+
//inner菜单模式显示边框,同时显示圆角
|
1431
1492
|
&.border {
|
1432
1493
|
border: 1px solid @border-color;
|
1433
1494
|
border-bottom: none;
|
1434
1495
|
border-radius: 4px 4px 0 0;
|
1435
1496
|
transition: all 500ms;
|
1497
|
+
}
|
1436
1498
|
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1499
|
+
//inner菜单模式加一个下边框,此边框在代码视图下不显示
|
1500
|
+
&:not(.source)::before {
|
1501
|
+
position: absolute;
|
1502
|
+
content: '';
|
1503
|
+
width: calc(100% - 20px);
|
1504
|
+
height: 1px;
|
1505
|
+
background-color: @border-color;
|
1506
|
+
left: 50%;
|
1507
|
+
transform: translateX(-50%);
|
1508
|
+
bottom: 0;
|
1447
1509
|
}
|
1448
1510
|
}
|
1449
1511
|
|
1512
|
+
//fixed菜单模式
|
1450
1513
|
&[data-editify-mode='fixed'] {
|
1451
1514
|
padding: 6px 10px;
|
1452
1515
|
position: fixed;
|
@@ -474,80 +474,80 @@ export default {
|
|
474
474
|
methods: {
|
475
475
|
//清除格式
|
476
476
|
clearFormat() {
|
477
|
-
this.$parent.formatText()
|
477
|
+
this.$parent.formatText(true, true)
|
478
478
|
},
|
479
479
|
//设置背景色
|
480
480
|
setBackColor(value) {
|
481
|
-
this.$parent.setTextStyle('background-color', value)
|
481
|
+
this.$parent.setTextStyle('background-color', value, true, true)
|
482
482
|
this.$refs.backColor.hideLayer()
|
483
483
|
},
|
484
484
|
//设置前景色
|
485
485
|
setForeColor(value) {
|
486
|
-
this.$parent.setTextStyle('color', value)
|
486
|
+
this.$parent.setTextStyle('color', value, true, true)
|
487
487
|
this.$refs.foreColor.hideLayer()
|
488
488
|
},
|
489
489
|
//设置行高
|
490
490
|
setLineHeight(name, value) {
|
491
|
-
this.$parent.setLineHeight(value)
|
491
|
+
this.$parent.setLineHeight(value, true, true)
|
492
492
|
},
|
493
493
|
//设置字体
|
494
494
|
setFontFamily(name, value) {
|
495
|
-
this.$parent.setTextStyle('font-family', value)
|
495
|
+
this.$parent.setTextStyle('font-family', value, true, true)
|
496
496
|
},
|
497
497
|
//设置字号
|
498
498
|
setFontSize(name, value) {
|
499
|
-
this.$parent.setTextStyle('font-size', value)
|
499
|
+
this.$parent.setTextStyle('font-size', value, true, true)
|
500
500
|
},
|
501
501
|
//设置上标
|
502
502
|
setSuperscript() {
|
503
|
-
this.$parent.setTextStyle('vertical-align', 'super')
|
503
|
+
this.$parent.setTextStyle('vertical-align', 'super', true, true)
|
504
504
|
},
|
505
505
|
//设置下标
|
506
506
|
setSubscript() {
|
507
|
-
this.$parent.setTextStyle('vertical-align', 'sub')
|
507
|
+
this.$parent.setTextStyle('vertical-align', 'sub', true, true)
|
508
508
|
},
|
509
509
|
//设置行内代码样式
|
510
510
|
setCodeStyle() {
|
511
|
-
this.$parent.setTextMark('data-editify-code', true)
|
511
|
+
this.$parent.setTextMark('data-editify-code', true, true, true)
|
512
512
|
},
|
513
513
|
//设置下划线
|
514
514
|
setUnderline() {
|
515
|
-
this.$parent.setTextStyle('text-decoration', 'underline')
|
515
|
+
this.$parent.setTextStyle('text-decoration', 'underline', true, true)
|
516
516
|
},
|
517
517
|
//设置删除线
|
518
518
|
setStrikethrough() {
|
519
|
-
this.$parent.setTextStyle('text-decoration', 'line-through')
|
519
|
+
this.$parent.setTextStyle('text-decoration', 'line-through', true, true)
|
520
520
|
},
|
521
521
|
//设置列表
|
522
522
|
setList(name) {
|
523
|
-
this.$parent.setList(name == 'orderList')
|
523
|
+
this.$parent.setList(name == 'orderList', true, true)
|
524
524
|
},
|
525
525
|
//设置任务列表
|
526
526
|
setTask() {
|
527
|
-
this.$parent.setTask()
|
527
|
+
this.$parent.setTask(true, true)
|
528
528
|
},
|
529
529
|
//斜体
|
530
530
|
setItalic() {
|
531
|
-
this.$parent.setTextStyle('font-style', 'italic')
|
531
|
+
this.$parent.setTextStyle('font-style', 'italic', true, true)
|
532
532
|
},
|
533
533
|
//加粗
|
534
534
|
setBold() {
|
535
|
-
this.$parent.setTextStyle('font-weight', 'bold')
|
535
|
+
this.$parent.setTextStyle('font-weight', 'bold', true, true)
|
536
536
|
},
|
537
537
|
//设置标题
|
538
538
|
setHeading(name, value) {
|
539
|
-
this.$parent.setHeading(value)
|
539
|
+
this.$parent.setHeading(value, true, true)
|
540
540
|
},
|
541
541
|
//设置对齐方式
|
542
542
|
setAlign(name, value) {
|
543
|
-
this.$parent.setAlign(value)
|
543
|
+
this.$parent.setAlign(value, true, true)
|
544
544
|
},
|
545
545
|
//设置视频
|
546
546
|
setVideo(prop) {
|
547
547
|
if (this.$parent.disabled) {
|
548
548
|
return
|
549
549
|
}
|
550
|
-
const video = this.$parent.getCurrentParsedomElement('video')
|
550
|
+
const video = this.$parent.getCurrentParsedomElement('video', true)
|
551
551
|
if (video) {
|
552
552
|
//当前是拥有该属性
|
553
553
|
if (this.videoConfig[prop]) {
|
@@ -567,7 +567,7 @@ export default {
|
|
567
567
|
if (this.$parent.disabled) {
|
568
568
|
return
|
569
569
|
}
|
570
|
-
const element = this.$parent.getCurrentParsedomElement('img') || this.$parent.getCurrentParsedomElement('video', true)
|
570
|
+
const element = this.$parent.getCurrentParsedomElement('img', true) || this.$parent.getCurrentParsedomElement('video', true)
|
571
571
|
if (element) {
|
572
572
|
const styles = {
|
573
573
|
width: value
|
@@ -594,7 +594,7 @@ export default {
|
|
594
594
|
if (!this.linkConfig.url) {
|
595
595
|
return
|
596
596
|
}
|
597
|
-
const link = this.$parent.getCurrentParsedomElement('a')
|
597
|
+
const link = this.$parent.getCurrentParsedomElement('a', true)
|
598
598
|
if (link) {
|
599
599
|
link.marks.href = this.linkConfig.url
|
600
600
|
if (this.linkConfig.newOpen) {
|
@@ -627,7 +627,7 @@ export default {
|
|
627
627
|
if (this.$parent.disabled) {
|
628
628
|
return
|
629
629
|
}
|
630
|
-
const pre = this.$parent.getCurrentParsedomElement('pre')
|
630
|
+
const pre = this.$parent.getCurrentParsedomElement('pre', true)
|
631
631
|
if (pre) {
|
632
632
|
Object.assign(pre.marks, {
|
633
633
|
'data-editify-hljs': value
|
@@ -646,7 +646,7 @@ export default {
|
|
646
646
|
this.$parent.editor.range.anchor.element = this.$parent.editor.range.focus.element
|
647
647
|
this.$parent.editor.range.anchor.offset = this.$parent.editor.range.focus.offset
|
648
648
|
}
|
649
|
-
const pre = this.$parent.getCurrentParsedomElement('pre')
|
649
|
+
const pre = this.$parent.getCurrentParsedomElement('pre', true)
|
650
650
|
if (pre) {
|
651
651
|
const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
|
652
652
|
const breakEl = new AlexElement('closed', 'br', null, null, null)
|
@@ -672,7 +672,7 @@ export default {
|
|
672
672
|
this.$parent.editor.range.anchor.element = this.$parent.editor.range.focus.element
|
673
673
|
this.$parent.editor.range.anchor.offset = this.$parent.editor.range.focus.offset
|
674
674
|
}
|
675
|
-
const table = this.$parent.getCurrentParsedomElement('table')
|
675
|
+
const table = this.$parent.getCurrentParsedomElement('table', true)
|
676
676
|
const column = this.$parent.getCurrentParsedomElement('td', true)
|
677
677
|
const tbody = this.$parent.getCurrentParsedomElement('tbody', true)
|
678
678
|
if (column && table && tbody) {
|
@@ -716,7 +716,7 @@ export default {
|
|
716
716
|
this.$parent.editor.rangeRender()
|
717
717
|
}
|
718
718
|
},
|
719
|
-
|
719
|
+
//表格前后插入行
|
720
720
|
insertTableRow(type = 'up') {
|
721
721
|
if (this.$parent.disabled) {
|
722
722
|
return
|
@@ -725,7 +725,7 @@ export default {
|
|
725
725
|
this.$parent.editor.range.anchor.element = this.$parent.editor.range.focus.element
|
726
726
|
this.$parent.editor.range.anchor.offset = this.$parent.editor.range.focus.offset
|
727
727
|
}
|
728
|
-
const table = this.$parent.getCurrentParsedomElement('table')
|
728
|
+
const table = this.$parent.getCurrentParsedomElement('table', true)
|
729
729
|
const row = this.$parent.getCurrentParsedomElement('tr', true)
|
730
730
|
if (table && row) {
|
731
731
|
const newRow = row.clone()
|
@@ -755,7 +755,7 @@ export default {
|
|
755
755
|
if (this.$parent.disabled) {
|
756
756
|
return
|
757
757
|
}
|
758
|
-
const table = this.$parent.getCurrentParsedomElement('table')
|
758
|
+
const table = this.$parent.getCurrentParsedomElement('table', true)
|
759
759
|
if (table) {
|
760
760
|
const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
|
761
761
|
const breakEl = new AlexElement('closed', 'br', null, null, null)
|
@@ -781,12 +781,12 @@ export default {
|
|
781
781
|
this.$parent.editor.range.anchor.element = this.$parent.editor.range.focus.element
|
782
782
|
this.$parent.editor.range.anchor.offset = this.$parent.editor.range.focus.offset
|
783
783
|
}
|
784
|
-
const table = this.$parent.getCurrentParsedomElement('table')
|
784
|
+
const table = this.$parent.getCurrentParsedomElement('table', true)
|
785
785
|
const row = this.$parent.getCurrentParsedomElement('tr', true)
|
786
786
|
if (table && row) {
|
787
787
|
const parent = row.parent
|
788
788
|
if (parent.children.length == 1) {
|
789
|
-
this.$parent.deleteByParsedom('table')
|
789
|
+
this.$parent.deleteByParsedom('table', true, true)
|
790
790
|
return
|
791
791
|
}
|
792
792
|
const previousRow = this.$parent.editor.getPreviousElement(row)
|
@@ -817,14 +817,14 @@ export default {
|
|
817
817
|
this.$parent.editor.range.anchor.element = this.$parent.editor.range.focus.element
|
818
818
|
this.$parent.editor.range.anchor.offset = this.$parent.editor.range.focus.offset
|
819
819
|
}
|
820
|
-
const column = this.$parent.getCurrentParsedomElement('td')
|
820
|
+
const column = this.$parent.getCurrentParsedomElement('td', true)
|
821
821
|
const tbody = this.$parent.getCurrentParsedomElement('tbody', true)
|
822
822
|
const table = this.$parent.getCurrentParsedomElement('table', true)
|
823
823
|
if (column && table && tbody) {
|
824
824
|
const rows = tbody.children
|
825
825
|
const parent = column.parent
|
826
826
|
if (parent.children.length == 1) {
|
827
|
-
this.$parent.deleteByParsedom('table', true)
|
827
|
+
this.$parent.deleteByParsedom('table', true, true)
|
828
828
|
return
|
829
829
|
}
|
830
830
|
const previousColumn = this.$parent.editor.getPreviousElement(column)
|
@@ -857,7 +857,7 @@ export default {
|
|
857
857
|
//浮层显示时
|
858
858
|
layerShow() {
|
859
859
|
//获取选区的元素
|
860
|
-
const result = this.$parent.editor.getElementsByRange(true
|
860
|
+
const result = this.$parent.editor.getElementsByRange(true).includes
|
861
861
|
//代码块初始化展示设置
|
862
862
|
if (this.type == 'codeBlock') {
|
863
863
|
const pre = this.$parent.getCurrentParsedomElement('pre', true)
|
package/src/core/index.js
CHANGED
@@ -74,7 +74,7 @@ export const editorProps = {
|
|
74
74
|
},
|
75
75
|
//编辑内容高度
|
76
76
|
height: {
|
77
|
-
type: String,
|
77
|
+
type: [String, Boolean],
|
78
78
|
default: '600px'
|
79
79
|
},
|
80
80
|
//是否自适应高度
|
@@ -934,7 +934,8 @@ export const getMenuConfig = function (editTrans, editLocale) {
|
|
934
934
|
video: 24,
|
935
935
|
table: 25,
|
936
936
|
codeBlock: 26,
|
937
|
-
sourceView: 27
|
937
|
+
sourceView: 27,
|
938
|
+
fullScreen: 28
|
938
939
|
},
|
939
940
|
//撤销按钮配置
|
940
941
|
undo: {
|
@@ -1264,6 +1265,15 @@ export const getMenuConfig = function (editTrans, editLocale) {
|
|
1264
1265
|
//右侧边框是否显示
|
1265
1266
|
rightBorder: false
|
1266
1267
|
},
|
1268
|
+
//全屏
|
1269
|
+
fullScreen: {
|
1270
|
+
//是否显示此工具
|
1271
|
+
show: true,
|
1272
|
+
//左侧边框是否显示
|
1273
|
+
leftBorder: false,
|
1274
|
+
//右侧边框是否显示
|
1275
|
+
rightBorder: false
|
1276
|
+
},
|
1267
1277
|
//拓展菜单,每个key表示拓展菜单的唯一名称,value是对象,包含type/title/rightBorder/leftBorder/disabled/active/width/maxHeight/options/value/hideScroll/onLayerShow/onLayerShown/onLayerHidden/onOperate/default/layer/option属性
|
1268
1278
|
extends: {}
|
1269
1279
|
}
|
package/src/icon/iconfont.css
CHANGED
package/src/icon/iconfont.ttf
CHANGED
Binary file
|
package/src/icon/iconfont.woff
CHANGED
Binary file
|
package/src/index.js
CHANGED
package/src/locale/en_US.js
CHANGED