vue-editify 0.1.26 → 0.1.29
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/core/function.d.ts +265 -0
- package/lib/core/rule.d.ts +32 -0
- package/lib/core/tool.d.ts +50 -1
- package/lib/editify/editify.vue.d.ts +2 -0
- package/lib/editify.es.js +241 -151
- package/lib/editify.umd.js +1 -1
- package/lib/hljs/index.d.ts +9 -0
- package/lib/index.d.ts +2 -2
- package/lib/locale/index.d.ts +5 -0
- package/lib/plugins/attachment/index.d.ts +20 -1
- package/lib/plugins/attachment/insertAttachment/insertAttachment.vue.d.ts +3 -3
- package/lib/plugins/attachment/insertAttachment/props.d.ts +1 -1
- package/lib/style.css +1 -1
- package/package.json +2 -2
- package/src/components/insertImage/insertImage.less +1 -0
- package/src/components/insertVideo/insertVideo.less +1 -0
- package/src/components/menu/menu.vue +45 -9
- package/src/core/function.ts +265 -42
- package/src/core/rule.ts +40 -7
- package/src/core/tool.ts +51 -9
- package/src/editify/editify.less +2 -1
- package/src/editify/editify.vue +20 -17
- package/src/hljs/index.ts +9 -2
- package/src/index.ts +6 -4
- package/src/locale/en_US.ts +3 -2
- package/src/locale/index.ts +5 -2
- package/src/locale/zh_CN.ts +4 -3
- package/src/plugins/attachment/index.ts +94 -36
- package/src/plugins/attachment/insertAttachment/insertAttachment.less +48 -19
- package/src/plugins/attachment/insertAttachment/insertAttachment.vue +26 -56
- package/src/plugins/attachment/insertAttachment/props.ts +1 -1
- package/src/plugins/attachment/images/attachment.png +0 -0
package/lib/editify.es.js
CHANGED
@@ -2622,7 +2622,23 @@ const mergeWithParentElement = function(element2) {
|
|
2622
2622
|
};
|
2623
2623
|
const mergeWithSpaceTextElement = function(element2) {
|
2624
2624
|
if (element2.isText()) {
|
2625
|
-
|
2625
|
+
let val = element2.textContent;
|
2626
|
+
let i = 0;
|
2627
|
+
while (i < val.length) {
|
2628
|
+
const chart = val.charAt(i);
|
2629
|
+
if (isSpaceText(chart) && i > 0 && isSpaceText(val.charAt(i - 1))) {
|
2630
|
+
if (this.range && this.range.anchor.element.isEqual(element2) && this.range.anchor.offset >= i + 1) {
|
2631
|
+
this.range.anchor.offset -= 1;
|
2632
|
+
}
|
2633
|
+
if (this.range && this.range.focus.element.isEqual(element2) && this.range.focus.offset >= i + 1) {
|
2634
|
+
this.range.focus.offset -= 1;
|
2635
|
+
}
|
2636
|
+
val = string$1.delete(val, i, 1);
|
2637
|
+
} else {
|
2638
|
+
i++;
|
2639
|
+
}
|
2640
|
+
}
|
2641
|
+
element2.textContent = val;
|
2626
2642
|
}
|
2627
2643
|
};
|
2628
2644
|
const { Mac } = platform.os();
|
@@ -2987,35 +3003,40 @@ const handleChineseInput = function(e) {
|
|
2987
3003
|
}, 0);
|
2988
3004
|
}
|
2989
3005
|
};
|
2990
|
-
const
|
3006
|
+
const handleKeyboard = function(e) {
|
2991
3007
|
if (this.disabled) {
|
2992
3008
|
return;
|
2993
3009
|
}
|
2994
3010
|
if (this.__isInputChinese) {
|
2995
3011
|
return;
|
2996
3012
|
}
|
2997
|
-
if (
|
2998
|
-
e
|
2999
|
-
|
3000
|
-
|
3001
|
-
|
3002
|
-
|
3003
|
-
|
3004
|
-
|
3005
|
-
|
3006
|
-
|
3007
|
-
|
3008
|
-
|
3009
|
-
e
|
3010
|
-
|
3011
|
-
|
3012
|
-
|
3013
|
-
|
3014
|
-
|
3015
|
-
|
3016
|
-
|
3017
|
-
|
3013
|
+
if (e.type == "keydown") {
|
3014
|
+
if (isUndo(e)) {
|
3015
|
+
e.preventDefault();
|
3016
|
+
const historyRecord = this.history.get(-1);
|
3017
|
+
if (historyRecord) {
|
3018
|
+
this.history.current = historyRecord.current;
|
3019
|
+
this.stack = historyRecord.stack;
|
3020
|
+
this.range = historyRecord.range;
|
3021
|
+
this.formatElementStack();
|
3022
|
+
this.domRender(true);
|
3023
|
+
this.rangeRender();
|
3024
|
+
}
|
3025
|
+
} else if (isRedo(e)) {
|
3026
|
+
e.preventDefault();
|
3027
|
+
const historyRecord = this.history.get(1);
|
3028
|
+
if (historyRecord) {
|
3029
|
+
this.history.current = historyRecord.current;
|
3030
|
+
this.stack = historyRecord.stack;
|
3031
|
+
this.range = historyRecord.range;
|
3032
|
+
this.formatElementStack();
|
3033
|
+
this.domRender(true);
|
3034
|
+
this.rangeRender();
|
3035
|
+
}
|
3018
3036
|
}
|
3037
|
+
this.emit("keydown", this.value, e);
|
3038
|
+
} else if (e.type == "keyup") {
|
3039
|
+
this.emit("keyup", this.value, e);
|
3019
3040
|
}
|
3020
3041
|
};
|
3021
3042
|
const handleCopy = async function(e) {
|
@@ -3100,17 +3121,17 @@ const handleDragDrop = async function(e) {
|
|
3100
3121
|
}
|
3101
3122
|
}
|
3102
3123
|
};
|
3103
|
-
const handleFocus = function() {
|
3124
|
+
const handleFocus = function(e) {
|
3104
3125
|
if (this.disabled) {
|
3105
3126
|
return;
|
3106
3127
|
}
|
3107
|
-
this.emit("focus", this.value);
|
3128
|
+
this.emit("focus", this.value, e);
|
3108
3129
|
};
|
3109
|
-
const handleBlur = function() {
|
3130
|
+
const handleBlur = function(e) {
|
3110
3131
|
if (this.disabled) {
|
3111
3132
|
return;
|
3112
3133
|
}
|
3113
|
-
this.emit("blur", this.value);
|
3134
|
+
this.emit("blur", this.value, e);
|
3114
3135
|
};
|
3115
3136
|
class AlexEditor {
|
3116
3137
|
constructor(node, opts) {
|
@@ -3160,7 +3181,7 @@ class AlexEditor {
|
|
3160
3181
|
event$1.on(document, `selectionchange.alex_editor_${this.__guid}`, handleSelectionChange.bind(this));
|
3161
3182
|
event$1.on(this.$el, "beforeinput.alex_editor", handleBeforeInput.bind(this));
|
3162
3183
|
event$1.on(this.$el, "compositionstart.alex_editor compositionupdate.alex_editor compositionend.alex_editor", handleChineseInput.bind(this));
|
3163
|
-
event$1.on(this.$el, "keydown.alex_editor",
|
3184
|
+
event$1.on(this.$el, "keydown.alex_editor keyup.alex_editor", handleKeyboard.bind(this));
|
3164
3185
|
event$1.on(this.$el, "cut.alex_editor", handleCut.bind(this));
|
3165
3186
|
event$1.on(this.$el, "paste.alex_editor", handlePaste.bind(this));
|
3166
3187
|
event$1.on(this.$el, "copy.alex_editor", handleCopy.bind(this));
|
@@ -4491,6 +4512,8 @@ class AlexEditor {
|
|
4491
4512
|
event$1.off(this.$el, "beforeinput.alex_editor compositionstart.alex_editor compositionupdate.alex_editor compositionend.alex_editor keydown.alex_editor cut.alex_editor paste.alex_editor copy.alex_editor dragstart.alex_editor drop.alex_editor focus.alex_editor blur.alex_editor");
|
4492
4513
|
}
|
4493
4514
|
}
|
4515
|
+
const version$2 = "1.3.33";
|
4516
|
+
console.log(`%c alex-editor %c v${version$2} `, "padding: 2px 1px; border-radius: 3px 0 0 3px; color: #fff; background: #606060; font-weight: bold;", "padding: 2px 1px; border-radius: 0 3px 3px 0; color: #fff; background: #42c02e; font-weight: bold;");
|
4494
4517
|
const number = {
|
4495
4518
|
/**
|
4496
4519
|
* 数字格式化
|
@@ -23268,7 +23291,7 @@ const _hoisted_4$2 = [
|
|
23268
23291
|
];
|
23269
23292
|
const _hoisted_5$1 = { class: "editify-table-footer" };
|
23270
23293
|
const _hoisted_6$1 = { key: 0 };
|
23271
|
-
const _hoisted_7 = { key: 1 };
|
23294
|
+
const _hoisted_7$1 = { key: 1 };
|
23272
23295
|
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
23273
23296
|
...{
|
23274
23297
|
name: "InsertTable"
|
@@ -23344,7 +23367,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
23344
23367
|
}), 256))
|
23345
23368
|
]),
|
23346
23369
|
createElementVNode("div", _hoisted_5$1, [
|
23347
|
-
specification.value ? (openBlock(), createElementBlock("span", _hoisted_6$1, toDisplayString(specification.value.x) + " x " + toDisplayString(specification.value.y), 1)) : (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(unref($editTrans)("insertTable")), 1))
|
23370
|
+
specification.value ? (openBlock(), createElementBlock("span", _hoisted_6$1, toDisplayString(specification.value.x) + " x " + toDisplayString(specification.value.y), 1)) : (openBlock(), createElementBlock("span", _hoisted_7$1, toDisplayString(unref($editTrans)("insertTable")), 1))
|
23348
23371
|
])
|
23349
23372
|
]);
|
23350
23373
|
};
|
@@ -23372,6 +23395,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23372
23395
|
props: MenuProps,
|
23373
23396
|
setup(__props, { expose: __expose }) {
|
23374
23397
|
const props = __props;
|
23398
|
+
const $editTrans = inject("$editTrans");
|
23375
23399
|
const editify = inject("editify");
|
23376
23400
|
const isSourceView = inject("isSourceView");
|
23377
23401
|
const isFullScreen = inject("isFullScreen");
|
@@ -23379,7 +23403,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23379
23403
|
const editor = inject("editor");
|
23380
23404
|
const dataRangeCaches = inject("dataRangeCaches");
|
23381
23405
|
const showBorder = inject("showBorder");
|
23382
|
-
const
|
23406
|
+
const pluginResultList = inject("pluginResultList");
|
23383
23407
|
const undoConfig = ref({
|
23384
23408
|
show: props.config.undo.show,
|
23385
23409
|
leftBorder: props.config.undo.leftBorder,
|
@@ -23652,8 +23676,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23652
23676
|
return editify.props.disabled || !canUseMenu.value;
|
23653
23677
|
});
|
23654
23678
|
const menuNames = computed(() => {
|
23655
|
-
|
23656
|
-
|
23679
|
+
let pluginSequence = {};
|
23680
|
+
pluginResultList.value.forEach((pluginResult) => {
|
23681
|
+
if (pluginResult.menu) {
|
23682
|
+
pluginSequence[pluginResult.name] = pluginResult.menu.sequence;
|
23683
|
+
}
|
23684
|
+
});
|
23685
|
+
pluginSequence = mergeObject(pluginSequence, props.config.sequence);
|
23686
|
+
return Object.keys(pluginSequence).sort((a, b) => {
|
23687
|
+
if (pluginSequence[a] > pluginSequence[b]) {
|
23657
23688
|
return 1;
|
23658
23689
|
}
|
23659
23690
|
return -1;
|
@@ -23681,6 +23712,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23681
23712
|
}
|
23682
23713
|
return showBorder.value;
|
23683
23714
|
});
|
23715
|
+
const menuExtends = computed(() => {
|
23716
|
+
let pluginExtends = {};
|
23717
|
+
pluginResultList.value.forEach((pluginResult) => {
|
23718
|
+
if (pluginResult.menu) {
|
23719
|
+
pluginExtends[pluginResult.name] = pluginResult.menu.extend;
|
23720
|
+
}
|
23721
|
+
});
|
23722
|
+
return mergeObject(pluginExtends, props.config.extends);
|
23723
|
+
});
|
23684
23724
|
const handleOperate = (name, val) => {
|
23685
23725
|
if (disabled.value) {
|
23686
23726
|
return;
|
@@ -23903,10 +23943,21 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23903
23943
|
const value_isRangeInUnorderList = isRangeInList(editor.value, dataRangeCaches.value, false);
|
23904
23944
|
const value_isRangeInTask = isRangeInTask(editor.value, dataRangeCaches.value);
|
23905
23945
|
const extraDisabled = (name) => {
|
23946
|
+
let pluginDisabled = false;
|
23947
|
+
let length = pluginResultList.value.length;
|
23948
|
+
for (let i = 0; i < length; i++) {
|
23949
|
+
const pluginResult = pluginResultList.value[i];
|
23950
|
+
if (pluginResult.menu && typeof pluginResult.menu.extraDisabled == "function") {
|
23951
|
+
pluginDisabled = pluginResult.menu.extraDisabled(name);
|
23952
|
+
if (pluginDisabled) {
|
23953
|
+
break;
|
23954
|
+
}
|
23955
|
+
}
|
23956
|
+
}
|
23906
23957
|
if (typeof props.config.extraDisabled == "function") {
|
23907
|
-
return props.config.extraDisabled(name) || false;
|
23958
|
+
return props.config.extraDisabled(name) || pluginDisabled || false;
|
23908
23959
|
}
|
23909
|
-
return false;
|
23960
|
+
return pluginDisabled || false;
|
23910
23961
|
};
|
23911
23962
|
undoConfig.value.disabled = !editor.value.history.get(-1) || extraDisabled("undo");
|
23912
23963
|
redoConfig.value.disabled = !editor.value.history.get(1) || extraDisabled("redo");
|
@@ -24607,8 +24658,8 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
24607
24658
|
() => h(Icon, { value: "full-screen" })
|
24608
24659
|
);
|
24609
24660
|
}
|
24610
|
-
if (common.isObject(
|
24611
|
-
const configuration =
|
24661
|
+
if (common.isObject(menuExtends.value)) {
|
24662
|
+
const configuration = menuExtends.value[itemProps.name];
|
24612
24663
|
if (configuration) {
|
24613
24664
|
return h(
|
24614
24665
|
Button,
|
@@ -24707,7 +24758,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
24707
24758
|
};
|
24708
24759
|
}
|
24709
24760
|
});
|
24710
|
-
const Menu = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-
|
24761
|
+
const Menu = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-b3e98aec"]]);
|
24711
24762
|
const EditifyProps = {
|
24712
24763
|
//国际化语言类型
|
24713
24764
|
locale: {
|
@@ -24941,9 +24992,10 @@ const en_US = {
|
|
24941
24992
|
insertAttachment: "Insert attachment",
|
24942
24993
|
uploadAttachment: "Upload",
|
24943
24994
|
remoteAttachment: "Remote",
|
24995
|
+
attachmentNamePlaceholder: "Please enter the attachment name",
|
24944
24996
|
attachmentUrlPlaceholder: "Please enter the attachment address",
|
24945
|
-
|
24946
|
-
|
24997
|
+
attachmentDownloadTitle: "Click to download attachment",
|
24998
|
+
attachmentDefaultName: "attachment"
|
24947
24999
|
};
|
24948
25000
|
const zh_CN = {
|
24949
25001
|
textWrapUp: "向上换行",
|
@@ -25034,9 +25086,10 @@ const zh_CN = {
|
|
25034
25086
|
insertAttachment: "插入附件",
|
25035
25087
|
uploadAttachment: "上传附件",
|
25036
25088
|
remoteAttachment: "远程地址",
|
25037
|
-
|
25038
|
-
|
25039
|
-
|
25089
|
+
attachmentNamePlaceholder: "请输入附件名称",
|
25090
|
+
attachmentUrlPlaceholder: "请输入附件地址",
|
25091
|
+
attachmentDownloadTitle: "点击下载附件",
|
25092
|
+
attachmentDefaultName: "附件"
|
25040
25093
|
};
|
25041
25094
|
const trans = (locale) => {
|
25042
25095
|
return (key) => {
|
@@ -25053,13 +25106,12 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25053
25106
|
},
|
25054
25107
|
__name: "editify",
|
25055
25108
|
props: EditifyProps,
|
25056
|
-
emits: ["update:modelValue", "focus", "blur", "change", "keydown", "insertparagraph", "rangeupdate", "updateview"],
|
25109
|
+
emits: ["update:modelValue", "focus", "blur", "change", "keydown", "keyup", "insertparagraph", "rangeupdate", "updateview"],
|
25057
25110
|
setup(__props, { expose: __expose, emit: __emit }) {
|
25058
25111
|
const instance = getCurrentInstance();
|
25059
25112
|
const props = __props;
|
25060
25113
|
const emits = __emit;
|
25061
25114
|
const $editTrans = trans(props.locale || "zh_CN");
|
25062
|
-
provide("$editTrans", $editTrans);
|
25063
25115
|
const isModelChange = ref(false);
|
25064
25116
|
const isInputChinese = ref(false);
|
25065
25117
|
const rangeUpdateTimer = ref(null);
|
@@ -25128,12 +25180,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25128
25180
|
return pluginResultList2;
|
25129
25181
|
});
|
25130
25182
|
const menuConfig = computed(() => {
|
25131
|
-
|
25132
|
-
pluginResultList.value.forEach((pluginResult) => {
|
25133
|
-
menu = mergeObject(menu, pluginResult.menu || {});
|
25134
|
-
});
|
25135
|
-
menu = mergeObject(menu, props.menu || {});
|
25136
|
-
return mergeObject(getMenuConfig($editTrans, props.locale), menu);
|
25183
|
+
return mergeObject(getMenuConfig($editTrans, props.locale), props.menu || {});
|
25137
25184
|
});
|
25138
25185
|
const internalModify = (val) => {
|
25139
25186
|
isModelChange.value = true;
|
@@ -25283,6 +25330,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25283
25330
|
editor.value.on("change", handleEditorChange);
|
25284
25331
|
editor.value.on("focus", handleEditorFocus);
|
25285
25332
|
editor.value.on("blur", handleEditorBlur);
|
25333
|
+
editor.value.on("keydown", handleEditorKeydown);
|
25334
|
+
editor.value.on("keyup", handleEditorKeyup);
|
25286
25335
|
editor.value.on("insertParagraph", handleInsertParagraph);
|
25287
25336
|
editor.value.on("rangeUpdate", handleRangeUpdate);
|
25288
25337
|
editor.value.on("deleteInStart", handleDeleteInStart);
|
@@ -25475,7 +25524,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25475
25524
|
}
|
25476
25525
|
return ele;
|
25477
25526
|
};
|
25478
|
-
const handleEditorKeydown = (e) => {
|
25527
|
+
const handleEditorKeydown = (val, e) => {
|
25479
25528
|
if (props.disabled) {
|
25480
25529
|
return;
|
25481
25530
|
}
|
@@ -25486,7 +25535,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25486
25535
|
editor.value.domRender();
|
25487
25536
|
editor.value.rangeRender();
|
25488
25537
|
}
|
25489
|
-
emits("keydown", e);
|
25538
|
+
emits("keydown", val, e);
|
25539
|
+
};
|
25540
|
+
const handleEditorKeyup = (val, e) => {
|
25541
|
+
if (props.disabled) {
|
25542
|
+
return;
|
25543
|
+
}
|
25544
|
+
emits("keyup", val, e);
|
25490
25545
|
};
|
25491
25546
|
const handleEditorClick = (e) => {
|
25492
25547
|
if (props.disabled || isSourceView.value) {
|
@@ -25551,7 +25606,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25551
25606
|
};
|
25552
25607
|
const handleInsertParagraph = (element2, previousElement) => {
|
25553
25608
|
if (!element2.isEqual(previousElement)) {
|
25554
|
-
if (previousElement.isOnlyHasBreak() && element2.isOnlyHasBreak()) {
|
25609
|
+
if (previousElement.isBlock() && element2.isBlock() && previousElement.isOnlyHasBreak() && element2.isOnlyHasBreak()) {
|
25555
25610
|
if (previousElement.parsedom != AlexElement.BLOCK_NODE) {
|
25556
25611
|
elementToParagraph(previousElement);
|
25557
25612
|
editor.value.range.anchor.moveToStart(previousElement);
|
@@ -25715,6 +25770,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25715
25770
|
event.off(window, `resize.editify_${instance.uid}`);
|
25716
25771
|
editor.value.destroy();
|
25717
25772
|
});
|
25773
|
+
provide("$editTrans", $editTrans);
|
25718
25774
|
provide("editify", instance);
|
25719
25775
|
provide("isSourceView", isSourceView);
|
25720
25776
|
provide("isFullScreen", isFullScreen);
|
@@ -25722,6 +25778,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25722
25778
|
provide("editor", editor);
|
25723
25779
|
provide("dataRangeCaches", dataRangeCaches);
|
25724
25780
|
provide("showBorder", showBorder);
|
25781
|
+
provide("pluginResultList", pluginResultList);
|
25725
25782
|
__expose({
|
25726
25783
|
editor,
|
25727
25784
|
isSourceView,
|
@@ -25757,7 +25814,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25757
25814
|
ref_key: "contentRef",
|
25758
25815
|
ref: contentRef,
|
25759
25816
|
class: normalizeClass(["editify-content", { "editify-placeholder": showPlaceholder.value, "editify-disabled": _ctx.disabled }]),
|
25760
|
-
onKeydown: handleEditorKeydown,
|
25761
25817
|
onClick: handleEditorClick,
|
25762
25818
|
onCompositionstart: _cache[0] || (_cache[0] = ($event) => isInputChinese.value = true),
|
25763
25819
|
onCompositionend: _cache[1] || (_cache[1] = ($event) => isInputChinese.value = false),
|
@@ -25792,7 +25848,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25792
25848
|
};
|
25793
25849
|
}
|
25794
25850
|
});
|
25795
|
-
const Editify = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-
|
25851
|
+
const Editify = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-306d3e9a"]]);
|
25796
25852
|
const InsertAttachmentProps = {
|
25797
25853
|
//主题色
|
25798
25854
|
color: {
|
@@ -25842,11 +25898,13 @@ const _hoisted_3 = {
|
|
25842
25898
|
class: "editify-attachment-remote"
|
25843
25899
|
};
|
25844
25900
|
const _hoisted_4 = ["placeholder"];
|
25845
|
-
const _hoisted_5 =
|
25901
|
+
const _hoisted_5 = ["placeholder"];
|
25902
|
+
const _hoisted_6 = {
|
25846
25903
|
key: 1,
|
25847
25904
|
class: "editify-attachment-upload"
|
25848
25905
|
};
|
25849
|
-
const
|
25906
|
+
const _hoisted_7 = ["placeholder"];
|
25907
|
+
const _hoisted_8 = ["multiple", "accept"];
|
25850
25908
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
25851
25909
|
...{
|
25852
25910
|
name: "InsertAttachment"
|
@@ -25859,7 +25917,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
25859
25917
|
const emits = __emit;
|
25860
25918
|
const $editTrans = inject("$editTrans");
|
25861
25919
|
const current = ref("upload");
|
25862
|
-
const
|
25920
|
+
const attachmentName = ref("");
|
25921
|
+
const attachmentUrl = ref("");
|
25922
|
+
const fileInputRef = ref(null);
|
25863
25923
|
const activeStyle = computed(() => {
|
25864
25924
|
return (name) => {
|
25865
25925
|
if (current.value == name) {
|
@@ -25870,47 +25930,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
25870
25930
|
return {};
|
25871
25931
|
};
|
25872
25932
|
});
|
25873
|
-
const acceptValue = computed(() => {
|
25874
|
-
if (props.accept === "rar") {
|
25875
|
-
return "application/x-rar-compressed";
|
25876
|
-
}
|
25877
|
-
if (props.accept === "zip") {
|
25878
|
-
return "application/x-zip-compressed";
|
25879
|
-
}
|
25880
|
-
if (props.accept === "txt") {
|
25881
|
-
return "text/plain";
|
25882
|
-
}
|
25883
|
-
if (props.accept === "image") {
|
25884
|
-
return "image/*";
|
25885
|
-
}
|
25886
|
-
if (props.accept === "video") {
|
25887
|
-
return "video/*";
|
25888
|
-
}
|
25889
|
-
if (props.accept === "audio") {
|
25890
|
-
return "aduio/*";
|
25891
|
-
}
|
25892
|
-
if (props.accept === "html") {
|
25893
|
-
return "text/html";
|
25894
|
-
}
|
25895
|
-
if (props.accept === "doc") {
|
25896
|
-
return "application/msword";
|
25897
|
-
}
|
25898
|
-
if (props.accept === "xml") {
|
25899
|
-
return "text/xml";
|
25900
|
-
}
|
25901
|
-
if (props.accept === "js") {
|
25902
|
-
return "text/javascript";
|
25903
|
-
}
|
25904
|
-
if (props.accept === "json") {
|
25905
|
-
return "application/json";
|
25906
|
-
}
|
25907
|
-
if (props.accept === "ppt") {
|
25908
|
-
return "application/vnd.ms-powerpoint";
|
25909
|
-
}
|
25910
|
-
if (props.accept === "pdf") {
|
25911
|
-
return "application/pdf";
|
25912
|
-
}
|
25913
|
-
});
|
25914
25933
|
const getSuffix = (file2) => {
|
25915
25934
|
const index = file2.name.lastIndexOf(".");
|
25916
25935
|
if (index <= 0) {
|
@@ -25927,11 +25946,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
25927
25946
|
e.currentTarget.style.borderColor = "";
|
25928
25947
|
};
|
25929
25948
|
const insertRemoteAttachment = () => {
|
25930
|
-
emits("insert",
|
25949
|
+
emits("insert", attachmentName.value, attachmentUrl.value);
|
25931
25950
|
};
|
25932
|
-
const
|
25933
|
-
|
25934
|
-
|
25951
|
+
const triggerFileInput = () => {
|
25952
|
+
fileInputRef.value.click();
|
25953
|
+
};
|
25954
|
+
const selectFile = async () => {
|
25955
|
+
const files = fileInputRef.value.files;
|
25935
25956
|
if (!files || !files.length) {
|
25936
25957
|
return;
|
25937
25958
|
}
|
@@ -25973,10 +25994,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
25973
25994
|
}
|
25974
25995
|
}
|
25975
25996
|
attachments.forEach((url) => {
|
25976
|
-
emits("insert", url);
|
25997
|
+
emits("insert", attachmentName.value, url);
|
25977
25998
|
});
|
25978
25999
|
}
|
25979
|
-
|
26000
|
+
fileInputRef.value.value = "";
|
25980
26001
|
};
|
25981
26002
|
watch(
|
25982
26003
|
() => current.value,
|
@@ -26004,14 +26025,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
26004
26025
|
]),
|
26005
26026
|
current.value == "remote" ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
26006
26027
|
withDirectives(createElementVNode("input", {
|
26007
|
-
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) =>
|
26008
|
-
placeholder: unref($editTrans)("
|
26028
|
+
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => attachmentName.value = $event),
|
26029
|
+
placeholder: unref($editTrans)("attachmentNamePlaceholder"),
|
26009
26030
|
onBlur: handleInputBlur,
|
26010
|
-
onFocus: handleInputFocus
|
26031
|
+
onFocus: handleInputFocus,
|
26032
|
+
type: "text"
|
26011
26033
|
}, null, 40, _hoisted_4), [
|
26012
26034
|
[
|
26013
26035
|
vModelText,
|
26014
|
-
|
26036
|
+
attachmentName.value,
|
26037
|
+
void 0,
|
26038
|
+
{ trim: true }
|
26039
|
+
]
|
26040
|
+
]),
|
26041
|
+
withDirectives(createElementVNode("input", {
|
26042
|
+
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => attachmentUrl.value = $event),
|
26043
|
+
placeholder: unref($editTrans)("attachmentUrlPlaceholder"),
|
26044
|
+
onBlur: handleInputBlur,
|
26045
|
+
onFocus: handleInputFocus,
|
26046
|
+
type: "url"
|
26047
|
+
}, null, 40, _hoisted_5), [
|
26048
|
+
[
|
26049
|
+
vModelText,
|
26050
|
+
attachmentUrl.value,
|
26015
26051
|
void 0,
|
26016
26052
|
{ trim: true }
|
26017
26053
|
]
|
@@ -26022,55 +26058,103 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
26022
26058
|
}, [
|
26023
26059
|
createElementVNode("span", { onClick: insertRemoteAttachment }, toDisplayString(unref($editTrans)("insert")), 1)
|
26024
26060
|
], 4)
|
26025
|
-
])) : (openBlock(), createElementBlock("div",
|
26026
|
-
|
26027
|
-
|
26028
|
-
|
26029
|
-
|
26030
|
-
|
26031
|
-
type: "
|
26032
|
-
}, null, 40,
|
26061
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_6, [
|
26062
|
+
withDirectives(createElementVNode("input", {
|
26063
|
+
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => attachmentName.value = $event),
|
26064
|
+
placeholder: unref($editTrans)("attachmentNamePlaceholder"),
|
26065
|
+
onBlur: handleInputBlur,
|
26066
|
+
onFocus: handleInputFocus,
|
26067
|
+
type: "text"
|
26068
|
+
}, null, 40, _hoisted_7), [
|
26069
|
+
[
|
26070
|
+
vModelText,
|
26071
|
+
attachmentName.value,
|
26072
|
+
void 0,
|
26073
|
+
{ trim: true }
|
26074
|
+
]
|
26075
|
+
]),
|
26076
|
+
createElementVNode("div", {
|
26077
|
+
class: "editify-attachment-btn",
|
26078
|
+
onClick: triggerFileInput
|
26079
|
+
}, [
|
26080
|
+
createVNode(Icon, { value: "upload" }),
|
26081
|
+
createElementVNode("input", {
|
26082
|
+
ref_key: "fileInputRef",
|
26083
|
+
ref: fileInputRef,
|
26084
|
+
multiple: _ctx.multiple,
|
26085
|
+
accept: _ctx.accept,
|
26086
|
+
onChange: selectFile,
|
26087
|
+
type: "file"
|
26088
|
+
}, null, 40, _hoisted_8)
|
26089
|
+
])
|
26033
26090
|
]))
|
26034
26091
|
]);
|
26035
26092
|
};
|
26036
26093
|
}
|
26037
26094
|
});
|
26038
|
-
const InsertAttachment = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
26095
|
+
const InsertAttachment = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f995f4bd"]]);
|
26096
|
+
const isAttachment = (element2) => {
|
26097
|
+
if (element2.isEmpty()) {
|
26098
|
+
return false;
|
26099
|
+
}
|
26100
|
+
return element2.parsedom == "span" && element2.type == "closed" && element2.hasMarks() && element2.marks["data-attachment"];
|
26101
|
+
};
|
26102
|
+
const hasAttachmentInRange = (editor, dataRangeCaches) => {
|
26103
|
+
if (!editor.range) {
|
26104
|
+
return false;
|
26105
|
+
}
|
26106
|
+
if (editor.range.anchor.isEqual(editor.range.focus)) {
|
26107
|
+
return isAttachment(editor.range.anchor.element);
|
26108
|
+
}
|
26109
|
+
return dataRangeCaches.flatList.some((item) => {
|
26110
|
+
return isAttachment(item.element);
|
26111
|
+
});
|
26112
|
+
};
|
26039
26113
|
const attachment = (options) => {
|
26040
26114
|
if (!common.isObject(options)) {
|
26041
26115
|
options = {};
|
26042
26116
|
}
|
26043
26117
|
const plugin = (editifyInstance, color2, editTrans) => {
|
26118
|
+
let isDisabled = false;
|
26119
|
+
if (editifyInstance.exposed.editor.value) {
|
26120
|
+
isDisabled = hasPreInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value) || hasLinkInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value) || hasQuoteInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value);
|
26121
|
+
}
|
26044
26122
|
return {
|
26123
|
+
name: "attachment",
|
26045
26124
|
//附件菜单项配置
|
26046
26125
|
menu: {
|
26047
|
-
sequence:
|
26048
|
-
|
26126
|
+
sequence: options.sequence || 100,
|
26127
|
+
extraDisabled: (name) => {
|
26128
|
+
if (name == "link" || name == "quote") {
|
26129
|
+
return hasAttachmentInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value);
|
26130
|
+
}
|
26131
|
+
return false;
|
26049
26132
|
},
|
26050
|
-
|
26051
|
-
|
26052
|
-
|
26053
|
-
|
26054
|
-
|
26055
|
-
|
26056
|
-
|
26057
|
-
|
26058
|
-
|
26059
|
-
|
26060
|
-
|
26061
|
-
|
26062
|
-
|
26063
|
-
|
26064
|
-
|
26065
|
-
|
26066
|
-
|
26067
|
-
|
26068
|
-
|
26069
|
-
|
26070
|
-
|
26133
|
+
extend: {
|
26134
|
+
type: "select",
|
26135
|
+
title: options.title || editTrans("insertAttachment"),
|
26136
|
+
leftBorder: options.leftBorder,
|
26137
|
+
rightBorder: options.rightBorder,
|
26138
|
+
hideScroll: true,
|
26139
|
+
disabled: isDisabled,
|
26140
|
+
default: () => h(Icon, { value: "attachment" }),
|
26141
|
+
layer: (_name, btnInstance) => h(InsertAttachment, {
|
26142
|
+
color: color2,
|
26143
|
+
accept: options.accept,
|
26144
|
+
allowedFileType: options.allowedFileType || [],
|
26145
|
+
multiple: !!options.multiple,
|
26146
|
+
maxSize: options.maxSize,
|
26147
|
+
minSize: options.minSize,
|
26148
|
+
customUpload: options.customUpload,
|
26149
|
+
handleError: options.handleError,
|
26150
|
+
onChange: () => {
|
26151
|
+
btnInstance.$refs.layerRef.setPosition();
|
26152
|
+
},
|
26153
|
+
onInsert: (name, url) => {
|
26154
|
+
if (url) {
|
26071
26155
|
const marks = {
|
26072
26156
|
"data-attachment": url,
|
26073
|
-
"data-attachment-name": editTrans("
|
26157
|
+
"data-attachment-name": name || editTrans("attachmentDefaultName"),
|
26074
26158
|
contenteditable: "false"
|
26075
26159
|
};
|
26076
26160
|
const attachmentElement = new AlexElement("closed", "span", marks, null, null);
|
@@ -26085,10 +26169,10 @@ const attachment = (options) => {
|
|
26085
26169
|
editor.formatElementStack();
|
26086
26170
|
editor.domRender();
|
26087
26171
|
editor.rangeRender();
|
26088
|
-
btnInstance.show = false;
|
26089
26172
|
}
|
26090
|
-
|
26091
|
-
|
26173
|
+
btnInstance.show = false;
|
26174
|
+
}
|
26175
|
+
})
|
26092
26176
|
}
|
26093
26177
|
},
|
26094
26178
|
//找到附件元素点击下载
|
@@ -26097,11 +26181,16 @@ const attachment = (options) => {
|
|
26097
26181
|
AlexElement.flatElements(editor.stack).forEach((el) => {
|
26098
26182
|
if (el.parsedom == "span" && el.hasMarks() && el.marks["data-attachment"]) {
|
26099
26183
|
event.off(el.elm, "click");
|
26100
|
-
event.on(el.elm, "click", () => {
|
26184
|
+
event.on(el.elm, "click", async () => {
|
26101
26185
|
const url = el.marks["data-attachment"];
|
26186
|
+
const res = await fetch(url, {
|
26187
|
+
method: "GET"
|
26188
|
+
});
|
26189
|
+
const blob = await res.blob();
|
26102
26190
|
const a = document.createElement("a");
|
26103
|
-
a.setAttribute("
|
26104
|
-
a.setAttribute("
|
26191
|
+
a.setAttribute("target", "_blank");
|
26192
|
+
a.setAttribute("href", URL.createObjectURL(blob));
|
26193
|
+
a.setAttribute("download", el.marks["data-attachment-name"]);
|
26105
26194
|
a.click();
|
26106
26195
|
});
|
26107
26196
|
}
|
@@ -26122,7 +26211,7 @@ const attachment = (options) => {
|
|
26122
26211
|
//自定义渲染规范
|
26123
26212
|
renderRule: (el) => {
|
26124
26213
|
if (el.type == "closed" && el.hasMarks() && el.marks["data-attachment"]) {
|
26125
|
-
el.marks["title"] = editTrans("
|
26214
|
+
el.marks["title"] = editTrans("attachmentDownloadTitle");
|
26126
26215
|
const editor = editifyInstance.exposed.editor.value;
|
26127
26216
|
const previousElement = editor.getPreviousElement(el);
|
26128
26217
|
const newTextElement = editor.getNextElement(el);
|
@@ -26143,7 +26232,8 @@ const attachment = (options) => {
|
|
26143
26232
|
const install = (app) => {
|
26144
26233
|
app.component(Editify.name, Editify);
|
26145
26234
|
};
|
26146
|
-
const version = "0.1.
|
26235
|
+
const version = "0.1.29";
|
26236
|
+
console.log(`%c vue-editify %c v${version} `, "padding: 2px 1px; border-radius: 3px 0 0 3px; color: #fff; background: #606060; font-weight: bold;", "padding: 2px 1px; border-radius: 0 3px 3px 0; color: #fff; background: #42c02e; font-weight: bold;");
|
26147
26237
|
export {
|
26148
26238
|
AlexElement,
|
26149
26239
|
Editify,
|