hookehuyr

fix 编辑器改造

1 +<!--
2 + * @Date: 2023-02-13 14:56:34
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2024-07-12 16:49:21
5 + * @FilePath: /data-table/index.html
6 + * @Description: 文件描述
7 +-->
1 <!DOCTYPE html> 8 <!DOCTYPE html>
2 <html lang='zh'> 9 <html lang='zh'>
3 <head> 10 <head>
...@@ -10,6 +17,7 @@ ...@@ -10,6 +17,7 @@
10 </head> 17 </head>
11 <body> 18 <body>
12 <div id="app"></div> 19 <div id="app"></div>
20 + <script src="https://cdn.ipadbiz.cn/custom_form/tinymce/tinymce.min.js"></script>
13 <script type="module" src="/src/main.js"></script> 21 <script type="module" src="/src/main.js"></script>
14 </body> 22 </body>
15 </html> 23 </html>
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
36 }, 36 },
37 "dependencies": { 37 "dependencies": {
38 "@dedisuryadi/json-form-data": "^0.1.1", 38 "@dedisuryadi/json-form-data": "^0.1.1",
39 - "@tinymce/tinymce-vue": "^5", 39 + "@tinymce/tinymce-vue": "4.0.7",
40 "@vant/area-data": "^1.3.1", 40 "@vant/area-data": "^1.3.1",
41 "@vant/touch-emulator": "^1.4.0", 41 "@vant/touch-emulator": "^1.4.0",
42 "@vitejs/plugin-legacy": "^1.8.2", 42 "@vitejs/plugin-legacy": "^1.8.2",
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
56 "moment": "^2.29.3", 56 "moment": "^2.29.3",
57 "mui-player": "^1.7.0", 57 "mui-player": "^1.7.0",
58 "sha1": "^1.1.1", 58 "sha1": "^1.1.1",
59 - "tinymce": "^7.2.1", 59 + "tinymce": "5.10.9",
60 "typescript": "^4.7.3", 60 "typescript": "^4.7.3",
61 "uuid": "^8.3.2", 61 "uuid": "^8.3.2",
62 "vant": "^4.9.1", 62 "vant": "^4.9.1",
......
1 <!-- 1 <!--
2 * @Date: 2024-07-12 13:28:27 2 * @Date: 2024-07-12 13:28:27
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-07-12 14:20:07 4 + * @LastEditTime: 2024-07-12 17:22:36
5 * @FilePath: /data-table/src/components/TEditor/index.vue 5 * @FilePath: /data-table/src/components/TEditor/index.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
8 <template> 8 <template>
9 - <div style="height: 100%; overflow: hidden"> 9 + <div style="height: 100%; overflow: hidden;">
10 <editor 10 <editor
11 api-key="no-api-key" 11 api-key="no-api-key"
12 v-model="myValue" 12 v-model="myValue"
13 - :init="init" 13 + :init="tinymceOptions"
14 - :enabled="enabled"
15 :id="tinymceId" 14 :id="tinymceId"
16 ></editor> 15 ></editor>
17 </div> 16 </div>
...@@ -20,38 +19,38 @@ ...@@ -20,38 +19,38 @@
20 <script setup> 19 <script setup>
21 import {computed, reactive, watch, ref, nextTick, onMounted} from "vue"; //全屏 20 import {computed, reactive, watch, ref, nextTick, onMounted} from "vue"; //全屏
22 21
23 -import tinymce from "tinymce/tinymce"; 22 +// import tinymce from "tinymce/tinymce";
24 // import "tinymce/skins/content/default/content.css"; 23 // import "tinymce/skins/content/default/content.css";
25 import Editor from "@tinymce/tinymce-vue"; 24 import Editor from "@tinymce/tinymce-vue";
26 -import "tinymce/icons/default/icons"; 25 +// import "tinymce/icons/default/icons";
27 -import "tinymce/models/dom"; // 一定要引入 26 +// import "tinymce/models/dom"; // 一定要引入
28 -import "tinymce/themes/silver"; // 界面UI主题 27 +// import "tinymce/themes/silver"; // 界面UI主题
29 -import "tinymce/plugins/image"; 28 +// import "tinymce/plugins/image";
30 -import "tinymce/plugins/table"; 29 +// import "tinymce/plugins/table";
31 -import "tinymce/plugins/lists"; // 列表插件 30 +// import "tinymce/plugins/lists"; // 列表插件
32 -import "tinymce/plugins/wordcount"; // 文字计数 31 +// import "tinymce/plugins/wordcount"; // 文字计数
33 -import "tinymce/plugins/preview"; // 预览 32 +// import "tinymce/plugins/preview"; // 预览
34 -import "tinymce/plugins/emoticons"; // emoji表情 33 +// import "tinymce/plugins/emoticons"; // emoji表情
35 -import "tinymce/plugins/emoticons/js/emojis.js"; //必须引入这个文件才有表情图库 34 +// import "tinymce/plugins/emoticons/js/emojis.js"; //必须引入这个文件才有表情图库
36 -import "tinymce/plugins/code"; // 编辑源码 35 +// import "tinymce/plugins/code"; // 编辑源码
37 -import "tinymce/plugins/link"; // 链接插件 36 +// import "tinymce/plugins/link"; // 链接插件
38 -import "tinymce/plugins/advlist"; //高级列表 37 +// import "tinymce/plugins/advlist"; //高级列表
39 -import "tinymce/plugins/codesample"; //代码示例 38 +// import "tinymce/plugins/codesample"; //代码示例
40 -import "tinymce/plugins/autoresize"; // 自动调整编辑器大小 39 +// import "tinymce/plugins/autoresize"; // 自动调整编辑器大小
41 -import "tinymce/plugins/quickbars"; // 光标处快捷提示 40 +// import "tinymce/plugins/quickbars"; // 光标处快捷提示
42 -import "tinymce/plugins/nonbreaking"; //插入不间断空格 41 +// import "tinymce/plugins/nonbreaking"; //插入不间断空格
43 -import "tinymce/plugins/searchreplace"; //查找替换 42 +// import "tinymce/plugins/searchreplace"; //查找替换
44 -import "tinymce/plugins/autolink"; //自动链接 43 +// import "tinymce/plugins/autolink"; //自动链接
45 -import "tinymce/plugins/directionality"; //文字方向 44 +// import "tinymce/plugins/directionality"; //文字方向
46 -import "tinymce/plugins/visualblocks"; //显示元素范围 45 +// import "tinymce/plugins/visualblocks"; //显示元素范围
47 -import "tinymce/plugins/visualchars"; //显示不可见字符 46 +// import "tinymce/plugins/visualchars"; //显示不可见字符
48 -import "tinymce/plugins/charmap"; // 特殊符号 47 +// import "tinymce/plugins/charmap"; // 特殊符号
49 -import "tinymce/plugins/nonbreaking"; //插入不间断空格 48 +// import "tinymce/plugins/nonbreaking"; //插入不间断空格
50 -import "tinymce/plugins/insertdatetime"; //插入日期时间 49 +// import "tinymce/plugins/insertdatetime"; //插入日期时间
51 -import "tinymce/plugins/importcss"; //引入自定义样式的css文件 50 +// import "tinymce/plugins/importcss"; //引入自定义样式的css文件
52 -import "tinymce/plugins/accordion"; // 可折叠数据手风琴模式 51 +// import "tinymce/plugins/accordion"; // 可折叠数据手风琴模式
53 -import "tinymce/plugins/anchor"; //锚点 52 +// import "tinymce/plugins/anchor"; //锚点
54 -import "tinymce/plugins/fullscreen"; 53 +// import "tinymce/plugins/fullscreen";
55 54
56 55
57 const emits = defineEmits(["update:modelValue", "setHtml"]); 56 const emits = defineEmits(["update:modelValue", "setHtml"]);
...@@ -104,13 +103,13 @@ const tinymceId = ref( ...@@ -104,13 +103,13 @@ const tinymceId = ref(
104 103
105 104
106 //定义一个对象 init初始化 105 //定义一个对象 init初始化
107 -const init = reactive({ 106 +const init = {
108 selector: "#" + tinymceId.value, //富文本编辑器的id, 107 selector: "#" + tinymceId.value, //富文本编辑器的id,
109 // language_url: "/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目 108 // language_url: "/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目
110 - language_url: "https://cdn.ipadbiz.cn/custom_form/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目 109 + // language_url: "https://cdn.ipadbiz.cn/custom_form/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目
111 language: "zh_CN", 110 language: "zh_CN",
112 - // skin_url: "/tinymce/skins/ui/oxide", // skin路径,具体路径看自己的项目 111 + skin_url: "/tinymce/skins/ui/oxide", // skin路径,具体路径看自己的项目
113 - skin_url: "https://cdn.ipadbiz.cn/custom_form/tinymce/skins/ui/oxide", // skin路径,具体路径看自己的项目 112 + // skin_url: "https://cdn.ipadbiz.cn/custom_form/tinymce/skins/ui/oxide", // skin路径,具体路径看自己的项目
114 editable_root: props.editable_root, 113 editable_root: props.editable_root,
115 height: 600, 114 height: 600,
116 branding: false, // 是否禁用“Powered by TinyMCE” 115 branding: false, // 是否禁用“Powered by TinyMCE”
...@@ -164,35 +163,75 @@ const init = reactive({ ...@@ -164,35 +163,75 @@ const init = reactive({
164 // setup: function (editor) { 163 // setup: function (editor) {
165 // }, 164 // },
166 //图片上传 -实列 具体请根据官网补充- 165 //图片上传 -实列 具体请根据官网补充-
167 - images_upload_handler: function (blobInfo, progress) { 166 + // images_upload_handler: function (blobInfo, progress) {
168 - new Promise((resolve, reject) => { 167 + // new Promise((resolve, reject) => {
169 - let file = blobInfo.blob(); 168 + // let file = blobInfo.blob();
170 - if (file.size / 1024 / 1024 > 200) { 169 + // if (file.size / 1024 / 1024 > 200) {
171 - reject({ 170 + // reject({
172 - message: "上传失败,图片大小请控制在 200M 以内", 171 + // message: "上传失败,图片大小请控制在 200M 以内",
173 - remove: true, 172 + // remove: true,
174 - }); 173 + // });
175 - } 174 + // }
176 - const formData = new FormData(); 175 + // const formData = new FormData();
177 - formData.append("file", file); 176 + // formData.append("file", file);
178 - console.log( formData) 177 + // console.log( formData)
179 - axios.post("/api/upload/upload", formData, { 178 + // axios.post("/api/upload/upload", formData, {
180 - headers: { 179 + // headers: {
181 - "Content-Type": "multipart/form-data", 180 + // "Content-Type": "multipart/form-data",
182 - }, 181 + // },
183 - onUploadProgress: (progressEvent) => { 182 + // onUploadProgress: (progressEvent) => {
184 - progress( 183 + // progress(
185 - Math.round((progressEvent.loaded / progressEvent.total) * 100) 184 + // Math.round((progressEvent.loaded / progressEvent.total) * 100)
186 - ); 185 + // );
187 - }, 186 + // },
188 - }).then((res) => { 187 + // }).then((res) => {
189 - resolve(res.data.url); 188 + // resolve(res.data.url);
190 - }) 189 + // })
191 - .catch() 190 + // .catch()
192 191
193 - }); 192 + // });
194 - }, 193 + // },
195 -}); 194 +};
195 +
196 +/*const tinymceOptions = {
197 + // selector: selector,
198 + language: 'zh_CN',
199 + // 插件列表:https://www.tiny.cloud/docs/plugins/opensource/
200 + // image 插件的使用示例:https://www.tiny.cloud/docs/demo/file-picker/
201 + // plugins: 'searchreplace autoresize link image code',
202 + plugins: 'searchreplace autoresize link image code table',
203 + autoresize_bottom_margin: 100,
204 + image_title: true,
205 + menubar: 'edit view insert format tools',
206 + // fontselect fontsizeselect
207 + toolbar: 'bold italic table',
208 + width: '100vw',
209 + paste_data_images: false, //允许粘贴图像
210 + min_height: 300,
211 + // file_picker_callback: function (cb, value, meta) {
212 + // var input = document.createElement('input');
213 + // input.setAttribute('type', 'file');
214 + // if (meta.filetype == 'image') { // 图片上传控件的点击事件
215 + // input.setAttribute('accept', 'image/~');
216 + // }
217 + // input.onchange = function () {
218 + // upload({
219 + // input,
220 + // onAdd: function (images) {
221 + // cb(images[0].src, { title: images[0].name });
222 + // },
223 + // });
224 + // };
225 + // input.click();
226 + // },
227 + // init_instance_callback: function (editor) {
228 + // editor.on('click', function (e) {
229 + // // tinymce 使用 <iframe> 实现功能,当点击 tinymce 的输入框时应该让表单设计器选中对应的字段,
230 + // // 所以需要把点击事件转发给 iframe 外面的 textarea
231 + // document.getElementById(editor.id).click();
232 + // });
233 + // },
234 +}*/
196 235
197 // 外部传递进来的数据变化 236 // 外部传递进来的数据变化
198 const myValue = computed({ 237 const myValue = computed({
...@@ -234,7 +273,7 @@ watch( ...@@ -234,7 +273,7 @@ watch(
234 273
235 //初始化编辑器 274 //初始化编辑器
236 onMounted(() => { 275 onMounted(() => {
237 - tinymce.init({}); 276 + // tinymce.init({});
238 }); 277 });
239 278
240 // 设置值 279 // 设置值
......
1 <template> 1 <template>
2 <div class="tinymce-box"> 2 <div class="tinymce-box">
3 - <TEditor ref="refEdit" ></TEditor> 3 + <TEditor ref="refEdit" readonly ></TEditor>
4 <div @click="getValue">获取内容</div> 4 <div @click="getValue">获取内容</div>
5 + <div @click="setValue">设置内容</div>
5 </div> 6 </div>
6 </template> 7 </template>
7 8
...@@ -14,10 +15,14 @@ ...@@ -14,10 +15,14 @@
14 const getValue = () => { 15 const getValue = () => {
15 console.warn(refEdit.value.handleGetContent()); 16 console.warn(refEdit.value.handleGetContent());
16 } 17 }
18 +
19 + const setValue = () => {
20 + refEdit.value.handleSetContent('<p>test</p>')
21 + }
17 </script> 22 </script>
18 23
19 <style> 24 <style>
20 .tinymce-box { 25 .tinymce-box {
21 - width: 200px; 26 + width: 100%;
22 } 27 }
23 </style> 28 </style>
......
...@@ -375,12 +375,12 @@ ...@@ -375,12 +375,12 @@
375 estree-walker "^2.0.2" 375 estree-walker "^2.0.2"
376 picomatch "^2.3.1" 376 picomatch "^2.3.1"
377 377
378 -"@tinymce/tinymce-vue@^5": 378 +"@tinymce/tinymce-vue@4.0.7":
379 - version "5.1.1" 379 + version "4.0.7"
380 - resolved "https://mirrors.cloud.tencent.com/npm/@tinymce/tinymce-vue/-/tinymce-vue-5.1.1.tgz#0879787e07833a4316b2eaf0417c7c6a2abce86b" 380 + resolved "https://mirrors.cloud.tencent.com/npm/@tinymce/tinymce-vue/-/tinymce-vue-4.0.7.tgz#811dd87a2a9f70e60c43c2d9d932771c0c8b4677"
381 - integrity sha512-iO57HOWesFOhsaqjA5Ea6sDvQBmJJH3/dq00Uvg7metlct2kLF+ctRgoDsetLt6gmeZ7COPftr814/XzqnJ/dg== 381 + integrity sha512-1esB8wGWrjPCY+rK8vy3QB1cxwXo7HLJWuNrcyPl6LOVR+QJjub0OiV/C+TUEsLN6OpCtRv+QnIqMC5vXz783Q==
382 dependencies: 382 dependencies:
383 - tinymce "^6.0.0 || ^5.5.1" 383 + tinymce "^5.5.0"
384 384
385 "@types/estree@^1.0.0": 385 "@types/estree@^1.0.0":
386 version "1.0.0" 386 version "1.0.0"
...@@ -3370,15 +3370,10 @@ through@^2.3.8: ...@@ -3370,15 +3370,10 @@ through@^2.3.8:
3370 resolved "https://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz" 3370 resolved "https://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz"
3371 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 3371 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
3372 3372
3373 -"tinymce@^6.0.0 || ^5.5.1": 3373 +tinymce@5.10.9, tinymce@^5.5.0:
3374 - version "6.8.4" 3374 + version "5.10.9"
3375 - resolved "https://mirrors.cloud.tencent.com/npm/tinymce/-/tinymce-6.8.4.tgz#53e1313ebfe5524b24c0fa45937d51fda058632d" 3375 + resolved "https://mirrors.cloud.tencent.com/npm/tinymce/-/tinymce-5.10.9.tgz#1dfacb3231c71a688d90ff44a0b3f2e91b3b9edf"
3376 - integrity sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg== 3376 + integrity sha512-5bkrors87X9LhYX2xq8GgPHrIgJYHl87YNs+kBcjQ5I3CiUgzo/vFcGvT3MZQ9QHsEeYMhYO6a5CLGGffR8hMg==
3377 -
3378 -tinymce@^7.2.1:
3379 - version "7.2.1"
3380 - resolved "https://mirrors.cloud.tencent.com/npm/tinymce/-/tinymce-7.2.1.tgz#9b4f6b5a0fa647e2953c174ac69aa47483683332"
3381 - integrity sha512-ADd1cvdIuq6NWyii0ZOZRuu+9sHIdQfcRNWBcBps2K8vy7OjlRkX6iw7zz1WlL9kY4z4L1DvIP+xOrVX/46aHA==
3382 3377
3383 tmp@~0.2.1: 3378 tmp@~0.2.1:
3384 version "0.2.1" 3379 version "0.2.1"
......