@ctzy-web-client/plugin-component-vue 1.0.23 → 1.0.25

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.
Files changed (131) hide show
  1. package/es/advance-select/advance-operation.mjs +51 -37
  2. package/es/advance-select/advance-option.mjs +167 -97
  3. package/es/advance-select/advance-option.vue_vue_type_style_index_0_scoped_bc8f5626_lang.mjs +7 -0
  4. package/es/advance-select/advance-select.mjs +368 -310
  5. package/es/advance-select/index.mjs +5 -5
  6. package/es/application-slot/breadcrumb-item.mjs +20 -17
  7. package/es/application-slot/header-tools-item.mjs +20 -17
  8. package/es/breadcrumb-select/breadcrumb-select.mjs +134 -112
  9. package/es/contextmenu/contextmenu-item.mjs +19 -15
  10. package/es/contextmenu/contextmenu.mjs +72 -56
  11. package/es/data-form/data-form-item.mjs +48 -30
  12. package/es/data-form/data-form.mjs +213 -166
  13. package/es/data-form/form-components/bwa-date-picker.mjs +51 -39
  14. package/es/data-form/form-components/bwa-date-time-picker.mjs +56 -44
  15. package/es/data-form/form-components/bwa-input-float.mjs +48 -37
  16. package/es/data-form/form-components/bwa-input-integer.mjs +68 -50
  17. package/es/data-form/form-components/bwa-input.mjs +43 -32
  18. package/es/data-form/form-components/bwa-multi-select.mjs +40 -29
  19. package/es/data-form/form-components/bwa-rich-text-tinymce.mjs +554 -218
  20. package/es/data-form/form-components/bwa-rich-text.mjs +404 -316
  21. package/es/data-form/form-components/bwa-select.mjs +84 -70
  22. package/es/data-form/form-components/bwa-textarea.mjs +38 -27
  23. package/es/data-form/form-components/bwa-upload.mjs +172 -148
  24. package/es/data-form/form-components/bwa-user-multi-select.mjs +35 -24
  25. package/es/data-form/form-components/bwa-user-select.mjs +86 -61
  26. package/es/data-table/data-column-view.mjs +146 -115
  27. package/es/data-table/data-table-card.mjs +48 -40
  28. package/es/data-table/data-table-column.mjs +58 -45
  29. package/es/data-table/data-table.mjs +402 -316
  30. package/es/datatable-settings/datatable-settings.mjs +329 -254
  31. package/es/date-range/date-picker.mjs +130 -116
  32. package/es/date-range/date-range.mjs +215 -161
  33. package/es/drag-list/drag-item.mjs +56 -42
  34. package/es/drag-list/drag-list.mjs +60 -47
  35. package/es/dragable/dragable-item.mjs +23 -18
  36. package/es/dragable/dragable-operation.mjs +32 -24
  37. package/es/dragable/dragable.mjs +32 -23
  38. package/es/filter-panel/conditions/date-range-condition.mjs +50 -40
  39. package/es/filter-panel/conditions/department-condition/department-condition.mjs +99 -72
  40. package/es/filter-panel/conditions/department-condition/department-node.mjs +73 -59
  41. package/es/filter-panel/conditions/input-condition.mjs +90 -76
  42. package/es/filter-panel/conditions/multi-user-condition.mjs +67 -57
  43. package/es/filter-panel/conditions/multiple-menu-condition.mjs +54 -35
  44. package/es/filter-panel/conditions/single-menu-condition.mjs +65 -60
  45. package/es/filter-panel/conditions/single-user-condition.mjs +67 -57
  46. package/es/filter-panel/filter-panel-item.mjs +54 -39
  47. package/es/filter-panel/filter-panel.mjs +153 -135
  48. package/es/layout/layout.mjs +85 -78
  49. package/es/menu/menu-item.mjs +67 -52
  50. package/es/menu/menu.mjs +70 -53
  51. package/es/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.mjs +28 -0
  52. package/es/panel/panel.mjs +53 -40
  53. package/es/pct-filter-panel/pct-compents/pct-Input-condition.mjs +74 -63
  54. package/es/pct-filter-panel/pct-compents/pct-date-range-condition.mjs +76 -67
  55. package/es/pct-filter-panel/pct-compents/pct-multiple-menu-condition.mjs +406 -178
  56. package/es/pct-filter-panel/pct-compents/pct-multiple-menu-condition2.mjs +153 -138
  57. package/es/pct-filter-panel/pct-filter-panel-item.mjs +55 -40
  58. package/es/pct-filter-panel/pct-filter-panel.mjs +247 -227
  59. package/es/progress/progress-item.mjs +81 -61
  60. package/es/progress/progress.mjs +78 -64
  61. package/es/where-filter-panel/where-filter-panel.mjs +15 -12
  62. package/lib/advance-select/advance-operation.js +50 -36
  63. package/lib/advance-select/advance-option.js +166 -96
  64. package/lib/advance-select/advance-option.vue_vue_type_style_index_0_scoped_bc8f5626_lang.js +12 -0
  65. package/lib/advance-select/advance-select.js +366 -308
  66. package/lib/application-slot/breadcrumb-item.js +19 -16
  67. package/lib/application-slot/header-tools-item.js +19 -16
  68. package/lib/breadcrumb-select/breadcrumb-select.js +133 -111
  69. package/lib/contextmenu/contextmenu-item.js +18 -14
  70. package/lib/contextmenu/contextmenu.js +71 -55
  71. package/lib/data-form/data-form-item.js +47 -29
  72. package/lib/data-form/data-form.js +212 -165
  73. package/lib/data-form/form-components/bwa-date-picker.js +50 -38
  74. package/lib/data-form/form-components/bwa-date-time-picker.js +55 -43
  75. package/lib/data-form/form-components/bwa-input-float.js +47 -36
  76. package/lib/data-form/form-components/bwa-input-integer.js +67 -49
  77. package/lib/data-form/form-components/bwa-input.js +42 -31
  78. package/lib/data-form/form-components/bwa-multi-select.js +39 -28
  79. package/lib/data-form/form-components/bwa-rich-text-tinymce.js +553 -217
  80. package/lib/data-form/form-components/bwa-rich-text.js +403 -315
  81. package/lib/data-form/form-components/bwa-select.js +83 -69
  82. package/lib/data-form/form-components/bwa-textarea.js +37 -26
  83. package/lib/data-form/form-components/bwa-upload.js +171 -147
  84. package/lib/data-form/form-components/bwa-user-multi-select.js +34 -23
  85. package/lib/data-form/form-components/bwa-user-select.js +85 -60
  86. package/lib/data-table/data-column-view.js +146 -115
  87. package/lib/data-table/data-table-card.js +48 -40
  88. package/lib/data-table/data-table-column.js +57 -44
  89. package/lib/data-table/data-table.js +401 -315
  90. package/lib/datatable-settings/datatable-settings.js +328 -253
  91. package/lib/date-range/date-picker.js +129 -115
  92. package/lib/date-range/date-range.js +214 -160
  93. package/lib/drag-list/drag-item.js +55 -41
  94. package/lib/drag-list/drag-list.js +59 -46
  95. package/lib/dragable/dragable-item.js +22 -17
  96. package/lib/dragable/dragable-operation.js +31 -23
  97. package/lib/dragable/dragable.js +31 -22
  98. package/lib/filter-panel/conditions/date-range-condition.js +49 -39
  99. package/lib/filter-panel/conditions/department-condition/department-condition.js +98 -71
  100. package/lib/filter-panel/conditions/department-condition/department-node.js +72 -58
  101. package/lib/filter-panel/conditions/input-condition.js +89 -75
  102. package/lib/filter-panel/conditions/multi-user-condition.js +66 -56
  103. package/lib/filter-panel/conditions/multiple-menu-condition.js +53 -34
  104. package/lib/filter-panel/conditions/single-menu-condition.js +64 -59
  105. package/lib/filter-panel/conditions/single-user-condition.js +66 -56
  106. package/lib/filter-panel/filter-panel-item.js +53 -38
  107. package/lib/filter-panel/filter-panel.js +152 -134
  108. package/lib/layout/layout.js +84 -77
  109. package/lib/menu/menu-item.js +66 -51
  110. package/lib/menu/menu.js +69 -52
  111. package/lib/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +32 -0
  112. package/lib/panel/panel.js +52 -39
  113. package/lib/pct-filter-panel/pct-compents/pct-Input-condition.js +73 -62
  114. package/lib/pct-filter-panel/pct-compents/pct-date-range-condition.js +75 -66
  115. package/lib/pct-filter-panel/pct-compents/pct-multiple-menu-condition.js +405 -177
  116. package/lib/pct-filter-panel/pct-compents/pct-multiple-menu-condition2.js +152 -137
  117. package/lib/pct-filter-panel/pct-filter-panel-item.js +54 -39
  118. package/lib/pct-filter-panel/pct-filter-panel.js +246 -226
  119. package/lib/progress/progress-item.js +80 -60
  120. package/lib/progress/progress.js +77 -63
  121. package/lib/where-filter-panel/where-filter-panel.js +14 -11
  122. package/package.json +2 -1
  123. package/src/advance-select/advance-option.vue +64 -13
  124. package/src/data-form/form-components/bwa-rich-text-tinymce.vue +1 -1
  125. package/src/datatable-settings/datatable-settings.vue +33 -3
  126. package/src/date-range/date-picker.vue +1 -1
  127. package/src/filter-panel/filter-panel.vue +2 -2
  128. package/src/pct-filter-panel/pct-compents/pct-Input-condition.vue +64 -64
  129. package/src/pct-filter-panel/pct-compents/pct-date-range-condition.vue +61 -61
  130. package/src/pct-filter-panel/pct-compents/pct-multiple-menu-condition.vue +302 -178
  131. package/src/pct-filter-panel/pct-filter-panel.vue +4 -4
@@ -1,325 +1,413 @@
1
- import { defineComponent, ref, unref, getCurrentScope, computed, onMounted, markRaw, watch, onScopeDispose, resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, createVNode, withCtx, Fragment, renderList, createBlock } from 'vue';
1
+ import { ref, unref, getCurrentScope, computed, onMounted, markRaw, watch, onScopeDispose, resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, createVNode, withCtx, Fragment, renderList, createBlock } from 'vue';
2
2
  import { useService, useNamespace } from '@ctzy-web-client/web-base-client-vue';
3
3
  import Quill from 'quill';
4
4
  import 'quill/dist/quill.snow.css';
5
5
  import { ElMessage } from 'element-plus';
6
6
  import _export_sfc from '../../_virtual/_plugin-vue_export-helper.mjs';
7
7
 
8
- const __default__ = defineComponent({
9
- name: "BwaRichText"
10
- });
11
- const _sfc_main = /* @__PURE__ */ Object.assign(__default__, {
12
- props: {
13
- placeholder: {
14
- type: String,
15
- default: ""
16
- },
17
- modelValue: {
18
- type: null
19
- },
20
- disabled: {
21
- type: Boolean,
22
- default: false
23
- },
24
- showAt: {
25
- type: Boolean,
26
- default: false
27
- },
28
- userIds: {
29
- typee: Array,
30
- default: () => []
31
- }
32
- },
33
- emits: ["update:modelValue", "update:userIds"],
8
+ const _sfc_main = {
9
+ __name: 'bwa-rich-text',
10
+ props: {
11
+ placeholder: {
12
+ type: String,
13
+ default: '',
14
+ },
15
+ modelValue: {
16
+ type: null,
17
+ },
18
+ disabled: {
19
+ type: Boolean,
20
+ default: false,
21
+ },
22
+ showAt: {
23
+ type: Boolean,
24
+ default: false,
25
+ },
26
+ userIds: {
27
+ typee: Array,
28
+ default: () => [],
29
+ },
30
+ },
31
+ emits: ['update:modelValue', 'update:userIds'],
34
32
  setup(__props, { expose, emit }) {
35
- const props = __props;
36
- let editor = null;
37
- const userService = useService("UserService");
38
- const loading = ref(false);
39
- const userList = ref([
40
- { value: "1", label: "\u7528\u62371" },
41
- { value: "2", label: "\u7528\u62372" },
42
- { value: "3", label: "\u7528\u62373" }
43
- ]);
44
- const handleChange = ([userId]) => {
45
- if (!editor || !userId) {
46
- return;
47
- }
48
- const userInfo = unref(userList).find((item) => item.value === userId);
49
- if (!userInfo) {
50
- return;
51
- }
52
- editor.focus();
53
- let length = editor.getSelection() ? editor.getSelection().index || 0 : editor.getLength();
54
- editor.insertEmbed(
55
- length,
56
- "at",
57
- { id: userInfo.value, desc: userInfo.label },
58
- "user"
59
- );
60
- editor.insertText(length + 1, " ");
61
- editor.setSelection(length + 2);
62
- };
63
- const loadUserList = async (search = "") => {
64
- try {
65
- if (unref(loading)) {
66
- return;
67
- }
68
- loading.value = true;
69
- if (!unref(userService)) {
70
- ElMessage.error("\u65E0\u6CD5\u83B7\u53D6\u7528\u6237");
71
- return;
72
- }
73
- const userListResult = await unref(userService).getUserList({
74
- name: search
75
- });
76
- if (userListResult.code != 0) {
77
- ElMessage.error(userListResult.msg);
78
- return;
79
- }
80
- userList.value = userListResult.data;
81
- } finally {
82
- loading.value = false;
83
- }
84
- };
85
- const handleVisibleChange = (visible) => {
86
- if (!visible) {
87
- return;
88
- }
89
- loadUserList();
90
- };
91
- const virtualRef = ref(null);
92
- ;
93
- const ns = useNamespace("rich-text");
94
- const fileService = useService("FileService");
95
- const quillEditorContainer = ref(null);
96
- const quillEditorRef = ref(null);
97
- const currentScope = getCurrentScope();
98
- const editorInstance = ref(null);
99
- const toolbarOptions = [
100
- [{ header: [1, 2, 3, 4, 5, 6, false] }],
101
- [{ font: [] }],
102
- ["bold", "italic", "underline", "strike"],
103
- [{ align: [] }],
104
- ["blockquote", "code-block"],
105
- [{ header: 1 }, { header: 2 }],
106
- [{ list: "ordered" }, { list: "bullet" }],
107
- [{ script: "sub" }, { script: "super" }],
108
- [{ indent: "-1" }, { indent: "+1" }],
109
- [{ color: [] }, { background: [] }],
110
- ["clean"].concat(props.showAt ? ["at"] : [])
111
- ];
112
- const value = computed({
113
- get: () => props.modelValue || "",
114
- set: (v) => {
115
- let str = "";
116
- if (!v && editor && editor.root.innerHTML && editor.root.innerHTML.indexOf("<img") != -1) {
117
- str = editor.root.innerHTML;
118
- }
119
- emit("update:modelValue", v || str);
120
- }
121
- });
122
- const userIds = computed({
123
- get: () => props.userIds,
124
- set: (v) => {
125
- emit("update:userIds", v);
126
- }
127
- });
128
- const updateImage = async (file) => {
129
- if (!unref(fileService)) {
130
- return;
131
- }
132
- const uploadFileResult = await unref(fileService).uploadFile(file);
133
- if (uploadFileResult.code != 0) {
134
- return uploadFileResult;
135
- }
136
- const fileID = uploadFileResult.data.id;
137
- const filePathResult = await unref(fileService).getFilePath(fileID);
138
- if (filePathResult.code != 0) {
139
- return filePathResult;
140
- }
141
- return {
142
- ...filePathResult,
143
- data: { id: fileID, path: filePathResult.data }
144
- };
145
- };
146
- const quillEditorRefClick = () => {
147
- if (!editor) {
148
- return;
149
- }
150
- editor.focus();
151
- };
152
- onMounted(() => {
153
- editor = new Quill(unref(quillEditorRef), {
154
- theme: "snow",
155
- placeholder: props.placeholder,
156
- modules: {
157
- toolbar: {
158
- container: toolbarOptions,
159
- handlers: {
160
- at: function(value2) {
161
- }
162
- }
163
- }
164
- }
165
- });
166
- virtualRef.value = quillEditorContainer.value.querySelector("button.ql-at");
167
- editorInstance.value = markRaw(editor);
168
- const el = document.createElement("div");
169
- const getUserIds = (html) => {
170
- el.innerHTML = html;
171
- const items = Array.from(el.querySelectorAll("span.ptp-at-item"));
172
- userIds.value = [
173
- ...new Set(items.map((item) => item.getAttribute("d-id")))
174
- ];
175
- };
176
- getUserIds(unref(value));
177
- const handleTextChange = (delta, oldDelta, source) => {
178
- const _value = editor.getText() === "\n" ? "" : editor.root.innerHTML;
179
- value.value = _value;
180
- getUserIds(_value);
181
- };
182
- const handlePaste = (evt) => {
183
- if (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length) {
184
- evt.preventDefault();
185
- [].forEach.call(evt.clipboardData.files, async (file) => {
186
- console.log(file);
187
- if (file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
188
- const filePathResult = await updateImage(file);
189
- if (filePathResult.code != 0) {
190
- return;
191
- }
192
- const fileData = filePathResult.data;
193
- var range = editor.getSelection();
194
- if (range && fileData) {
195
- editor.insertEmbed(range.index, "image", fileData.path);
196
- editor.formatText(range.index, 1, {
197
- alt: fileData.id
198
- });
199
- setTimeout(() => {
200
- editor.setSelection(range.index + 1);
201
- }, 300);
202
- }
203
- }
204
- });
205
- }
206
- };
207
- currentScope.run(() => {
208
- watch(
209
- computed(() => props.disabled),
210
- (disabled) => {
211
- editor.enable(!disabled);
212
- },
213
- { immediate: true }
214
- );
215
- const getFilePaths = async (alt) => {
216
- const filePathResult = await unref(fileService).getFilePath(alt);
217
- return filePathResult;
218
- };
219
- let artArr2 = [];
220
- watch(
221
- value,
222
- async () => {
223
- if (unref(value).indexOf("data:image/png") != -1 || unref(value).indexOf("base64") != -1) {
224
- editor.root.innerHTML = unref(value);
225
- return;
226
- }
227
- if (!unref(value)) {
228
- artArr2 = [];
229
- }
230
- let afterHtml = "";
231
- let artArr = [];
232
- let artArrOption = [];
233
- if (unref(value).indexOf("<img") != -1) {
234
- unref(value).replace(/<img [^>]*alt=['"]([^'"]+)[^>]*>/gi, (img, alt) => {
235
- if (!artArr2.includes(alt)) {
236
- artArr.push(alt);
237
- }
238
- });
239
- for (const alt of artArr) {
240
- artArrOption.push({
241
- alt,
242
- src: await getFilePaths(alt)
243
- });
244
- }
245
- afterHtml = unref(value).replace(/<img [^>]*alt=['"]([^'"]+)[^>]*>/gi, (img, alt) => {
246
- var _a;
247
- if (artArr.includes(alt)) {
248
- return `<img src="${(_a = artArrOption.find((a) => a.alt === alt)) == null ? void 0 : _a.src.data}" alt="${alt}">`;
249
- } else {
250
- return img;
251
- }
252
- });
253
- }
254
- console.log("afterHtml =>", afterHtml);
255
- artArr2 = [...artArr2, ...artArr];
256
- artArr = [];
257
- artArrOption = [];
258
- if (editor.root.innerHTML === (afterHtml || unref(value))) {
259
- return;
260
- }
261
- const range = editor.getSelection();
262
- editor.root.innerHTML = afterHtml || unref(value);
263
- setTimeout(() => {
264
- if (range) {
265
- editor.setSelection(range.index + 1);
266
- editor.focus();
267
- }
268
- }, 100);
269
- },
270
- { immediate: true }
271
- );
272
- editor.on("text-change", handleTextChange);
273
- editor.root.addEventListener("paste", handlePaste);
274
- onScopeDispose(() => {
275
- editor.off("text-change", handleTextChange);
276
- editor.root.removeEventListener("paste", handlePaste);
277
- });
278
- });
279
- });
280
- expose({
281
- getEditorInstance() {
282
- return unref(editorInstance);
283
- }
284
- });
285
- return (_ctx, _cache) => {
286
- const _component_BwaAdvanceOption = resolveComponent("BwaAdvanceOption");
287
- const _component_BwaAdvanceSelect = resolveComponent("BwaAdvanceSelect");
288
- return openBlock(), createElementBlock("div", {
289
- class: normalizeClass(unref(ns).b()),
290
- ref_key: "quillEditorContainer",
291
- ref: quillEditorContainer
292
- }, [
293
- createElementVNode("div", {
294
- class: normalizeClass(unref(ns).e("editor")),
295
- ref_key: "quillEditorRef",
296
- ref: quillEditorRef,
297
- onClick: quillEditorRefClick
298
- }, null, 2),
299
- createVNode(_component_BwaAdvanceSelect, {
300
- showSelection: false,
301
- "virtual-triggering": true,
302
- "virtual-ref": virtualRef.value,
303
- loading: loading.value,
304
- onSearch: loadUserList,
305
- "onUpdate:modelValue": handleChange,
306
- onVisibleChange: handleVisibleChange
307
- }, {
308
- default: withCtx(() => [
309
- (openBlock(true), createElementBlock(Fragment, null, renderList(userList.value, (item) => {
310
- return openBlock(), createBlock(_component_BwaAdvanceOption, {
311
- key: item.value,
312
- value: item.value,
313
- label: item.label
314
- }, null, 8, ["value", "label"]);
315
- }), 128))
316
- ]),
317
- _: 1
318
- }, 8, ["virtual-ref", "loading"])
319
- ], 2);
320
- };
321
- }
322
- });
323
- var RichText = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "bwa-rich-text.vue"]]);
33
+
34
+ const props = __props;
35
+
36
+ let editor = null;
37
+
38
+ const userService = useService('UserService');
39
+
40
+ const loading = ref(false);
41
+ const userList = ref([
42
+ { value: '1', label: '用户1' },
43
+ { value: '2', label: '用户2' },
44
+ { value: '3', label: '用户3' },
45
+ ]);
46
+
47
+ const handleChange = ([userId]) => {
48
+ if (!editor || !userId) {
49
+ return;
50
+ }
51
+
52
+ const userInfo = unref(userList).find((item) => item.value === userId);
53
+
54
+ if (!userInfo) {
55
+ return;
56
+ }
57
+
58
+ editor.focus();
59
+
60
+ //获取当前光标位置
61
+ let length = editor.getSelection()
62
+ ? editor.getSelection().index || 0
63
+ : editor.getLength();
64
+
65
+ // 设置@
66
+ editor.insertEmbed(
67
+ length,
68
+ 'at',
69
+ { id: userInfo.value, desc: userInfo.label },
70
+ 'user'
71
+ );
72
+
73
+ editor.insertText(length + 1, ' ');
74
+
75
+ //设置光标
76
+ editor.setSelection(length + 2);
77
+ };
78
+
79
+ const loadUserList = async (search = '') => {
80
+ try {
81
+ if (unref(loading)) {
82
+ return;
83
+ }
84
+
85
+ loading.value = true;
86
+ if (!unref(userService)) {
87
+ ElMessage.error('无法获取用户');
88
+ return;
89
+ }
90
+
91
+ const userListResult = await unref(userService).getUserList({
92
+ name: search,
93
+ });
94
+
95
+ if (userListResult.code != 0) {
96
+ ElMessage.error(userListResult.msg);
97
+ return;
98
+ }
99
+
100
+ userList.value = userListResult.data;
101
+ } finally {
102
+ loading.value = false;
103
+ }
104
+ };
105
+
106
+ const handleVisibleChange = (visible) => {
107
+ if (!visible) {
108
+ return;
109
+ }
110
+
111
+ loadUserList();
112
+ };
113
+
114
+
115
+
116
+ const virtualRef = ref(null);
117
+
118
+
119
+
120
+ defineOptions({
121
+ name: 'BwaRichText',
122
+ });
123
+
124
+ const ns = useNamespace('rich-text');
125
+
126
+ const fileService = useService('FileService');
127
+
128
+ const quillEditorContainer = ref(null);
129
+ const quillEditorRef = ref(null);
130
+
131
+ const currentScope = getCurrentScope();
132
+
133
+ const editorInstance = ref(null);
134
+
135
+ const toolbarOptions = [
136
+ [{ header: [1, 2, 3, 4, 5, 6, false] }],
137
+ [{ font: [] }],
138
+ ['bold', 'italic', 'underline', 'strike'],
139
+ [{ align: [] }],
140
+ ['blockquote', 'code-block'],
141
+ [{ header: 1 }, { header: 2 }],
142
+ [{ list: 'ordered' }, { list: 'bullet' }],
143
+ [{ script: 'sub' }, { script: 'super' }],
144
+ [{ indent: '-1' }, { indent: '+1' }],
145
+ [{ color: [] }, { background: [] }],
146
+ ['clean'].concat(props.showAt ? ['at'] : []),
147
+ ];
148
+
149
+ const value = computed({
150
+ get: () => props.modelValue || '',
151
+ set: (v) => {
152
+ // 解决当只有一张图片的时候 回显html报文异常
153
+ let str = '';
154
+ if (!v && editor && editor.root.innerHTML && editor.root.innerHTML.indexOf('<img') != -1) {
155
+ str = editor.root.innerHTML;
156
+ }
157
+ emit('update:modelValue', v || str);
158
+ },
159
+ });
160
+
161
+ const userIds = computed({
162
+ get: () => props.userIds,
163
+ set: (v) => {
164
+ emit('update:userIds', v);
165
+ },
166
+ });
167
+
168
+ const updateImage = async (file) => {
169
+ if (!unref(fileService)) {
170
+ return;
171
+ }
172
+
173
+ const uploadFileResult = await unref(fileService).uploadFile(file);
174
+
175
+ if (uploadFileResult.code != 0) {
176
+ return uploadFileResult;
177
+ }
178
+
179
+ const fileID = uploadFileResult.data.id;
180
+
181
+ const filePathResult = await unref(fileService).getFilePath(fileID);
182
+
183
+ if (filePathResult.code != 0) {
184
+ return filePathResult;
185
+ }
186
+
187
+ return {
188
+ ...filePathResult,
189
+ data: { id: fileID, path: filePathResult.data },
190
+ };
191
+ };
192
+ const quillEditorRefClick = () => {
193
+ if (!editor) {
194
+ return;
195
+ }
196
+ editor.focus();
197
+ };
198
+ onMounted(() => {
199
+ editor = new Quill(unref(quillEditorRef), {
200
+ theme: 'snow',
201
+ placeholder: props.placeholder,
202
+ modules: {
203
+ toolbar: {
204
+ container: toolbarOptions,
205
+ handlers: {
206
+ at: function (value) {},
207
+ },
208
+ },
209
+ },
210
+ });
211
+
212
+ virtualRef.value = quillEditorContainer.value.querySelector('button.ql-at');
213
+
214
+ editorInstance.value = markRaw(editor);
215
+
216
+ const el = document.createElement('div');
217
+
218
+ const getUserIds = (html) => {
219
+ el.innerHTML = html;
220
+
221
+ const items = Array.from(el.querySelectorAll('span.ptp-at-item'));
222
+
223
+ userIds.value = [
224
+ ...new Set(items.map((item) => item.getAttribute('d-id'))),
225
+ ];
226
+ };
227
+
228
+ getUserIds(unref(value));
229
+
230
+ const handleTextChange = (delta, oldDelta, source) => {
231
+ const _value = editor.getText() === '\n' ? '' : editor.root.innerHTML;
232
+
233
+ value.value = _value;
234
+
235
+ getUserIds(_value);
236
+ // if (source === 'user') {
237
+ // var range = editor.getLength();
238
+ // console.log(range)
239
+ // // if (range != null) {
240
+ // // setTimeout(() => {
241
+ // // editor.setSelection(range.index, range.length); // 重新设置选区
242
+ // // }, 300)
243
+ // // }
244
+ // }
245
+ };
246
+
247
+ const handlePaste = (evt) => {
248
+ if (
249
+ evt.clipboardData &&
250
+ evt.clipboardData.files &&
251
+ evt.clipboardData.files.length
252
+ ) {
253
+ evt.preventDefault();
254
+ [].forEach.call(evt.clipboardData.files, async (file) => {
255
+ console.log(file);
256
+ if (file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
257
+ const filePathResult = await updateImage(file);
258
+
259
+ if (filePathResult.code != 0) {
260
+ return;
261
+ }
262
+
263
+ const fileData = filePathResult.data;
264
+ // const fileData = { id: 1, path: 'https://img1.baidu.com/it/u=2335299816,3552592887&fm=253&fmt=auto&app=138&f=JPEG?w=126&h=189' }
265
+ var range = editor.getSelection();
266
+ if (range && fileData) {
267
+ // 在当前光标位置插入图片
268
+ editor.insertEmbed(range.index, 'image', fileData.path);
269
+ editor.formatText(range.index, 1, {
270
+ alt: fileData.id,
271
+ });
272
+ // 将光标移动到图片后面
273
+ setTimeout(() => {
274
+ editor.setSelection(range.index + 1);
275
+ // console.log(editor.getSelection(), editor.getLength())
276
+ // editor.setSelection(editor.getSelection().index, editor.getSelection().length);
277
+ }, 300);
278
+ }
279
+ }
280
+ });
281
+ }
282
+ };
283
+
284
+ currentScope.run(() => {
285
+ watch(
286
+ computed(() => props.disabled),
287
+ (disabled) => {
288
+ editor.enable(!disabled);
289
+ },
290
+ { immediate: true }
291
+ );
292
+ const getFilePaths = async (alt) => {
293
+ const filePathResult = await unref(fileService).getFilePath(alt);
294
+ return filePathResult
295
+ };
296
+ let artArr2 = []; // 防止重复加载图片
297
+ watch(
298
+ value,
299
+ async () => {
300
+ if ((unref(value).indexOf('data:image/png') != -1 || unref(value).indexOf('base64') != -1)) {
301
+ editor.root.innerHTML = unref(value);
302
+ return
303
+ }
304
+ // console.log(unref(value))
305
+ if (!unref(value)) {
306
+ artArr2 = [];
307
+ }
308
+ let afterHtml = '';
309
+ let artArr = [];
310
+ let artArrOption = [];
311
+ if (unref(value).indexOf('<img') != -1) {
312
+ unref(value).replace(/<img [^>]*alt=['"]([^'"]+)[^>]*>/gi, (img, alt) => {
313
+ if (!artArr2.includes(alt)) {
314
+ artArr.push(alt);
315
+ }
316
+ });
317
+ for (const alt of artArr) {
318
+ artArrOption.push({
319
+ alt,
320
+ src: await getFilePaths(alt)
321
+ // src: 'https://img1.baidu.com/it/u=2335299816,3552592887&fm=253&fmt=auto&app=138&f=JPEG?w=126&h=189'
322
+ });
323
+ }
324
+ // console.log(artArrOption)
325
+ afterHtml = unref(value).replace(/<img [^>]*alt=['"]([^'"]+)[^>]*>/gi, (img, alt) => {
326
+ if (artArr.includes(alt)) {
327
+ return `<img src="${artArrOption.find(a => a.alt === alt)?.src.data}" alt="${alt}">`
328
+ } else {
329
+ return img
330
+ }
331
+
332
+ });
333
+ }
334
+ console.log('afterHtml =>', afterHtml);
335
+ artArr2 = [...artArr2, ...artArr];
336
+ artArr = [];
337
+ artArrOption = [];
338
+ if (editor.root.innerHTML === (afterHtml || unref(value))) {
339
+ return;
340
+ }
341
+ const range = editor.getSelection();
342
+ editor.root.innerHTML = afterHtml || unref(value);
343
+ setTimeout(() => {
344
+ if (range) {
345
+ editor.setSelection(range.index + 1);
346
+ editor.focus();
347
+ }
348
+ }, 100);
349
+ },
350
+ { immediate: true }
351
+ );
352
+
353
+ editor.on('text-change', handleTextChange);
354
+
355
+ editor.root.addEventListener('paste', handlePaste);
356
+
357
+ onScopeDispose(() => {
358
+ editor.off('text-change', handleTextChange);
359
+
360
+ editor.root.removeEventListener('paste', handlePaste);
361
+ });
362
+ });
363
+ });
364
+
365
+ expose({
366
+ getEditorInstance() {
367
+ return unref(editorInstance);
368
+ },
369
+ });
370
+
371
+ return (_ctx, _cache) => {
372
+ const _component_BwaAdvanceOption = resolveComponent("BwaAdvanceOption");
373
+ const _component_BwaAdvanceSelect = resolveComponent("BwaAdvanceSelect");
374
+
375
+ return (openBlock(), createElementBlock("div", {
376
+ class: normalizeClass(unref(ns).b()),
377
+ ref_key: "quillEditorContainer",
378
+ ref: quillEditorContainer
379
+ }, [
380
+ createElementVNode("div", {
381
+ class: normalizeClass(unref(ns).e('editor')),
382
+ ref_key: "quillEditorRef",
383
+ ref: quillEditorRef,
384
+ onClick: quillEditorRefClick
385
+ }, null, 2 /* CLASS */),
386
+ createVNode(_component_BwaAdvanceSelect, {
387
+ showSelection: false,
388
+ "virtual-triggering": true,
389
+ "virtual-ref": virtualRef.value,
390
+ loading: loading.value,
391
+ onSearch: loadUserList,
392
+ "onUpdate:modelValue": handleChange,
393
+ onVisibleChange: handleVisibleChange
394
+ }, {
395
+ default: withCtx(() => [
396
+ (openBlock(true), createElementBlock(Fragment, null, renderList(userList.value, (item) => {
397
+ return (openBlock(), createBlock(_component_BwaAdvanceOption, {
398
+ key: item.value,
399
+ value: item.value,
400
+ label: item.label
401
+ }, null, 8 /* PROPS */, ["value", "label"]))
402
+ }), 128 /* KEYED_FRAGMENT */))
403
+ ]),
404
+ _: 1 /* STABLE */
405
+ }, 8 /* PROPS */, ["virtual-ref", "loading"])
406
+ ], 2 /* CLASS */))
407
+ }
408
+ }
409
+
410
+ };
411
+ var RichText = /*#__PURE__*/_export_sfc(_sfc_main, [['__file',"bwa-rich-text.vue"]]);
324
412
 
325
413
  export { RichText as default };