vue-editify 0.2.11 → 0.2.13
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/lib/components/button/button.vue.d.ts +20 -3
- package/lib/components/layer/layer.vue.d.ts +10 -0
- package/lib/components/layer/props.d.ts +4 -0
- package/lib/components/toolbar/toolbar.vue.d.ts +283 -1
- package/lib/editify/editify.vue.d.ts +26 -68
- package/lib/editify.es.js +158 -68
- package/lib/editify.umd.js +2 -2
- package/lib/index.d.ts +28 -70
- package/package.json +1 -1
- package/src/components/layer/layer.vue +14 -2
- package/src/components/layer/props.ts +7 -0
- package/src/components/toolbar/toolbar.vue +60 -13
- package/src/editify/editify.vue +7 -8
- package/src/index.ts +2 -2
- package/src/plugins/attachment/index.ts +1 -2
package/lib/index.d.ts
CHANGED
@@ -150,8 +150,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
150
150
|
key: number;
|
151
151
|
type: import('alex-editor').AlexElementType;
|
152
152
|
parsedom: string | null;
|
153
|
-
marks: import('alex-editor').ObjectType | null;
|
154
|
-
styles: import('alex-editor').ObjectType | null;
|
153
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
154
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
155
155
|
textContent: string | null;
|
156
156
|
children: any[] | null;
|
157
157
|
parent: any | null;
|
@@ -170,7 +170,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
170
170
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
171
171
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
172
172
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
173
|
-
isOnlyHasBreak: () => boolean
|
173
|
+
isOnlyHasBreak: () => boolean;
|
174
174
|
isPreStyle: () => boolean;
|
175
175
|
hasMarks: () => boolean;
|
176
176
|
hasStyles: () => boolean;
|
@@ -195,8 +195,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
195
195
|
key: number;
|
196
196
|
type: import('alex-editor').AlexElementType;
|
197
197
|
parsedom: string | null;
|
198
|
-
marks: import('alex-editor').ObjectType | null;
|
199
|
-
styles: import('alex-editor').ObjectType | null;
|
198
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
199
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
200
200
|
textContent: string | null;
|
201
201
|
children: any[] | null;
|
202
202
|
parent: any | null;
|
@@ -215,7 +215,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
215
215
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
216
216
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
217
217
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
218
|
-
isOnlyHasBreak: () => boolean
|
218
|
+
isOnlyHasBreak: () => boolean;
|
219
219
|
isPreStyle: () => boolean;
|
220
220
|
hasMarks: () => boolean;
|
221
221
|
hasStyles: () => boolean;
|
@@ -244,8 +244,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
244
244
|
key: number;
|
245
245
|
type: import('alex-editor').AlexElementType;
|
246
246
|
parsedom: string | null;
|
247
|
-
marks: import('alex-editor').ObjectType | null;
|
248
|
-
styles: import('alex-editor').ObjectType | null;
|
247
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
248
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
249
249
|
textContent: string | null;
|
250
250
|
children: any[] | null;
|
251
251
|
parent: any | null;
|
@@ -264,7 +264,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
264
264
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
265
265
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
266
266
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
267
|
-
isOnlyHasBreak: () => boolean
|
267
|
+
isOnlyHasBreak: () => boolean;
|
268
268
|
isPreStyle: () => boolean;
|
269
269
|
hasMarks: () => boolean;
|
270
270
|
hasStyles: () => boolean;
|
@@ -300,8 +300,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
300
300
|
key: number;
|
301
301
|
type: import('alex-editor').AlexElementType;
|
302
302
|
parsedom: string | null;
|
303
|
-
marks: import('alex-editor').ObjectType | null;
|
304
|
-
styles: import('alex-editor').ObjectType | null;
|
303
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
304
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
305
305
|
textContent: string | null;
|
306
306
|
children: any[] | null;
|
307
307
|
parent: any | null;
|
@@ -320,7 +320,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
320
320
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
321
321
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
322
322
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
323
|
-
isOnlyHasBreak: () => boolean
|
323
|
+
isOnlyHasBreak: () => boolean;
|
324
324
|
isPreStyle: () => boolean;
|
325
325
|
hasMarks: () => boolean;
|
326
326
|
hasStyles: () => boolean;
|
@@ -345,8 +345,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
345
345
|
key: number;
|
346
346
|
type: import('alex-editor').AlexElementType;
|
347
347
|
parsedom: string | null;
|
348
|
-
marks: import('alex-editor').ObjectType | null;
|
349
|
-
styles: import('alex-editor').ObjectType | null;
|
348
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
349
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
350
350
|
textContent: string | null;
|
351
351
|
children: any[] | null;
|
352
352
|
parent: any | null;
|
@@ -365,7 +365,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
365
365
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
366
366
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
367
367
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
368
|
-
isOnlyHasBreak: () => boolean
|
368
|
+
isOnlyHasBreak: () => boolean;
|
369
369
|
isPreStyle: () => boolean;
|
370
370
|
hasMarks: () => boolean;
|
371
371
|
hasStyles: () => boolean;
|
@@ -394,8 +394,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
394
394
|
key: number;
|
395
395
|
type: import('alex-editor').AlexElementType;
|
396
396
|
parsedom: string | null;
|
397
|
-
marks: import('alex-editor').ObjectType | null;
|
398
|
-
styles: import('alex-editor').ObjectType | null;
|
397
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
398
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
399
399
|
textContent: string | null;
|
400
400
|
children: any[] | null;
|
401
401
|
parent: any | null;
|
@@ -414,7 +414,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
414
414
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
415
415
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
416
416
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
417
|
-
isOnlyHasBreak: () => boolean
|
417
|
+
isOnlyHasBreak: () => boolean;
|
418
418
|
isPreStyle: () => boolean;
|
419
419
|
hasMarks: () => boolean;
|
420
420
|
hasStyles: () => boolean;
|
@@ -440,50 +440,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
440
440
|
};
|
441
441
|
} | null;
|
442
442
|
__guid: number;
|
443
|
-
__events: import('alex-editor').ObjectType;
|
444
|
-
|
445
|
-
key: number;
|
446
|
-
type: import('alex-editor').AlexElementType;
|
447
|
-
parsedom: string | null;
|
448
|
-
marks: import('alex-editor').ObjectType | null;
|
449
|
-
styles: import('alex-editor').ObjectType | null;
|
450
|
-
textContent: string | null;
|
451
|
-
children: any[] | null;
|
452
|
-
parent: any | null;
|
453
|
-
behavior: "default" | "block";
|
454
|
-
namespace: string | null;
|
455
|
-
locked: boolean;
|
456
|
-
elm: HTMLElement | null;
|
457
|
-
isBlock: () => boolean;
|
458
|
-
isInblock: () => boolean;
|
459
|
-
isInline: () => boolean;
|
460
|
-
isClosed: () => boolean;
|
461
|
-
isText: () => boolean;
|
462
|
-
isBreak: () => boolean;
|
463
|
-
isEmpty: () => boolean;
|
464
|
-
isSpaceText: () => boolean;
|
465
|
-
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
466
|
-
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
467
|
-
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
468
|
-
isOnlyHasBreak: () => boolean | 0;
|
469
|
-
isPreStyle: () => boolean;
|
470
|
-
hasMarks: () => boolean;
|
471
|
-
hasStyles: () => boolean;
|
472
|
-
hasChildren: () => boolean;
|
473
|
-
hasContains: (element: import('alex-editor').AlexElement) => boolean;
|
474
|
-
clone: (deep?: boolean | undefined) => import('alex-editor').AlexElement;
|
475
|
-
convertToBlock: () => void;
|
476
|
-
toEmpty: () => void;
|
477
|
-
getBlock: () => import('alex-editor').AlexElement;
|
478
|
-
getInblock: () => import('alex-editor').AlexElement | null;
|
479
|
-
getInline: () => import('alex-editor').AlexElement | null;
|
480
|
-
isEqualStyles: (element: import('alex-editor').AlexElement) => boolean;
|
481
|
-
isEqualMarks: (element: import('alex-editor').AlexElement) => boolean;
|
482
|
-
isFirst: (element: import('alex-editor').AlexElement) => boolean;
|
483
|
-
isLast: (element: import('alex-editor').AlexElement) => boolean;
|
484
|
-
__render: () => void;
|
485
|
-
__fullClone: () => import('alex-editor').AlexElement;
|
486
|
-
}[];
|
443
|
+
__events: import('alex-editor/lib/core/tool').ObjectType;
|
444
|
+
__firstRender: boolean;
|
487
445
|
__isInputChinese: boolean;
|
488
446
|
__innerSelectionChange: boolean;
|
489
447
|
__chineseInputTimer: any;
|
@@ -524,8 +482,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
524
482
|
key: number;
|
525
483
|
type: import('alex-editor').AlexElementType;
|
526
484
|
parsedom: string | null;
|
527
|
-
marks: import('alex-editor').ObjectType | null;
|
528
|
-
styles: import('alex-editor').ObjectType | null;
|
485
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
486
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
529
487
|
textContent: string | null;
|
530
488
|
children: any[] | null;
|
531
489
|
parent: any | null;
|
@@ -544,7 +502,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
544
502
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
545
503
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
546
504
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
547
|
-
isOnlyHasBreak: () => boolean
|
505
|
+
isOnlyHasBreak: () => boolean;
|
548
506
|
isPreStyle: () => boolean;
|
549
507
|
hasMarks: () => boolean;
|
550
508
|
hasStyles: () => boolean;
|
@@ -570,8 +528,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
570
528
|
key: number;
|
571
529
|
type: import('alex-editor').AlexElementType;
|
572
530
|
parsedom: string | null;
|
573
|
-
marks: import('alex-editor').ObjectType | null;
|
574
|
-
styles: import('alex-editor').ObjectType | null;
|
531
|
+
marks: import('alex-editor/lib/core/tool').ObjectType | null;
|
532
|
+
styles: import('alex-editor/lib/core/tool').ObjectType | null;
|
575
533
|
textContent: string | null;
|
576
534
|
children: any[] | null;
|
577
535
|
parent: any | null;
|
@@ -590,7 +548,7 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
590
548
|
getUneditableElement: () => import('alex-editor').AlexElement | null;
|
591
549
|
isEqual: (element: import('alex-editor').AlexElement) => boolean;
|
592
550
|
isContains: (element: import('alex-editor').AlexElement) => boolean;
|
593
|
-
isOnlyHasBreak: () => boolean
|
551
|
+
isOnlyHasBreak: () => boolean;
|
594
552
|
isPreStyle: () => boolean;
|
595
553
|
hasMarks: () => boolean;
|
596
554
|
hasStyles: () => boolean;
|
@@ -800,11 +758,11 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
|
|
800
758
|
export type { ButtonTypeType, ButtonOptionsItemType, ButtonSelectConfigType, ButtonDisplayConfigType } from './components/button/props';
|
801
759
|
export type { InsertImageUploadErrorType } from './components/insertImage/props';
|
802
760
|
export type { InsertVideoUploadErrorType } from './components/insertVideo/props';
|
803
|
-
export type { MenuButtonType, MenuSelectButtonType, MenuDisplayButtonType, MenuImageButtonType, MenuVideoButtonType, MenuTableButtonType, MenuCustomButtonType, CodeBlockToolbarType, TextToolbarType, ToolbarConfigType, MenuSequenceType, MenuModeType, MenuExtendType, MenuConfigType, PluginType, PluginResultType } from './core/tool';
|
761
|
+
export type { MenuButtonType, MenuSelectButtonType, MenuDisplayButtonType, MenuImageButtonType, MenuVideoButtonType, MenuTableButtonType, MenuCustomButtonType, CodeBlockToolbarType, TextToolbarType, ToolbarConfigType, MenuSequenceType, MenuModeType, MenuExtendType, MenuConfigType, PluginMenuConfigType, PluginType, PluginResultType } from './core/tool';
|
804
762
|
export type { ElementMatchConfigType } from './core/function';
|
805
763
|
export { elementIsMatch, getMatchElementByElement, getMatchElementByRange, isList, isTask, elementIsInList, elementIsInTask, hasPreInRange, hasQuoteInRange, hasListInRange, hasTaskInRange, hasLinkInRange, hasTableInRange, hasImageInRange, hasVideoInRange, isRangeInQuote, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getRangeText, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setTextStyle, setTextMark, removeTextStyle, removeTextMark, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, insertSeparator } from './core/function';
|
806
764
|
declare const install: (app: App) => void;
|
807
|
-
declare const version = "0.2.
|
765
|
+
declare const version = "0.2.13";
|
808
766
|
export { AlexElement } from 'alex-editor';
|
809
767
|
export type { AttachmentOptionsType } from './plugins/attachment';
|
810
768
|
export type { InsertAttachmentUploadErrorType } from './plugins/attachment/insertAttachment/props';
|
package/package.json
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
</Teleport>
|
12
12
|
</template>
|
13
13
|
<script setup lang="ts">
|
14
|
-
import { computed, getCurrentInstance, nextTick, onMounted, ref } from 'vue'
|
14
|
+
import { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'
|
15
15
|
import { element as DapElement, event as DapEvent } from 'dap-util'
|
16
16
|
import Triangle from '@/components/triangle/triangle.vue'
|
17
17
|
import { TrianglePlacementType } from '@/components/triangle/props'
|
@@ -577,12 +577,19 @@ const handleClick = (e: Event) => {
|
|
577
577
|
if (!DapElement.isElement(elRef.value)) {
|
578
578
|
return
|
579
579
|
}
|
580
|
+
//如果在浮层内点击,不用关闭
|
580
581
|
if (DapElement.isContains(elRef.value!, e.target as HTMLElement)) {
|
581
582
|
return
|
582
583
|
}
|
584
|
+
//如果在浮层关联的元素内点击,不用关闭
|
583
585
|
if (!props.useRange && getNode()! && DapElement.isContains(getNode()!, e.target as HTMLElement)) {
|
584
586
|
return
|
585
587
|
}
|
588
|
+
//如果在insideElement规定的元素内,不用关闭
|
589
|
+
if (props.insideElements.some(el => DapElement.isContains(el, e.target as HTMLElement))) {
|
590
|
+
return
|
591
|
+
}
|
592
|
+
|
586
593
|
if (props.modelValue) {
|
587
594
|
emits('update:modelValue', false)
|
588
595
|
}
|
@@ -596,8 +603,13 @@ onMounted(() => {
|
|
596
603
|
DapEvent.on(window, `resize.editify_layer_${instance.uid}`, handleResize)
|
597
604
|
})
|
598
605
|
|
606
|
+
onBeforeUnmount(() => {
|
607
|
+
DapEvent.off(window, `mousedown.editify_layer_${instance.uid} resize.editify_layer_${instance.uid}`)
|
608
|
+
})
|
609
|
+
|
599
610
|
defineExpose({
|
600
|
-
setPosition
|
611
|
+
setPosition,
|
612
|
+
elRef
|
601
613
|
})
|
602
614
|
</script>
|
603
615
|
<style scoped src="./layer.less"></style>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<Layer v-model="show" ref="layerRef" :node="node" :scroll-node="scrollNode" border placement="bottom-start" @show="layerShow" :useRange="type == 'text'" :z-index="zIndex">
|
2
|
+
<Layer v-model="show" ref="layerRef" :node="node" :scroll-node="scrollNode" border placement="bottom-start" @show="layerShow" :useRange="type == 'text'" :z-index="zIndex" :inside-elements="insideElements">
|
3
3
|
<div class="editify-toolbar" ref="toolbarRef" :style="config.style">
|
4
4
|
<!-- 链接工具条 -->
|
5
5
|
<template v-if="type == 'link'">
|
@@ -131,14 +131,14 @@
|
|
131
131
|
<Icon value="text-wrap"></Icon>
|
132
132
|
</Button>
|
133
133
|
<!-- 代码块语言选择 -->
|
134
|
-
<Button v-if="languageConfig.show" name="languages" type="display" :title="$editTrans('selectLanguages')" :tooltip="config.tooltip" :leftBorder="languageConfig.leftBorder" :rightBorder="languageConfig.rightBorder" :display-config="languageConfig.displayConfig" :color="color" :active="languageConfig.active" :disabled="languageConfig.disabled" @operate="selectLanguage" :z-index="zIndex + 1"></Button>
|
134
|
+
<Button v-if="languageConfig.show" ref="languagesBtnRef" name="languages" type="display" :title="$editTrans('selectLanguages')" :tooltip="config.tooltip" :leftBorder="languageConfig.leftBorder" :rightBorder="languageConfig.rightBorder" :display-config="languageConfig.displayConfig" :color="color" :active="languageConfig.active" :disabled="languageConfig.disabled" @operate="selectLanguage" :z-index="zIndex + 1"></Button>
|
135
135
|
</template>
|
136
136
|
<!-- 文本工具条 -->
|
137
137
|
<template v-else-if="type == 'text'">
|
138
138
|
<!-- 设置段落和标题 -->
|
139
|
-
<Button v-if="headingConfig.show" name="heading" type="display" :title="$editTrans('heading')" :tooltip="config.tooltip" :display-config="headingConfig.displayConfig" :leftBorder="headingConfig.leftBorder" :rightBorder="headingConfig.rightBorder" :color="color" :active="headingConfig.active" :disabled="headingConfig.disabled" @operate="_setHeading" :z-index="zIndex + 1"></Button>
|
139
|
+
<Button v-if="headingConfig.show" ref="headingBtnRef" name="heading" type="display" :title="$editTrans('heading')" :tooltip="config.tooltip" :display-config="headingConfig.displayConfig" :leftBorder="headingConfig.leftBorder" :rightBorder="headingConfig.rightBorder" :color="color" :active="headingConfig.active" :disabled="headingConfig.disabled" @operate="_setHeading" :z-index="zIndex + 1"></Button>
|
140
140
|
<!-- 对齐方式 -->
|
141
|
-
<Button v-if="alignConfig.show" name="align" type="select" :title="$editTrans('align')" :tooltip="config.tooltip" :select-config="alignConfig.selectConfig" :leftBorder="alignConfig.leftBorder" :rightBorder="alignConfig.rightBorder" :color="color" :active="alignConfig.active" :disabled="alignConfig.disabled" @operate="_setAlign" :z-index="zIndex + 1">
|
141
|
+
<Button v-if="alignConfig.show" name="align" ref="alignBtnRef" type="select" :title="$editTrans('align')" :tooltip="config.tooltip" :select-config="alignConfig.selectConfig" :leftBorder="alignConfig.leftBorder" :rightBorder="alignConfig.rightBorder" :color="color" :active="alignConfig.active" :disabled="alignConfig.disabled" @operate="_setAlign" :z-index="zIndex + 1">
|
142
142
|
<Icon value="align-left"></Icon>
|
143
143
|
</Button>
|
144
144
|
<!-- 有序列表 -->
|
@@ -182,20 +182,20 @@
|
|
182
182
|
<Icon value="subscript"></Icon>
|
183
183
|
</Button>
|
184
184
|
<!-- 字号大小 -->
|
185
|
-
<Button v-if="fontSizeConfig.show" name="fontSize" type="display" :title="$editTrans('fontSize')" :tooltip="config.tooltip" :display-config="fontSizeConfig.displayConfig" :leftBorder="fontSizeConfig.leftBorder" :rightBorder="fontSizeConfig.rightBorder" :color="color" :active="fontSizeConfig.active" :disabled="fontSizeConfig.disabled" @operate="setFontSize" :z-index="zIndex + 1"></Button>
|
185
|
+
<Button v-if="fontSizeConfig.show" ref="fontSizeBtnRef" name="fontSize" type="display" :title="$editTrans('fontSize')" :tooltip="config.tooltip" :display-config="fontSizeConfig.displayConfig" :leftBorder="fontSizeConfig.leftBorder" :rightBorder="fontSizeConfig.rightBorder" :color="color" :active="fontSizeConfig.active" :disabled="fontSizeConfig.disabled" @operate="setFontSize" :z-index="zIndex + 1"></Button>
|
186
186
|
<!-- 字体 -->
|
187
|
-
<Button v-if="fontFamilyConfig.show" name="fontFamily" type="display" :title="$editTrans('fontFamily')" :tooltip="config.tooltip" :display-config="fontFamilyConfig.displayConfig" :leftBorder="fontFamilyConfig.leftBorder" :rightBorder="fontFamilyConfig.rightBorder" :color="color" :active="fontFamilyConfig.active" :disabled="fontFamilyConfig.disabled" @operate="setFontFamily" :z-index="zIndex + 1"></Button>
|
187
|
+
<Button v-if="fontFamilyConfig.show" ref="fontFamilyBtnRef" name="fontFamily" type="display" :title="$editTrans('fontFamily')" :tooltip="config.tooltip" :display-config="fontFamilyConfig.displayConfig" :leftBorder="fontFamilyConfig.leftBorder" :rightBorder="fontFamilyConfig.rightBorder" :color="color" :active="fontFamilyConfig.active" :disabled="fontFamilyConfig.disabled" @operate="setFontFamily" :z-index="zIndex + 1"></Button>
|
188
188
|
<!-- 行高 -->
|
189
|
-
<Button v-if="lineHeightConfig.show" name="lineHeight" type="display" :title="$editTrans('lineHeight')" :tooltip="config.tooltip" :display-config="lineHeightConfig.displayConfig" :leftBorder="lineHeightConfig.leftBorder" :rightBorder="lineHeightConfig.rightBorder" :color="color" :active="lineHeightConfig.active" :disabled="lineHeightConfig.disabled" @operate="_setLineHeight" :z-index="zIndex + 1"></Button>
|
189
|
+
<Button v-if="lineHeightConfig.show" ref="lineHeightBtnRef" name="lineHeight" type="display" :title="$editTrans('lineHeight')" :tooltip="config.tooltip" :display-config="lineHeightConfig.displayConfig" :leftBorder="lineHeightConfig.leftBorder" :rightBorder="lineHeightConfig.rightBorder" :color="color" :active="lineHeightConfig.active" :disabled="lineHeightConfig.disabled" @operate="_setLineHeight" :z-index="zIndex + 1"></Button>
|
190
190
|
<!-- 前景色 -->
|
191
|
-
<Button v-if="foreColorConfig.show" name="foreColor" type="select" :title="$editTrans('foreColor')" :tooltip="config.tooltip" :select-config="foreColorConfig.selectConfig" :leftBorder="foreColorConfig.leftBorder" :rightBorder="foreColorConfig.rightBorder" :color="color" :active="foreColorConfig.active" :disabled="foreColorConfig.disabled" hideScroll ref="
|
191
|
+
<Button v-if="foreColorConfig.show" name="foreColor" type="select" :title="$editTrans('foreColor')" :tooltip="config.tooltip" :select-config="foreColorConfig.selectConfig" :leftBorder="foreColorConfig.leftBorder" :rightBorder="foreColorConfig.rightBorder" :color="color" :active="foreColorConfig.active" :disabled="foreColorConfig.disabled" hideScroll ref="foreColorBtnRef" :z-index="zIndex + 1">
|
192
192
|
<Icon value="font-color"></Icon>
|
193
193
|
<template #layer="{ options }">
|
194
194
|
<Colors :tooltip="config.tooltip" :color="color" :value="foreColorConfig.value" @change="setForeColor" :data="options"></Colors>
|
195
195
|
</template>
|
196
196
|
</Button>
|
197
197
|
<!-- 背景色 -->
|
198
|
-
<Button v-if="backColorConfig.show" name="backColor" type="select" :title="$editTrans('backColor')" :tooltip="config.tooltip" :select-config="backColorConfig.selectConfig" :leftBorder="backColorConfig.leftBorder" :rightBorder="backColorConfig.rightBorder" :color="color" :active="backColorConfig.active" :disabled="backColorConfig.disabled" hideScroll ref="
|
198
|
+
<Button v-if="backColorConfig.show" name="backColor" type="select" :title="$editTrans('backColor')" :tooltip="config.tooltip" :select-config="backColorConfig.selectConfig" :leftBorder="backColorConfig.leftBorder" :rightBorder="backColorConfig.rightBorder" :color="color" :active="backColorConfig.active" :disabled="backColorConfig.disabled" hideScroll ref="backColorBtnRef" :z-index="zIndex + 1">
|
199
199
|
<Icon value="brush"></Icon>
|
200
200
|
<template #layer="{ options }">
|
201
201
|
<Colors :tooltip="config.tooltip" :color="color" :value="backColorConfig.value" @change="setBackColor" :data="options"></Colors>
|
@@ -235,8 +235,14 @@ const $editTrans = inject<(key: string) => any>('$editTrans')!
|
|
235
235
|
|
236
236
|
const layerRef = ref<InstanceType<typeof Layer> | null>(null)
|
237
237
|
const toolbarRef = ref<HTMLElement | null>(null)
|
238
|
-
const
|
239
|
-
const
|
238
|
+
const foreColorBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
239
|
+
const backColorBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
240
|
+
const languagesBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
241
|
+
const headingBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
242
|
+
const alignBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
243
|
+
const fontSizeBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
244
|
+
const fontFamilyBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
245
|
+
const lineHeightBtnRef = ref<InstanceType<typeof Button> | null>(null)
|
240
246
|
|
241
247
|
//链接参数配置
|
242
248
|
const linkConfig = ref<ObjectType>({
|
@@ -622,6 +628,43 @@ const canMergeCells = computed<(type: 'left' | 'right' | 'up' | 'down') => boole
|
|
622
628
|
return false
|
623
629
|
}
|
624
630
|
})
|
631
|
+
//点击不关闭工具条浮层的元素(算在工具条浮层元素范围内)
|
632
|
+
const insideElements = computed<HTMLElement[]>(() => {
|
633
|
+
let elements: HTMLElement[] = []
|
634
|
+
//语言选择浮层元素
|
635
|
+
if (languagesBtnRef.value && languagesBtnRef.value.layerRef && languagesBtnRef.value.layerRef.elRef) {
|
636
|
+
elements.push(languagesBtnRef.value.layerRef.elRef)
|
637
|
+
}
|
638
|
+
//前景色选择浮层元素
|
639
|
+
if (foreColorBtnRef.value && foreColorBtnRef.value.layerRef && foreColorBtnRef.value.layerRef.elRef) {
|
640
|
+
elements.push(foreColorBtnRef.value.layerRef.elRef)
|
641
|
+
}
|
642
|
+
//背景色选择浮层元素
|
643
|
+
if (backColorBtnRef.value && backColorBtnRef.value.layerRef && backColorBtnRef.value.layerRef.elRef) {
|
644
|
+
elements.push(backColorBtnRef.value.layerRef.elRef)
|
645
|
+
}
|
646
|
+
//标题选择浮层元素
|
647
|
+
if (headingBtnRef.value && headingBtnRef.value.layerRef && headingBtnRef.value.layerRef.elRef) {
|
648
|
+
elements.push(headingBtnRef.value.layerRef.elRef)
|
649
|
+
}
|
650
|
+
//对齐方式选择浮层元素
|
651
|
+
if (alignBtnRef.value && alignBtnRef.value.layerRef && alignBtnRef.value.layerRef.elRef) {
|
652
|
+
elements.push(alignBtnRef.value.layerRef.elRef)
|
653
|
+
}
|
654
|
+
//字号选择浮层元素
|
655
|
+
if (fontSizeBtnRef.value && fontSizeBtnRef.value.layerRef && fontSizeBtnRef.value.layerRef.elRef) {
|
656
|
+
elements.push(fontSizeBtnRef.value.layerRef.elRef)
|
657
|
+
}
|
658
|
+
//字体选择浮层元素
|
659
|
+
if (fontFamilyBtnRef.value && fontFamilyBtnRef.value.layerRef && fontFamilyBtnRef.value.layerRef.elRef) {
|
660
|
+
elements.push(fontFamilyBtnRef.value.layerRef.elRef)
|
661
|
+
}
|
662
|
+
//行高选择浮层元素
|
663
|
+
if (lineHeightBtnRef.value && lineHeightBtnRef.value.layerRef && lineHeightBtnRef.value.layerRef.elRef) {
|
664
|
+
elements.push(lineHeightBtnRef.value.layerRef.elRef)
|
665
|
+
}
|
666
|
+
return elements
|
667
|
+
})
|
625
668
|
|
626
669
|
//输入框获取焦点
|
627
670
|
const handleInputFocus = (e: Event) => {
|
@@ -646,7 +689,7 @@ const setBackColor = (value: string) => {
|
|
646
689
|
setTextStyle(editor.value, dataRangeCaches.value, {
|
647
690
|
'background-color': value
|
648
691
|
})
|
649
|
-
|
692
|
+
backColorBtnRef.value!.show = false
|
650
693
|
editor.value.formatElementStack()
|
651
694
|
editor.value.domRender()
|
652
695
|
editor.value.rangeRender()
|
@@ -656,7 +699,7 @@ const setForeColor = (value: string) => {
|
|
656
699
|
setTextStyle(editor.value, dataRangeCaches.value, {
|
657
700
|
color: value
|
658
701
|
})
|
659
|
-
|
702
|
+
foreColorBtnRef.value!.show = false
|
660
703
|
editor.value.formatElementStack()
|
661
704
|
editor.value.domRender()
|
662
705
|
editor.value.rangeRender()
|
@@ -1626,5 +1669,9 @@ const layerShow = () => {
|
|
1626
1669
|
formatClearConfig.value.disabled = extraDisabled('formatClear')
|
1627
1670
|
}
|
1628
1671
|
}
|
1672
|
+
|
1673
|
+
defineExpose({
|
1674
|
+
layerRef
|
1675
|
+
})
|
1629
1676
|
</script>
|
1630
1677
|
<style scoped src="./toolbar.less"></style>
|
package/src/editify/editify.vue
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<div class="editify" :class="{ 'editify-fullscreen': isFullScreen, 'editify-autoheight': !isFullScreen && autoheight }" :style="{ zIndex: zIndex, paddingTop: (offset || '') + 'px' }" ref="elRef">
|
2
|
+
<div class="editify" :class="{ 'editify-fullscreen': isFullScreen, 'editify-autoheight': !isFullScreen && autoheight }" :style="{ zIndex: zIndex, paddingTop: isFullScreen ? '' : (offset || '') + 'px' }" ref="elRef">
|
3
3
|
<!-- 菜单区域 -->
|
4
4
|
<Menu ref="menuRef" v-if="menuConfig.use" :config="menuConfig" :color="color" :z-index="zIndex + 1"></Menu>
|
5
5
|
<!-- 编辑层,与编辑区域宽高相同必须适配 -->
|
@@ -27,7 +27,6 @@ import { parseList, orderdListHandle, commonElementHandle, tableThTdHandle, tabl
|
|
27
27
|
import { isTask, elementToParagraph, getMatchElementByRange, hasTableInRange, hasLinkInRange, hasPreInRange, hasImageInRange, hasVideoInRange } from '@/core/function'
|
28
28
|
import Toolbar from '@/components/toolbar/toolbar.vue'
|
29
29
|
import Menu from '@/components/menu/menu.vue'
|
30
|
-
import Layer from '@/components/layer/layer.vue'
|
31
30
|
import { trans } from '@/locale'
|
32
31
|
import { LanguagesItemType } from '@/hljs'
|
33
32
|
import { EditifyProps, EditifyResizeParamsType, EditifyToolbarOptionsType } from './props'
|
@@ -194,7 +193,7 @@ const handleToolbar = () => {
|
|
194
193
|
toolbarOptions.value.type = 'link'
|
195
194
|
toolbarOptions.value.node = `[data-editify-uid="${instance.uid}"] [data-editify-element="${link.key}"]`
|
196
195
|
if (toolbarOptions.value.show) {
|
197
|
-
|
196
|
+
toolbarRef.value!.layerRef!.setPosition()
|
198
197
|
} else {
|
199
198
|
toolbarOptions.value.show = true
|
200
199
|
}
|
@@ -204,7 +203,7 @@ const handleToolbar = () => {
|
|
204
203
|
toolbarOptions.value.type = 'image'
|
205
204
|
toolbarOptions.value.node = `[data-editify-uid="${instance.uid}"] [data-editify-element="${image.key}"]`
|
206
205
|
if (toolbarOptions.value.show) {
|
207
|
-
|
206
|
+
toolbarRef.value!.layerRef!.setPosition()
|
208
207
|
} else {
|
209
208
|
toolbarOptions.value.show = true
|
210
209
|
}
|
@@ -214,7 +213,7 @@ const handleToolbar = () => {
|
|
214
213
|
toolbarOptions.value.type = 'video'
|
215
214
|
toolbarOptions.value.node = `[data-editify-uid="${instance.uid}"] [data-editify-element="${video.key}"]`
|
216
215
|
if (toolbarOptions.value.show) {
|
217
|
-
|
216
|
+
toolbarRef.value!.layerRef!.setPosition()
|
218
217
|
} else {
|
219
218
|
toolbarOptions.value.show = true
|
220
219
|
}
|
@@ -224,7 +223,7 @@ const handleToolbar = () => {
|
|
224
223
|
toolbarOptions.value.type = 'table'
|
225
224
|
toolbarOptions.value.node = `[data-editify-uid="${instance.uid}"] [data-editify-element="${table.key}"]`
|
226
225
|
if (toolbarOptions.value.show) {
|
227
|
-
|
226
|
+
toolbarRef.value!.layerRef!.setPosition()
|
228
227
|
} else {
|
229
228
|
toolbarOptions.value.show = true
|
230
229
|
}
|
@@ -234,7 +233,7 @@ const handleToolbar = () => {
|
|
234
233
|
toolbarOptions.value.type = 'codeBlock'
|
235
234
|
toolbarOptions.value.node = `[data-editify-uid="${instance.uid}"] [data-editify-element="${pre.key}"]`
|
236
235
|
if (toolbarOptions.value.show) {
|
237
|
-
|
236
|
+
toolbarRef.value!.layerRef!.setPosition()
|
238
237
|
} else {
|
239
238
|
toolbarOptions.value.show = true
|
240
239
|
}
|
@@ -247,7 +246,7 @@ const handleToolbar = () => {
|
|
247
246
|
if (result.length && !hasTableInRange(editor.value!, dataRangeCaches.value) && !hasPreInRange(editor.value!, dataRangeCaches.value) && !hasLinkInRange(editor.value!, dataRangeCaches.value) && !hasImageInRange(editor.value!, dataRangeCaches.value) && !hasVideoInRange(editor.value!, dataRangeCaches.value)) {
|
248
247
|
toolbarOptions.value.type = 'text'
|
249
248
|
if (toolbarOptions.value.show) {
|
250
|
-
|
249
|
+
toolbarRef.value!.layerRef!.setPosition()
|
251
250
|
} else {
|
252
251
|
toolbarOptions.value.show = true
|
253
252
|
}
|
package/src/index.ts
CHANGED
@@ -13,7 +13,7 @@ const Editify = withInstall(editify)
|
|
13
13
|
export type { ButtonTypeType, ButtonOptionsItemType, ButtonSelectConfigType, ButtonDisplayConfigType } from '@/components/button/props'
|
14
14
|
export type { InsertImageUploadErrorType } from '@/components/insertImage/props'
|
15
15
|
export type { InsertVideoUploadErrorType } from '@/components/insertVideo/props'
|
16
|
-
export type { MenuButtonType, MenuSelectButtonType, MenuDisplayButtonType, MenuImageButtonType, MenuVideoButtonType, MenuTableButtonType, MenuCustomButtonType, CodeBlockToolbarType, TextToolbarType, ToolbarConfigType, MenuSequenceType, MenuModeType, MenuExtendType, MenuConfigType, PluginType, PluginResultType } from '@/core/tool'
|
16
|
+
export type { MenuButtonType, MenuSelectButtonType, MenuDisplayButtonType, MenuImageButtonType, MenuVideoButtonType, MenuTableButtonType, MenuCustomButtonType, CodeBlockToolbarType, TextToolbarType, ToolbarConfigType, MenuSequenceType, MenuModeType, MenuExtendType, MenuConfigType, PluginMenuConfigType, PluginType, PluginResultType } from '@/core/tool'
|
17
17
|
export type { ElementMatchConfigType } from '@/core/function'
|
18
18
|
|
19
19
|
//导出编辑器操作方法
|
@@ -24,7 +24,7 @@ const install = (app: App) => {
|
|
24
24
|
app.component(Editify.name!, Editify)
|
25
25
|
}
|
26
26
|
//版本号
|
27
|
-
const version = '0.2.
|
27
|
+
const version = '0.2.13'
|
28
28
|
|
29
29
|
//导出AlexElement元素
|
30
30
|
export { AlexElement } from 'alex-editor'
|
@@ -2,7 +2,6 @@ import { ComponentInternalInstance, h } from 'vue'
|
|
2
2
|
import { AlexEditor, AlexElement, AlexElementsRangeType } from 'alex-editor'
|
3
3
|
import { event as DapEvent, common as DapCommon } from 'dap-util'
|
4
4
|
import { ObjectType, PluginType } from '@/core/tool'
|
5
|
-
import Layer from '@/components/layer/layer.vue'
|
6
5
|
import Button from '@/components/button/button.vue'
|
7
6
|
import Icon from '@/components/icon/icon.vue'
|
8
7
|
import InsertAttachment from './insertAttachment/insertAttachment.vue'
|
@@ -114,7 +113,7 @@ export const attachment = (options?: AttachmentOptionsType) => {
|
|
114
113
|
customUpload: options!.customUpload,
|
115
114
|
handleError: options!.handleError,
|
116
115
|
onChange: () => {
|
117
|
-
|
116
|
+
btnInstance.layerRef!.setPosition()
|
118
117
|
},
|
119
118
|
onInsert: (name: string, urls: string[]) => {
|
120
119
|
//过滤掉空的地址
|