yks-element 1.0.322 → 1.0.792

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 (88) hide show
  1. package/README.md +74 -8
  2. package/lib/theme-chalk/buttons.css +1 -0
  3. package/lib/theme-chalk/common.css +1 -0
  4. package/lib/theme-chalk/dialogs.css +1 -0
  5. package/{packages/Topic/src/indefiniteChoice.vue → lib/theme-chalk/element-variables.css} +0 -0
  6. package/lib/theme-chalk/elements.css +1 -0
  7. package/lib/theme-chalk/enlarge.css +1 -0
  8. package/{packages/styles → lib/theme-chalk}/fonts/element-icons.ttf +0 -0
  9. package/{packages/styles → lib/theme-chalk}/fonts/element-icons.woff +0 -0
  10. package/{packages/styles → lib/theme-chalk}/fonts/iconfont.ttf +0 -0
  11. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  12. package/lib/theme-chalk/icons.css +1 -0
  13. package/lib/theme-chalk/index.css +1 -0
  14. package/lib/theme-chalk/multimedia.css +1 -0
  15. package/lib/theme-chalk/paginations.css +1 -0
  16. package/lib/theme-chalk/scrollbars.css +1 -0
  17. package/lib/theme-chalk/selects.css +1 -0
  18. package/lib/theme-chalk/tables.css +1 -0
  19. package/lib/theme-chalk/tinymce.css +1 -0
  20. package/lib/theme-chalk/uploadfile.css +1 -0
  21. package/lib/theme-chalk/video.css +1 -0
  22. package/{packages/Topic/src/matching.vue → lib/theme-chalk/videoPlayer.css} +0 -0
  23. package/lib/yks.js +1 -0
  24. package/package.json +42 -12
  25. package/lib/fonts/element-icons.535877f5.woff +0 -0
  26. package/lib/fonts/element-icons.732389de.ttf +0 -0
  27. package/lib/fonts/iconfont.19124b0d.ttf +0 -0
  28. package/lib/fonts/iconfont.3ae3dd4e.woff +0 -0
  29. package/lib/yks.css +0 -1
  30. package/packages/Button/index.js +0 -8
  31. package/packages/Button/src/index.vue +0 -78
  32. package/packages/Dialog/index.js +0 -8
  33. package/packages/Dialog/src/index.vue +0 -103
  34. package/packages/Multimedia/index.js +0 -8
  35. package/packages/Multimedia/src/index.vue +0 -179
  36. package/packages/Pagination/index.js +0 -8
  37. package/packages/Pagination/src/index.vue +0 -149
  38. package/packages/Scrollbar/index.js +0 -8
  39. package/packages/Scrollbar/src/index.vue +0 -27
  40. package/packages/Select/index.js +0 -8
  41. package/packages/Select/src/index.vue +0 -350
  42. package/packages/Select/src/option.vue +0 -29
  43. package/packages/Table/index.js +0 -8
  44. package/packages/Table/src/index.vue +0 -141
  45. package/packages/Tinymce/index.js +0 -8
  46. package/packages/Tinymce/src/config.js +0 -25
  47. package/packages/Tinymce/src/index.vue +0 -500
  48. package/packages/Topic/index.js +0 -23
  49. package/packages/Topic/src/attachment.vue +0 -125
  50. package/packages/Topic/src/audioFrequency.vue +0 -127
  51. package/packages/Topic/src/clozeFillInBlanks.vue +0 -267
  52. package/packages/Topic/src/compound.vue +0 -221
  53. package/packages/Topic/src/config.js +0 -132
  54. package/packages/Topic/src/fillInBlanks.vue +0 -272
  55. package/packages/Topic/src/judgment.vue +0 -140
  56. package/packages/Topic/src/multiple.vue +0 -193
  57. package/packages/Topic/src/pictureAnswer.vue +0 -127
  58. package/packages/Topic/src/shortAnswer.vue +0 -136
  59. package/packages/Topic/src/single.vue +0 -194
  60. package/packages/UploadFile/index.js +0 -8
  61. package/packages/UploadFile/src/index.vue +0 -390
  62. package/packages/Video/index.js +0 -8
  63. package/packages/Video/src/index.vue +0 -351
  64. package/packages/assets/mixins/topic.js +0 -137
  65. package/packages/assets/utils/index.js +0 -83
  66. package/packages/assets/utils/topic.js +0 -132
  67. package/packages/icon/default/icons.js +0 -182
  68. package/packages/icon/default/icons.min.js +0 -1
  69. package/packages/icon/default/index.js +0 -7
  70. package/packages/icon/ks-pdf.png +0 -0
  71. package/packages/icon/ks-ppt.png +0 -0
  72. package/packages/icon/ks-word.png +0 -0
  73. package/packages/icon/ks-xslx.png +0 -0
  74. package/packages/icon/music-bg.png +0 -0
  75. package/packages/icon/video-bg.png +0 -0
  76. package/packages/index.js +0 -223
  77. package/packages/option/index.js +0 -6
  78. package/packages/styles/_mixin.scss +0 -93
  79. package/packages/styles/_variables.scss +0 -40
  80. package/packages/styles/common.scss +0 -200
  81. package/packages/styles/element-ui.scss +0 -135
  82. package/packages/styles/element-variables.scss +0 -794
  83. package/packages/styles/fonts/iconfont.woff +0 -0
  84. package/packages/styles/icon.scss +0 -69
  85. package/packages/styles/index.scss +0 -11
  86. package/packages/styles/select.scss +0 -98
  87. package/packages/styles/table.scss +0 -45
  88. package/packages/styles/topic.scss +0 -26
@@ -1,500 +0,0 @@
1
- <template>
2
- <div
3
- :class="{ fullscreen: fullscreen }"
4
- class="tinymce-container"
5
- :style="{ width: containerWidth }"
6
- >
7
- <TinymceEditor
8
- :id="tinymceId"
9
- ref="tinymceEditor"
10
- :key="tinymceId"
11
- v-model="tinymceContent"
12
- :init="initOptions"
13
- :class="{ 'tinymce-inline': inline }"
14
- />
15
- <div v-if="fileParams.length !== 0" class="ti-multimedia">
16
- <div
17
- v-for="(values, index) in fileParams"
18
- :key="`fileParams${index}${Math.random()}`"
19
- class="media-file"
20
- >
21
- <yks-multimedia
22
- :data="values"
23
- visibleDel
24
- @delete="handleCloseFile(values, index)"
25
- ></yks-multimedia>
26
- </div>
27
- </div>
28
- <yks-uploadfile
29
- :show.sync="show"
30
- :fileData="fileData"
31
- :title="title"
32
- :uploadFileFunction="uploadFileFunction"
33
- @sure="onSure"
34
- ></yks-uploadfile>
35
- </div>
36
- </template>
37
-
38
- <script>
39
- // Docs: https://armour.github.io/vue-typescript-admin-docs/features/components/rich-editor.html#tinymce
40
- import 'tinymce/tinymce'
41
- import 'tinymce/themes/silver' // Import themes
42
- import 'tinymce/themes/mobile'
43
- import 'tinymce/plugins/advlist' // Any plugins you want to use has to be imported
44
- import 'tinymce/plugins/anchor'
45
- import 'tinymce/plugins/autolink'
46
- import 'tinymce/plugins/autosave'
47
- import 'tinymce/plugins/charmap'
48
- import 'tinymce/plugins/code'
49
- import 'tinymce/plugins/codesample'
50
- import 'tinymce/plugins/directionality'
51
- import 'tinymce/plugins/emoticons'
52
- import 'tinymce/plugins/fullscreen'
53
- import 'tinymce/plugins/hr'
54
- import 'tinymce/plugins/image'
55
- import 'tinymce/plugins/imagetools'
56
- import 'tinymce/plugins/insertdatetime'
57
- import 'tinymce/plugins/link'
58
- import 'tinymce/plugins/lists'
59
- import 'tinymce/plugins/media'
60
- import 'tinymce/plugins/nonbreaking'
61
- import 'tinymce/plugins/noneditable'
62
- import 'tinymce/plugins/pagebreak'
63
- import 'tinymce/plugins/paste'
64
- import 'tinymce/plugins/preview'
65
- import 'tinymce/plugins/print'
66
- import 'tinymce/plugins/save'
67
- import 'tinymce/plugins/searchreplace'
68
- import 'tinymce/plugins/spellchecker'
69
- import 'tinymce/plugins/tabfocus'
70
- import 'tinymce/plugins/table'
71
- import 'tinymce/plugins/template'
72
- import 'tinymce/plugins/textpattern'
73
- import 'tinymce/plugins/visualblocks'
74
- import 'tinymce/plugins/visualchars'
75
- import 'tinymce/plugins/wordcount'
76
- import '../../icon/default'
77
- import TinymceEditor from '@tinymce/tinymce-vue' // TinyMCE vue wrapper
78
- // eslint-disable-next-line no-duplicate-imports
79
- import tinymce from 'tinymce/tinymce'
80
- import { uploadAudio, uploadVideo, uploadFile, uploadRecording, plugins, toolbar } from './config'
81
- import YksUploadfile from '../../UploadFile/index'
82
- import YksMultimedia from '../../Multimedia/index'
83
-
84
- import { Loading } from 'element-ui'
85
-
86
- export default {
87
- name: 'YksTinymce',
88
- components: {
89
- TinymceEditor,
90
- YksUploadfile,
91
- YksMultimedia
92
- },
93
- props: {
94
- value: {
95
- required: true
96
- },
97
- /* 语言包 */
98
- language: {
99
- type: String,
100
- default: 'zh_CN'
101
- },
102
- /* 扩展bar */
103
- toolbar: {
104
- type: [String, Array],
105
- default: () => []
106
- },
107
- /* 字数限制 */
108
- charLimit: {
109
- type: Number,
110
- default: 5000
111
- },
112
- /* 插件 */
113
- plugins: {
114
- type: [String, Array],
115
- default: () => []
116
- },
117
- menubar: {
118
- type: String,
119
- default: 'file edit insert view format table'
120
- },
121
- height: {
122
- type: String,
123
- default: '660px'
124
- },
125
- width: {
126
- type: String,
127
- default: 'auto'
128
- },
129
- inline: {
130
- type: Boolean,
131
- default: false
132
- },
133
- /* 音视频数据 */
134
- fileParams: {
135
- type: Array,
136
- default: () => []
137
- },
138
- /*
139
- 上传文件函数
140
- 抛出blobInfo函数
141
- 接收data src
142
- */
143
- uploadFileToHwCloud: {
144
- required: true,
145
- type: Function
146
- },
147
- /*
148
- 上传音视频文件函数
149
- 抛出数组文件信息
150
- 接收data src
151
- */
152
- uploadFileFunction: {
153
- required: true,
154
- type: Function
155
- },
156
- /* 扩展插件 */
157
- externalPlugins: {
158
- type: Object,
159
- default: () => {
160
- return {}
161
- }
162
- }
163
- },
164
- data() {
165
- return {
166
- hasChange: false,
167
- hasInit: false,
168
- fullscreen: false,
169
- isComposition: false,
170
- show: false,
171
- fileData: {
172
- fileType: '',
173
- typeList: [],
174
- fileSize: 0
175
- },
176
- limitNum: 0
177
- }
178
- },
179
- computed: {
180
- tinymceContent: {
181
- get() {
182
- return this.value
183
- },
184
- set(value) {
185
- this.$emit('input', value)
186
- }
187
- },
188
- containerWidth() {
189
- const width = this.width
190
- // Test matches `100`, `'100'`
191
- if (/^[\d]+(\.[\d]+)?$/.test(width.toString())) {
192
- return `${width}px`
193
- }
194
- return width
195
- },
196
- title() {
197
- const params = {
198
- recording: '音频录制',
199
- video: '视频上传',
200
- audio: '音频上传',
201
- file: '文件上传'
202
- }
203
- return params[this.fileData.fileType]
204
- },
205
- mediaTypeList() {
206
- return this.fileParams.map((v) => v.fileType)
207
- },
208
- initOptions() {
209
- return {
210
- selector: `#${this.tinymceId}`,
211
- height: this.height,
212
- charLimit: this.charLimit,
213
- body_class: 'panel-body ',
214
- object_resizing: false,
215
- inline: this.inline,
216
- toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar,
217
- menubar: this.menubar,
218
- plugins: this.plugins.length > 0 ? this.plugins : plugins,
219
- language: this.language,
220
- language_url: `https://pub-static.yks365.net/assets/tinymce/langs/${this.language}.js`,
221
- skin_url: 'https://pub-static.yks365.net/assets/tinymce/skins',
222
- emoticons_database_url:
223
- 'https://pub-static.yks365.net/assets/tinymce/emojis.min.js',
224
- end_container_on_empty_block: true,
225
- powerpaste_word_import: 'clean',
226
- code_dialog_height: 450,
227
- code_dialog_width: 1000,
228
- advlist_bullet_styles: 'square',
229
- advlist_number_styles: 'default',
230
- imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
231
- default_link_target: '_blank',
232
- link_title: false,
233
- nonbreaking_force_tab: true,
234
- branding: false,
235
- convert_urls: false,
236
- resize: false,
237
- elementpath: false,
238
- paste_as_text: false,
239
- paste_data_image: true,
240
- paste_data_images: true,
241
- external_plugins: {
242
- ...this.externalPlugins,
243
- powerpaste: `https://pub-static.yks365.net/assets/tinymce/powerpaste/plugin.min.js`,
244
- 'kityformula-editor': `https://pub-static.yks365.net/assets/tinymce/kityformula-editor/plugin.min.js`
245
- },
246
- images_upload_handler: async (blobInfo, success) => {
247
- const loading = Loading.service({
248
- lock: true,
249
- text: '上传中...',
250
- spinner: 'el-icon-loading',
251
- background: 'rgba(0, 0, 0, 0.7)'
252
- })
253
-
254
- try {
255
- const data = await this.uploadFileToHwCloud(blobInfo)
256
- success(data)
257
- } catch (error) {
258
- console.log(error)
259
- success('')
260
- }
261
- loading.close()
262
- },
263
- paste_preprocess: (e, args) => {
264
- const tinymax = this.charLimit
265
- const text = this.tinymceContent.replace(/(<([^>]+)>)/gi, '')
266
- const contentOnBlur = args.content.replace(/(<([^>]+)>)/gi, '')
267
- // 粘贴字数限制
268
- if (tinymax - text.length < contentOnBlur.length) {
269
- this.$message.error(`长度限制为${tinymax}个字符`)
270
- this.limitNum++
271
- if (tinymax > text.length) {
272
- args.content = contentOnBlur.substr(0, tinymax - text.length)
273
- } else {
274
- args.content = ''
275
- }
276
- }
277
- },
278
- init_instance_callback: (editor) => {
279
- if (this.value) {
280
- editor.setContent(this.value)
281
- }
282
- this.hasInit = true
283
- editor.on('NodeChange Change KeyUp SetContent', () => {
284
- this.hasChange = true
285
- this.$emit('input', editor.getContent())
286
- })
287
- },
288
- setup: (editor) => {
289
- editor.on('FullscreenStateChanged', (e) => {
290
- this.fullscreen = e.state
291
- })
292
- editor.on('compositionstart', () => {
293
- this.isComposition = false
294
- })
295
- editor.on('compositionend', () => {
296
- this.isComposition = true
297
- })
298
- editor.on('input', (e) => {
299
- this.wordLimit(e, editor)
300
- })
301
-
302
- editor.ui.registry.addButton('uploadRecording', {
303
- text: uploadRecording,
304
- onAction: () => {
305
- if (this.mediaTypeList.includes('recording')) {
306
- this.$message.warning('最多选择一种!')
307
- return
308
- }
309
- this.show = true
310
- this.fileData.fileType = 'recording'
311
- this.fileData.typeList = []
312
- this.fileData.fileSize = 600
313
- }
314
- })
315
-
316
- editor.ui.registry.addButton('uploadVideo', {
317
- text: uploadVideo,
318
- onAction: () => {
319
- if (this.mediaTypeList.includes('video')) {
320
- this.$message.warning('最多选择一种!')
321
- return
322
- }
323
- this.fileData.fileType = 'video'
324
- this.fileData.typeList = ['mp4']
325
- this.fileData.fileSize = 20
326
- this.show = true
327
- }
328
- })
329
-
330
- editor.ui.registry.addButton('uploadAudio', {
331
- text: uploadAudio,
332
- onAction: () => {
333
- if (this.mediaTypeList.includes('audio')) {
334
- this.$message.warning('最多选择一种!')
335
- return
336
- }
337
- this.fileData.fileType = 'audio'
338
- this.show = true
339
- this.fileData.typeList = ['mp3']
340
- this.fileData.fileSize = 20
341
- }
342
- })
343
-
344
- editor.ui.registry.addButton('uploadFile', {
345
- text: uploadFile,
346
- onAction: () => {
347
- if (this.mediaTypeList.includes('file')) {
348
- this.$message.warning('最多选择一种!')
349
- return
350
- }
351
- this.fileData.fileType = 'file'
352
- this.fileData.typeList = ['pptx', 'docx', 'pdf', 'xlsx']
353
- this.fileData.fileSize = 20
354
- this.show = true
355
- }
356
- })
357
- }
358
- }
359
- },
360
- tinymceId() {
361
- return 'vue-tinymce-' + Number(new Date()) + String((Math.random() * 1000).toFixed(0))
362
- }
363
- },
364
- destroy() {
365
- const tinymce = window.tinymce.get(this.tinymceId)
366
- tinymce.destroy()
367
- },
368
- methods: {
369
- handleCloseFile(row, index) {
370
- this.$emit('delte', {
371
- row: row,
372
- index: index
373
- })
374
- },
375
- handleFillInBlanks(value, id) {
376
- const editor = this.$refs.tinymceEditor.editor
377
- editor.editorManager.get(editor.id).focus()
378
- tinymce.activeEditor.insertContent(
379
- `<input type="text" class="fill-icon ${id}" disabled readonly value="${value}">`
380
- )
381
- },
382
- deleFillItem(index) {
383
- const el = this.$refs.tinymceEditor.editor
384
- el.editorManager.get(el.id).focus()
385
- const elList =
386
- tinymce.activeEditor && tinymce.activeEditor.iframeElement
387
- ? tinymce.activeEditor.iframeElement.contentWindow &&
388
- tinymce.activeEditor.iframeElement.contentWindow.document.getElementsByTagName(
389
- 'input'
390
- )
391
- : []
392
- elList[index].remove()
393
- for (let i = 0; i < elList.length; i++) {
394
- elList[i].setAttribute('value', i + 1)
395
- }
396
- },
397
- onSure(value) {
398
- this.$emit('change', {
399
- value: this.tinymceContent,
400
- itemAttr: { type: this.fileData.fileType, content: value }
401
- })
402
- },
403
- wordLimit(e, editor) {
404
- const tinymax = editor.settings.charLimit
405
- const text = e.target.innerText
406
- const html = e.target.innerHTML
407
- let last = ''
408
- let lastIndex = ''
409
- let startVal = ''
410
- let endVal = ''
411
- if (text.length === tinymax) {
412
- this.tinymceContent = html
413
- // 兼容输入法有可能会跳过最大值
414
- } else if (!this.isComposition && text.length === tinymax + 1) {
415
- last = text.substr(text.length - 1, 1)
416
- lastIndex = html.lastIndexOf(last)
417
- startVal = html.substring(0, lastIndex)
418
- endVal = html.substring(lastIndex + 1, html.length)
419
- this.tinymceContent = startVal + endVal
420
- }
421
- if (text.length > tinymax) {
422
- e.target.innerHTML = this.tinymceContent
423
- this.keepLastIndex()
424
- editor.focus()
425
- if (!this.limitNum) {
426
- this.$message.error(`长度限制为${tinymax}个字符`)
427
- this.limitNum++
428
- }
429
- } else {
430
- this.limitNum = 0
431
- }
432
- },
433
- keepLastIndex() {
434
- const tinymce = window.tinymce.get(this.tinymceId)
435
- const wind = tinymce.contentWindow
436
- const obj = wind.document.getElementById('tinymce')
437
- if (wind.getSelection) {
438
- // ie11 10 9 ff safari
439
- obj.focus() // 解决ff不获取焦点无法定位问题
440
- const range = wind.getSelection() // 创建range
441
- console.log(range)
442
- range.selectAllChildren(obj) // range 选择obj下所有子内容
443
- range.collapseToEnd() // 光标移至最后
444
- } else if (document.selection) {
445
- // ie10 9 8 7 6 5
446
- const range = document.selection.createRange() // 创建选择对象
447
- range.moveToElementText(obj) // range定位到obj
448
- range.collapse(false) // 光标移至最后
449
- range.select()
450
- }
451
- }
452
- }
453
- }
454
- </script>
455
-
456
- <style lang="scss" scoped>
457
- .tinymce-container {
458
- line-height: normal;
459
- position: relative;
460
-
461
- .mce-fullscreen {
462
- z-index: 10000;
463
- }
464
-
465
- .editor-custom-btn-container {
466
- position: absolute;
467
- top: 6px;
468
- right: 6px;
469
-
470
- &.fullscreen {
471
- position: fixed;
472
- z-index: 10000;
473
- }
474
- }
475
-
476
- .editor-upload-btn {
477
- display: inline-block;
478
- }
479
-
480
- textarea {
481
- visibility: hidden;
482
- z-index: -1;
483
- }
484
- .ti-multimedia {
485
- position: relative;
486
- display: flex;
487
- align-items: flex-start;
488
- flex-wrap: wrap;
489
- margin-top: 10px;
490
- }
491
-
492
- .tinymce-inline {
493
- padding: 0 20px;
494
- border: 1px solid #ccc;
495
- }
496
- .tox-statusbar__wordcount {
497
- opacity: 0 !important;
498
- }
499
- }
500
- </style>
@@ -1,23 +0,0 @@
1
- import Single from './src/single'
2
- import Multiple from './src/multiple'
3
- import Judgment from './src/judgment'
4
- import FillInBlanks from './src/fillInBlanks'
5
- import ShortAnswer from './src/shortAnswer'
6
- import PictureAnswer from './src/pictureAnswer'
7
- import Compound from './src/compound'
8
- import AudioFrequency from './src/audioFrequency'
9
- import Attachment from './src/attachment'
10
-
11
- const components = [
12
- Single,
13
- Multiple,
14
- Judgment,
15
- FillInBlanks,
16
- ShortAnswer,
17
- PictureAnswer,
18
- Compound,
19
- AudioFrequency,
20
- Attachment
21
- ]
22
-
23
- export default components
@@ -1,125 +0,0 @@
1
- <template>
2
- <div class="single">
3
- <div class="single-stem__label required__label">题干</div>
4
- <yks-tinymce
5
- key="itemContent"
6
- :value="fromData.itemContent"
7
- :toolbar="toolbar"
8
- :plugins="plugins"
9
- :charLimit="topicDataExtent.itemContentLength || 20000"
10
-
11
- :fileParams="getFileTypes('stem', fromData.stemAttrs)"
12
- :uploadFileToHwCloud="uploadFileToHwCloud"
13
- :uploadFileFunction="uploadFileFunction"
14
- menubar=""
15
- height="200px"
16
- @change="($event) => getTinymceEdit($event, 'stem')"
17
- @delte="($event) => handleDelteAttrs($event, 'stem', fromData.stemAttrs)"
18
- />
19
- <div class="single-stem__label required__label">标准答案</div>
20
- <yks-tinymce
21
- key="answer"
22
- :value="fromData.answer"
23
- :toolbar="toolbar"
24
- :plugins="plugins"
25
- :charLimit="topicDataExtent.answerLength || 5000"
26
-
27
- :fileParams="getFileTypes('answer', fromData.answerAttrs)"
28
- :uploadFileToHwCloud="uploadFileToHwCloud"
29
- :uploadFileFunction="uploadFileFunction"
30
- menubar=""
31
- height="200px"
32
- @change="($event) => getTinymceEdit($event, 'answer')"
33
- @delte="($event) => handleDelteAttrs($event, 'answer', fromData.answerAttrs)"
34
- />
35
- <div class="single-stem__label">答案解析</div>
36
- <yks-tinymce
37
- key="description"
38
- :value="fromData.description"
39
- :toolbar="toolbar"
40
- :plugins="plugins"
41
- :charLimit="topicDataExtent.descriptionLength || 20000"
42
- :fileParams="getFileTypes('analysis', fromData.descriptionAttrs)"
43
- :uploadFileToHwCloud="uploadFileToHwCloud"
44
- :uploadFileFunction="uploadFileFunction"
45
- menubar=""
46
- height="200px"
47
- @change="($event) => getTinymceEdit($event, 'analysis')"
48
- @delte="($event) => handleDelteAttrs($event, 'analysis', fromData.descriptionAttrs)"
49
- />
50
- </div>
51
- </template>
52
- <script>
53
- import YksTinymce from '../../Tinymce/index'
54
- import TopicMixins from '../../assets/mixins/topic'
55
- import { stemItemType, shortItemType, analysisItemType } from './config'
56
-
57
- export default {
58
- name: 'YksAttachment',
59
- components: { YksTinymce },
60
- mixins: [TopicMixins],
61
- methods: {
62
- /**
63
- * data 富文本数据
64
- * field 对象名
65
- * type 类型
66
- */
67
- getTinymceEdit(data, type) {
68
- switch (type) {
69
- case 'stem':
70
- data.itemAttr.type = stemItemType[data.itemAttr.type]
71
- this.fromData.itemContent = data.value
72
- if (data.itemAttr.type && data.itemAttr.content) {
73
- this.fromData.stemAttrs.push(data.itemAttr)
74
- }
75
- break
76
- case 'answer':
77
- data.itemAttr.type = shortItemType[data.itemAttr.type]
78
- this.fromData.answer = data.value
79
- if (data.itemAttr.type && data.itemAttr.content) {
80
- this.fromData.answerAttrs.push(data.itemAttr)
81
- }
82
- break
83
- case 'analysis':
84
- data.itemAttr.type = analysisItemType[data.itemAttr.type]
85
- this.fromData.description = data.value
86
-
87
- if (data.itemAttr.type && data.itemAttr.content) {
88
- this.fromData.descriptionAttrs.push(data.itemAttr)
89
- }
90
- break
91
- default:
92
- break
93
- }
94
- this.$emit('change', this.fromData)
95
- },
96
-
97
- handleDelteAttrs(data, type, list, row = {}) {
98
- const listAttrs = list
99
- listAttrs.splice(data.index, 1)
100
- switch (type) {
101
- case 'stem':
102
- this.fromData.stemAttrs = listAttrs
103
- break
104
- case 'answer':
105
- this.fromData.answerAttrs = listAttrs
106
- break
107
- case 'analysis':
108
- this.fromData.descriptionAttrs = listAttrs
109
- break
110
- default:
111
- break
112
- }
113
- this.$emit('change', this.fromData)
114
- }
115
- }
116
- }
117
- </script>
118
-
119
- <style lang="scss" scoped>
120
- .single-stem__label {
121
- margin: 30px 0;
122
- font-size: 18px;
123
- font-weight: 700;
124
- }
125
- </style>