@idooel/components 0.0.1-beta.99 → 0.0.2

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 (105) hide show
  1. package/README.md +98 -98
  2. package/dist/@idooel/components.esm.js +256 -159
  3. package/dist/@idooel/components.umd.js +256 -159
  4. package/jsconfig.json +7 -7
  5. package/package.json +50 -50
  6. package/packages/alert/index.js +4 -4
  7. package/packages/alert/src/index.vue +45 -45
  8. package/packages/batch-export/index.js +4 -4
  9. package/packages/batch-export/src/index.vue +104 -104
  10. package/packages/business-components/modal-fsm/index.js +4 -4
  11. package/packages/business-components/modal-fsm/src/index.vue +163 -163
  12. package/packages/business-components/modal-import/index.js +4 -4
  13. package/packages/business-components/modal-import/src/index.vue +139 -139
  14. package/packages/business-components/modal-timeline/index.js +4 -4
  15. package/packages/business-components/modal-timeline/src/index.vue +77 -77
  16. package/packages/business-components/tabs-sub-center/index.js +4 -4
  17. package/packages/business-components/tabs-sub-center/src/index.vue +116 -116
  18. package/packages/button/index.js +4 -4
  19. package/packages/button/src/index.vue +65 -65
  20. package/packages/checkbox/index.js +4 -4
  21. package/packages/checkbox/src/index.vue +52 -52
  22. package/packages/composite-components/button-group/index.js +4 -4
  23. package/packages/composite-components/button-group/src/index.vue +151 -151
  24. package/packages/composite-components/form-attachment/src/index.vue +14 -14
  25. package/packages/composite-components/form-img-crop/index.js +4 -4
  26. package/packages/composite-components/form-img-crop/src/index.vue +120 -111
  27. package/packages/composite-components/modal-confirm/index.js +4 -4
  28. package/packages/composite-components/modal-confirm/src/index.vue +103 -103
  29. package/packages/composite-components/modal-form/index.js +4 -4
  30. package/packages/composite-components/modal-form/src/index.vue +230 -223
  31. package/packages/composite-components/modal-img-crop/index.js +4 -4
  32. package/packages/composite-components/modal-img-crop/src/index.vue +298 -289
  33. package/packages/composite-components/modal-table/index.js +4 -4
  34. package/packages/composite-components/modal-table/src/index.vue +155 -155
  35. package/packages/composite-components/modal-tree/index.js +4 -4
  36. package/packages/composite-components/modal-tree/src/index.vue +75 -75
  37. package/packages/composite-components/search-area/index.js +4 -4
  38. package/packages/composite-components/search-area/src/index.vue +237 -237
  39. package/packages/composite-components/search-area/src/label.vue +35 -35
  40. package/packages/composite-components/select-entity-modal-table/index.js +4 -4
  41. package/packages/composite-components/select-entity-modal-table/src/index.vue +171 -168
  42. package/packages/date/index.js +4 -4
  43. package/packages/date/src/index.vue +112 -112
  44. package/packages/date-range/index.js +4 -4
  45. package/packages/date-range/src/index.vue +47 -47
  46. package/packages/form/index.js +4 -4
  47. package/packages/form/src/index.vue +318 -302
  48. package/packages/icon/index.js +4 -4
  49. package/packages/icon/src/index.vue +31 -31
  50. package/packages/index.js +153 -153
  51. package/packages/input/index.js +4 -4
  52. package/packages/input/src/index.vue +35 -35
  53. package/packages/input-number/index.js +4 -4
  54. package/packages/input-number/src/index.vue +23 -23
  55. package/packages/loading/index.js +4 -4
  56. package/packages/loading/src/index.vue +36 -36
  57. package/packages/modal/index.js +4 -4
  58. package/packages/modal/src/index.vue +184 -184
  59. package/packages/models/form-group-model/index.js +4 -4
  60. package/packages/models/form-group-model/src/index.vue +273 -273
  61. package/packages/models/form-model/index.js +4 -4
  62. package/packages/models/form-model/src/index.vue +232 -221
  63. package/packages/models/step-model/index.js +4 -4
  64. package/packages/models/step-model/src/index.vue +224 -224
  65. package/packages/models/tree-table-model/index.js +4 -4
  66. package/packages/models/tree-table-model/src/index.vue +689 -681
  67. package/packages/radio/index.js +4 -4
  68. package/packages/radio/src/index.vue +56 -56
  69. package/packages/select/index.js +4 -4
  70. package/packages/select/src/index.vue +105 -105
  71. package/packages/select-entity/index.js +4 -4
  72. package/packages/select-entity/src/index.vue +119 -119
  73. package/packages/table/index.js +4 -4
  74. package/packages/table/src/action.vue +172 -172
  75. package/packages/table/src/index.vue +289 -335
  76. package/packages/tabs/index.js +4 -4
  77. package/packages/tabs/src/index.vue +55 -55
  78. package/packages/text/index.js +4 -4
  79. package/packages/text/src/index.vue +47 -47
  80. package/packages/text-editor/index.js +4 -4
  81. package/packages/text-editor/src/index.vue +72 -72
  82. package/packages/textarea/index.js +4 -4
  83. package/packages/textarea/src/index.vue +57 -57
  84. package/packages/theme/form.scss +21 -21
  85. package/packages/theme/index.scss +42 -42
  86. package/packages/theme/overrid.scss +7 -7
  87. package/packages/theme/styleClass.scss +2 -2
  88. package/packages/theme/variables.scss +55 -55
  89. package/packages/timeline/index.js +4 -4
  90. package/packages/timeline/src/index.vue +257 -257
  91. package/packages/tpl/index.js +4 -4
  92. package/packages/tpl/src/index.vue +55 -55
  93. package/packages/tree/index.js +4 -4
  94. package/packages/tree/src/TreeNode.vue +29 -29
  95. package/packages/tree/src/index.vue +101 -101
  96. package/packages/tree-select/index.js +4 -4
  97. package/packages/tree-select/src/index.vue +142 -142
  98. package/packages/upload/index.js +4 -4
  99. package/packages/upload/src/index.vue +444 -444
  100. package/packages/utils/index.js +62 -62
  101. package/scripts/rollup.config.js +42 -42
  102. package/scripts/rollup.esm.config.js +11 -11
  103. package/scripts/rollup.umd.config.js +14 -14
  104. package/dist/@idooel/components.esm.js.map +0 -1
  105. package/dist/@idooel/components.umd.js.map +0 -1
@@ -1,445 +1,445 @@
1
- <template>
2
- <div class="ele-upload__wrapper">
3
- <FileUpload
4
- class="ele-upload__inner"
5
- v-show="isShowUploadContainer"
6
- v-model="files"
7
- :ref="uploadRef"
8
- :drop="drop"
9
- :chunk-enabled="chunkEnabled"
10
- :chunk="chunkConfig"
11
- :accept="accept"
12
- :extensions="extensions"
13
- :size="fileSizeLimit"
14
- :post-action="postAction"
15
- :multiple="multiple"
16
- :headers="headers"
17
- :maximum="getMaximum"
18
- @input-file="onWatchInputFiles"
19
- @input="onWatchFiles"
20
- style="width: 100%;">
21
- <section class="ele-upload__area">
22
- <div class="ele-upload__area--icon">
23
- <template v-if="iconIsZhWrod">
24
- {{ icon }}
25
- </template>
26
- <template v-else>
27
- <ele-icon :type="icon"></ele-icon>
28
- </template>
29
- </div>
30
- <div class="ele-upload__area--text">
31
- <div class="ele-upload__message" v-if="message" v-html="message"></div>
32
- <div class="ele-upload__message" v-else>单击或拖动文件到该区域以上传</div>
33
- <div class="ele-upload__ext" v-if="ext" v-html="ext"></div>
34
- <div class="ele-upload__ext" v-else>文件小于{{ size }}M</div>
35
- </div>
36
- </section>
37
- </FileUpload>
38
- <section class="ele-files__wrapper">
39
- <div class="ele-file__item" v-for="(file, idx) in buildedFiles" :key="idx">
40
- <div class="ele-file__suffix--icon">
41
- <ele-icon :type="fileSuffixIcon[file.suffix] ? fileSuffixIcon[file.suffix].name : 'icon-file'"></ele-icon>
42
- </div>
43
- <div class="ele-file__name">
44
- <div class="ele-file__inner" @click="handleClickDownload(file)">{{ file.name }}</div>
45
- <div v-if="(!file.success && file.progress)" class="ele-uplpad__progress">
46
- <a-progress :strokeWidth="2" :percent="Number(file.progress)" size="small" />
47
- </div>
48
- </div>
49
- <div class="ele-file__delete" v-if="file.success || file.error || !file.response">
50
- <span class="ele-file__size">{{ (file.size / byteConversion).toFixed(2) }}M</span>
51
- <span class="ele-file__delete--icon" @click="handleClickDelete(file)">
52
- <ele-icon type="delete"></ele-icon>
53
- </span>
54
- </div>
55
- </div>
56
- </section>
57
- </div>
58
- </template>
59
-
60
- <script>
61
- import FileUpload from 'vue-upload-component'
62
- import { v4 as uuidv4 } from 'uuid'
63
- import { route, net, type } from '@idooel/shared'
64
- export default {
65
- name: 'ele-upload',
66
- components: {
67
- FileUpload
68
- },
69
- model: {
70
- prop: 'value',
71
- event: 'change'
72
- },
73
- props: {
74
- url: {
75
- type: String,
76
- //TODO
77
- default: `zuul/api-file/workbench/file`
78
- },
79
- icon: {
80
- type: String,
81
- default: '上传'
82
- },
83
- size: {
84
- type: Number,
85
- default: 100
86
- },
87
- message: {
88
- type: String,
89
- default: '单击或拖动文件到该区域以上传'
90
- },
91
- ext: {
92
- type: String
93
- },
94
- extensions: {
95
- type: String
96
- },
97
- accept: {
98
- type: String
99
- },
100
- maximum: {
101
- type: Number,
102
- default: 10
103
- },
104
- multiple: {
105
- type: Boolean,
106
- default: false
107
- },
108
- drop: {
109
- type: Boolean,
110
- default: true
111
- },
112
- value: {
113
- type: [String, Array]
114
- },
115
- querys: {
116
- type: Object,
117
- default: () => ({
118
- _csrf: localStorage.getItem('token'),
119
- _t: new Date().valueOf()
120
- })
121
- },
122
- headers: {
123
- type: Object,
124
- default: () => ({
125
- 'X-XSRF-TOKEN': localStorage.getItem('token')
126
- })
127
- },
128
- byteConversion: {
129
- type: Number,
130
- default: 1024 * 1024
131
- },
132
- chunkEnabled: {
133
- type: Boolean,
134
- default: true
135
- }
136
- },
137
- data() {
138
- return {
139
- files: [],
140
- buildedFiles: [],
141
- saveToServerAsyncPageTimer: null
142
- }
143
- },
144
- watch: {
145
- value: {
146
- async handler (value) {
147
- if (type.isArray(value)) {
148
- // multiple
149
- } else if (type.isEmpty(value)) {
150
- this.files = []
151
- this.buildedFiles = []
152
- } else {
153
- // single
154
- this.fetchFileWithFileId()
155
- }
156
- },
157
- immediate: true
158
- }
159
- },
160
- computed: {
161
- prefixPath () {
162
- return window.prefixPath
163
- },
164
- iconIsZhWrod () {
165
- return type.isZhWord(this.icon)
166
- },
167
- getPayloads () {
168
- return {
169
- override: false
170
- }
171
- },
172
- chunkConfig () {
173
- return {
174
- action: `${this.prefixPath}zuul/api-file/workbench/file/temp/chunk/vue`,
175
- headers: {
176
- ...this.headers
177
- },
178
- minSize: 3 * this.byteConversion,
179
- maxActive: 3,
180
- maxRetries: 5,
181
- startBody: {
182
- override: true,
183
- path: '/cw'
184
- },
185
- uploadBody: {
186
- override: true,
187
- path: '/cw'
188
- },
189
- finishBody: {
190
- override: true,
191
- path: '/cw'
192
- }
193
- }
194
- },
195
- isFileUploadSuccessed () {
196
- return this.files.every(file => file.success)
197
- },
198
- isShowUploadContainer () {
199
- if (this.multiple) {
200
- if (this.isFileUploadSuccessed && this.buildedFiles.length >= this.maximum) {
201
- return false
202
- } else {
203
- return true
204
- }
205
- } else {
206
- const [file = {}] = this.buildedFiles
207
- if (this.buildedFiles.length < 1) {
208
- return true
209
- }
210
- if ((this.isFileUploadSuccessed && this.buildedFiles.length >= 1) || !file.response) {
211
- return false
212
- } else {
213
- return true
214
- }
215
- }
216
- },
217
- getMaximum () {
218
- return this.multiple ? this.maximum : 1
219
- },
220
- fileSizeLimit () {
221
- return this.size * this.byteConversion
222
- },
223
- postAction () {
224
- const ret = route.toQueryString(this.querys)
225
- return `${this.prefixPath}${this.url}?${ret}`
226
- },
227
- uploadRef () {
228
- return uuidv4()
229
- },
230
- fileSuffixIcon () {
231
- return {
232
- 'doc': { name: 'icon-doc' },
233
- 'html': { name: 'icon-html' },
234
- 'mp4': { name: 'icon-mp' },
235
- 'pdf': { name: 'icon-pdf' },
236
- 'ppt': { name: 'icon-ppt' },
237
- 'psd': { name: 'icon-psd' },
238
- 'rtf': { name: 'icon-rtf' },
239
- 'txt': { name: 'icon-txt' },
240
- 'vis': { name: 'icon-vis' },
241
- 'xls': { name: 'icon-xls' },
242
- 'xml': { name: 'icon-xml' },
243
- 'zip': { name: 'icon-zip' },
244
- 'jpg': { name: 'icon-img' },
245
- 'mp3': { name: 'icon-mp1' },
246
- }
247
- },
248
- fileIds () {
249
- const fileIds = this.buildedFiles.map(file => {
250
- return file.fileID
251
- })
252
- return this.multiple ? fileIds : fileIds[0]
253
- },
254
- fileResponseData () {
255
- return this.multiple ? this.buildedFiles : this.buildedFiles[0]
256
- }
257
- },
258
- methods: {
259
- async fetchFileWithFileId () {
260
- if (!this.value) return
261
- await net.get(
262
- `/api-file/file/${this.value}`
263
- ).then(resp => {
264
- const { data } = resp
265
- this.buildedFiles = [data]
266
- this.files = [data]
267
- })
268
- },
269
- handleClickDownload (file) {
270
- const { fileID: fileId } = file
271
- window.open(`/api-file/workbench/file/stream/${fileId}?origin=true`)
272
- },
273
- handleClickDelete (file) {
274
- this.$refs[this.uploadRef].remove(file)
275
- const { fileID } = file
276
- this.files = this.files.filter(file => file.fileID !== fileID)
277
- this.buildedFiles = this.buildedFiles.filter(file => file.fileID !== fileID)
278
- this.$emit('change', this.fileIds)
279
- },
280
- onWatchFiles (files) {
281
- this.files = files
282
- this.buildedFiles = this.files.map(file => {
283
- return {
284
- ...file.response.data,
285
- ...file
286
- }
287
- })
288
- if (this.isFileUploadSuccessed) {
289
- this.$emit('change', this.fileIds)
290
- this.$emit('on-success', this.fileResponseData)
291
- }
292
- },
293
- async saveToServerAsyncPage (payloads = {}) {
294
- net.post('zuul/api-file/workbench/file/temp/saveToServerAsyncPage', payloads, {
295
- headers: {
296
- 'Content-Type': 'multipart/form-data'
297
- }
298
- }).then(resp =>{
299
- const { data } = resp
300
- if (data !== 'saveToServerAsyncPage') {
301
- clearInterval(this.saveToServerAsyncPageTimer)
302
- }
303
- })
304
- // const ret = await net.post({
305
- // url: 'zuul/api-file/workbench/file/temp/saveToServerAsyncPage',
306
- // method: 'POST',
307
- // data: { ...payloads }
308
- // }).then(resp => {
309
- // const { data: { data, code, message } } = resp
310
- // if (code !== '2000') {
311
- // this.$Message.error(message)
312
- // return
313
- // }
314
- // if (data !== 'saveToServerAsyncPage') {
315
- // clearInterval(timer)
316
- // const { fileID, size } = data
317
- // this.$emit('on-success', { ...data, fileId: fileID })
318
- // this.$Message.success('同步成功')
319
- // return { fileId: fileID, size }
320
- // }
321
- // })
322
- // return ret
323
- },
324
- onWatchInputFiles (newFile, oldFile) {
325
- if (newFile && !oldFile) {
326
- // add file
327
- console.log('add', newFile)
328
- }
329
- if (newFile && oldFile) {
330
- // update file
331
- console.log('update', newFile)
332
- const { success, active, chunk, response } = newFile
333
- if (chunk && success && !active) {
334
- console.log('chunk end')
335
- const { data: { file, type } } = response
336
- const payloads = {
337
- filePath: file.match(/\/cw(.*)/)[0],
338
- asyncID: uuidv4(),
339
- isDeleteOrigin: false,
340
- toImage: type === 'pdf' ? true : false,
341
- unzip: type === 'zip' ? true : false,
342
- _csrf: localStorage.getItem('token')
343
- }
344
- this.saveToServerAsyncPageTimer = setInterval(() => {
345
- this.saveToServerAsyncPage(payloads)
346
- }, 2000)
347
- }
348
- }
349
- if (!newFile && oldFile) {
350
- // delete file
351
- console.log('delete')
352
- }
353
- if (Boolean(newFile) !== Boolean(oldFile) || oldFile.error !== newFile.error) {
354
- if (!this.$refs[this.uploadRef].active) {
355
- this.$refs[this.uploadRef].active = true
356
- }
357
- }
358
- }
359
- }
360
- }
361
- </script>
362
-
363
- <style lang="scss" scoped>
364
- ::v-deep .ele-upload__inner {
365
- opacity: 1 !important;
366
- cursor: pointer;
367
- border: 1px dashed var(--idooel-form-title-border-color);
368
- background: var(--idooel-form-upload-bg-color) !important;
369
- &:hover {
370
- border-color: var(--idooel-form-upload-border-hover-color);
371
- }
372
- border-radius: var(--idooel-form-border-radius);
373
- }
374
- .ele-upload__wrapper {
375
- width: 100%;
376
- .ele-upload__area {
377
- padding: 16px;
378
- width: 100%;
379
- height: 80px;
380
- display: flex;
381
- flex-direction: row;
382
- .ele-upload__area--icon {
383
- color: var(--idooel-primary-color);
384
- display: flex;
385
- flex-direction: row;
386
- align-items: center;
387
- font-size: 16x;
388
- .anticon-cloud-upload {
389
- font-size: 48px;
390
- color: var(--idooel-primary-color);
391
- }
392
- .anticon {
393
- font-size: 48px;
394
- color: var(--idooel-primary-color);
395
- }
396
- }
397
- .ele-upload__area--text {
398
- margin-left: 16px;
399
- .ele-upload__message {
400
- font-size: 16px;
401
- color: var(--idoole-black-088);
402
- text-align: left;
403
- }
404
- .ele-upload__ext {
405
- text-align: left;
406
- font-size: 14px;
407
- color: var(--idoole-black-06);
408
- }
409
- }
410
- }
411
- .ele-files__wrapper {
412
- .ele-file__item {
413
- width: 100%;
414
- margin-top: 8px;
415
- padding: 8px 12px;
416
- border-radius: var(--idooel-form-border-radius);
417
- background: var(--idooel-form-upload-bg-color);
418
- display: flex;
419
- flex-direction: row;
420
- align-items: center;
421
- .ele-file__suffix--icon {}
422
- .ele-file__name {
423
- flex: 1;
424
- text-align: left;
425
- white-space: nowrap;
426
- overflow: hidden;
427
- font-size: 14px;
428
- margin-left: 8px;
429
- cursor: pointer;
430
- .ele-file__inner {
431
- overflow: hidden;
432
- text-overflow: ellipsis;
433
- }
434
- }
435
- .ele-file__delete {
436
- margin-left: 8px;
437
- .ele-file__delete--icon {
438
- margin-left: 8px;
439
- cursor: pointer;
440
- }
441
- }
442
- }
443
- }
444
- }
1
+ <template>
2
+ <div class="ele-upload__wrapper">
3
+ <FileUpload
4
+ class="ele-upload__inner"
5
+ v-show="isShowUploadContainer"
6
+ v-model="files"
7
+ :ref="uploadRef"
8
+ :drop="drop"
9
+ :chunk-enabled="chunkEnabled"
10
+ :chunk="chunkConfig"
11
+ :accept="accept"
12
+ :extensions="extensions"
13
+ :size="fileSizeLimit"
14
+ :post-action="postAction"
15
+ :multiple="multiple"
16
+ :headers="headers"
17
+ :maximum="getMaximum"
18
+ @input-file="onWatchInputFiles"
19
+ @input="onWatchFiles"
20
+ style="width: 100%;">
21
+ <section class="ele-upload__area">
22
+ <div class="ele-upload__area--icon">
23
+ <template v-if="iconIsZhWrod">
24
+ {{ icon }}
25
+ </template>
26
+ <template v-else>
27
+ <ele-icon :type="icon"></ele-icon>
28
+ </template>
29
+ </div>
30
+ <div class="ele-upload__area--text">
31
+ <div class="ele-upload__message" v-if="message" v-html="message"></div>
32
+ <div class="ele-upload__message" v-else>单击或拖动文件到该区域以上传</div>
33
+ <div class="ele-upload__ext" v-if="ext" v-html="ext"></div>
34
+ <div class="ele-upload__ext" v-else>文件小于{{ size }}M</div>
35
+ </div>
36
+ </section>
37
+ </FileUpload>
38
+ <section class="ele-files__wrapper">
39
+ <div class="ele-file__item" v-for="(file, idx) in buildedFiles" :key="idx">
40
+ <div class="ele-file__suffix--icon">
41
+ <ele-icon :type="fileSuffixIcon[file.suffix] ? fileSuffixIcon[file.suffix].name : 'icon-file'"></ele-icon>
42
+ </div>
43
+ <div class="ele-file__name">
44
+ <div class="ele-file__inner" @click="handleClickDownload(file)">{{ file.name }}</div>
45
+ <div v-if="(!file.success && file.progress)" class="ele-uplpad__progress">
46
+ <a-progress :strokeWidth="2" :percent="Number(file.progress)" size="small" />
47
+ </div>
48
+ </div>
49
+ <div class="ele-file__delete" v-if="file.success || file.error || !file.response">
50
+ <span class="ele-file__size">{{ (file.size / byteConversion).toFixed(2) }}M</span>
51
+ <span class="ele-file__delete--icon" @click="handleClickDelete(file)">
52
+ <ele-icon type="delete"></ele-icon>
53
+ </span>
54
+ </div>
55
+ </div>
56
+ </section>
57
+ </div>
58
+ </template>
59
+
60
+ <script>
61
+ import FileUpload from 'vue-upload-component'
62
+ import { v4 as uuidv4 } from 'uuid'
63
+ import { route, net, type } from '@idooel/shared'
64
+ export default {
65
+ name: 'ele-upload',
66
+ components: {
67
+ FileUpload
68
+ },
69
+ model: {
70
+ prop: 'value',
71
+ event: 'change'
72
+ },
73
+ props: {
74
+ url: {
75
+ type: String,
76
+ //TODO
77
+ default: `zuul/api-file/workbench/file`
78
+ },
79
+ icon: {
80
+ type: String,
81
+ default: '上传'
82
+ },
83
+ size: {
84
+ type: Number,
85
+ default: 100
86
+ },
87
+ message: {
88
+ type: String,
89
+ default: '单击或拖动文件到该区域以上传'
90
+ },
91
+ ext: {
92
+ type: String
93
+ },
94
+ extensions: {
95
+ type: String
96
+ },
97
+ accept: {
98
+ type: String
99
+ },
100
+ maximum: {
101
+ type: Number,
102
+ default: 10
103
+ },
104
+ multiple: {
105
+ type: Boolean,
106
+ default: false
107
+ },
108
+ drop: {
109
+ type: Boolean,
110
+ default: true
111
+ },
112
+ value: {
113
+ type: [String, Array]
114
+ },
115
+ querys: {
116
+ type: Object,
117
+ default: () => ({
118
+ _csrf: localStorage.getItem('token'),
119
+ _t: new Date().valueOf()
120
+ })
121
+ },
122
+ headers: {
123
+ type: Object,
124
+ default: () => ({
125
+ 'X-XSRF-TOKEN': localStorage.getItem('token')
126
+ })
127
+ },
128
+ byteConversion: {
129
+ type: Number,
130
+ default: 1024 * 1024
131
+ },
132
+ chunkEnabled: {
133
+ type: Boolean,
134
+ default: true
135
+ }
136
+ },
137
+ data() {
138
+ return {
139
+ files: [],
140
+ buildedFiles: [],
141
+ saveToServerAsyncPageTimer: null
142
+ }
143
+ },
144
+ watch: {
145
+ value: {
146
+ async handler (value) {
147
+ if (type.isArray(value)) {
148
+ // multiple
149
+ } else if (type.isEmpty(value)) {
150
+ this.files = []
151
+ this.buildedFiles = []
152
+ } else {
153
+ // single
154
+ this.fetchFileWithFileId()
155
+ }
156
+ },
157
+ immediate: true
158
+ }
159
+ },
160
+ computed: {
161
+ prefixPath () {
162
+ return window.prefixPath
163
+ },
164
+ iconIsZhWrod () {
165
+ return type.isZhWord(this.icon)
166
+ },
167
+ getPayloads () {
168
+ return {
169
+ override: false
170
+ }
171
+ },
172
+ chunkConfig () {
173
+ return {
174
+ action: `${this.prefixPath}zuul/api-file/workbench/file/temp/chunk/vue`,
175
+ headers: {
176
+ ...this.headers
177
+ },
178
+ minSize: 3 * this.byteConversion,
179
+ maxActive: 3,
180
+ maxRetries: 5,
181
+ startBody: {
182
+ override: true,
183
+ path: '/cw'
184
+ },
185
+ uploadBody: {
186
+ override: true,
187
+ path: '/cw'
188
+ },
189
+ finishBody: {
190
+ override: true,
191
+ path: '/cw'
192
+ }
193
+ }
194
+ },
195
+ isFileUploadSuccessed () {
196
+ return this.files.every(file => file.success)
197
+ },
198
+ isShowUploadContainer () {
199
+ if (this.multiple) {
200
+ if (this.isFileUploadSuccessed && this.buildedFiles.length >= this.maximum) {
201
+ return false
202
+ } else {
203
+ return true
204
+ }
205
+ } else {
206
+ const [file = {}] = this.buildedFiles
207
+ if (this.buildedFiles.length < 1) {
208
+ return true
209
+ }
210
+ if ((this.isFileUploadSuccessed && this.buildedFiles.length >= 1) || !file.response) {
211
+ return false
212
+ } else {
213
+ return true
214
+ }
215
+ }
216
+ },
217
+ getMaximum () {
218
+ return this.multiple ? this.maximum : 1
219
+ },
220
+ fileSizeLimit () {
221
+ return this.size * this.byteConversion
222
+ },
223
+ postAction () {
224
+ const ret = route.toQueryString(this.querys)
225
+ return `${this.prefixPath}${this.url}?${ret}`
226
+ },
227
+ uploadRef () {
228
+ return uuidv4()
229
+ },
230
+ fileSuffixIcon () {
231
+ return {
232
+ 'doc': { name: 'icon-doc' },
233
+ 'html': { name: 'icon-html' },
234
+ 'mp4': { name: 'icon-mp' },
235
+ 'pdf': { name: 'icon-pdf' },
236
+ 'ppt': { name: 'icon-ppt' },
237
+ 'psd': { name: 'icon-psd' },
238
+ 'rtf': { name: 'icon-rtf' },
239
+ 'txt': { name: 'icon-txt' },
240
+ 'vis': { name: 'icon-vis' },
241
+ 'xls': { name: 'icon-xls' },
242
+ 'xml': { name: 'icon-xml' },
243
+ 'zip': { name: 'icon-zip' },
244
+ 'jpg': { name: 'icon-img' },
245
+ 'mp3': { name: 'icon-mp1' },
246
+ }
247
+ },
248
+ fileIds () {
249
+ const fileIds = this.buildedFiles.map(file => {
250
+ return file.fileID
251
+ })
252
+ return this.multiple ? fileIds : fileIds[0]
253
+ },
254
+ fileResponseData () {
255
+ return this.multiple ? this.buildedFiles : this.buildedFiles[0]
256
+ }
257
+ },
258
+ methods: {
259
+ async fetchFileWithFileId () {
260
+ if (!this.value) return
261
+ await net.get(
262
+ `/api-file/file/${this.value}`
263
+ ).then(resp => {
264
+ const { data } = resp
265
+ this.buildedFiles = [data]
266
+ this.files = [data]
267
+ })
268
+ },
269
+ handleClickDownload (file) {
270
+ const { fileID: fileId } = file
271
+ window.open(`/api-file/workbench/file/stream/${fileId}?origin=true`)
272
+ },
273
+ handleClickDelete (file) {
274
+ this.$refs[this.uploadRef].remove(file)
275
+ const { fileID } = file
276
+ this.files = this.files.filter(file => file.fileID !== fileID)
277
+ this.buildedFiles = this.buildedFiles.filter(file => file.fileID !== fileID)
278
+ this.$emit('change', this.fileIds)
279
+ },
280
+ onWatchFiles (files) {
281
+ this.files = files
282
+ this.buildedFiles = this.files.map(file => {
283
+ return {
284
+ ...file.response.data,
285
+ ...file
286
+ }
287
+ })
288
+ if (this.isFileUploadSuccessed) {
289
+ this.$emit('change', this.fileIds)
290
+ this.$emit('on-success', this.fileResponseData)
291
+ }
292
+ },
293
+ async saveToServerAsyncPage (payloads = {}) {
294
+ net.post('zuul/api-file/workbench/file/temp/saveToServerAsyncPage', payloads, {
295
+ headers: {
296
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
297
+ }
298
+ }).then(resp =>{
299
+ const { data } = resp
300
+ if (data !== 'saveToServerAsyncPage') {
301
+ clearInterval(this.saveToServerAsyncPageTimer)
302
+ }
303
+ })
304
+ // const ret = await net.post({
305
+ // url: 'zuul/api-file/workbench/file/temp/saveToServerAsyncPage',
306
+ // method: 'POST',
307
+ // data: { ...payloads }
308
+ // }).then(resp => {
309
+ // const { data: { data, code, message } } = resp
310
+ // if (code !== '2000') {
311
+ // this.$Message.error(message)
312
+ // return
313
+ // }
314
+ // if (data !== 'saveToServerAsyncPage') {
315
+ // clearInterval(timer)
316
+ // const { fileID, size } = data
317
+ // this.$emit('on-success', { ...data, fileId: fileID })
318
+ // this.$Message.success('同步成功')
319
+ // return { fileId: fileID, size }
320
+ // }
321
+ // })
322
+ // return ret
323
+ },
324
+ onWatchInputFiles (newFile, oldFile) {
325
+ if (newFile && !oldFile) {
326
+ // add file
327
+ console.log('add', newFile)
328
+ }
329
+ if (newFile && oldFile) {
330
+ // update file
331
+ console.log('update', newFile)
332
+ const { success, active, chunk, response } = newFile
333
+ if (chunk && success && !active) {
334
+ console.log('chunk end')
335
+ const { data: { file, type } } = response
336
+ const payloads = {
337
+ filePath: file.match(/\/cw(.*)/) ? file.match(/\/cw(.*)/)[0] : void 0,
338
+ asyncID: uuidv4(),
339
+ isDeleteOrigin: false,
340
+ toImage: type === 'pdf' ? true : false,
341
+ unzip: type === 'zip' ? true : false,
342
+ _csrf: localStorage.getItem('token')
343
+ }
344
+ this.saveToServerAsyncPageTimer = setInterval(() => {
345
+ this.saveToServerAsyncPage(payloads)
346
+ }, 2000)
347
+ }
348
+ }
349
+ if (!newFile && oldFile) {
350
+ // delete file
351
+ console.log('delete')
352
+ }
353
+ if (Boolean(newFile) !== Boolean(oldFile) || oldFile.error !== newFile.error) {
354
+ if (!this.$refs[this.uploadRef].active) {
355
+ this.$refs[this.uploadRef].active = true
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ </script>
362
+
363
+ <style lang="scss" scoped>
364
+ ::v-deep .ele-upload__inner {
365
+ opacity: 1 !important;
366
+ cursor: pointer;
367
+ border: 1px dashed var(--idooel-form-title-border-color);
368
+ background: var(--idooel-form-upload-bg-color) !important;
369
+ &:hover {
370
+ border-color: var(--idooel-form-upload-border-hover-color);
371
+ }
372
+ border-radius: var(--idooel-form-border-radius);
373
+ }
374
+ .ele-upload__wrapper {
375
+ width: 100%;
376
+ .ele-upload__area {
377
+ padding: 16px;
378
+ width: 100%;
379
+ height: 80px;
380
+ display: flex;
381
+ flex-direction: row;
382
+ .ele-upload__area--icon {
383
+ color: var(--idooel-primary-color);
384
+ display: flex;
385
+ flex-direction: row;
386
+ align-items: center;
387
+ font-size: 16x;
388
+ .anticon-cloud-upload {
389
+ font-size: 48px;
390
+ color: var(--idooel-primary-color);
391
+ }
392
+ .anticon {
393
+ font-size: 48px;
394
+ color: var(--idooel-primary-color);
395
+ }
396
+ }
397
+ .ele-upload__area--text {
398
+ margin-left: 16px;
399
+ .ele-upload__message {
400
+ font-size: 16px;
401
+ color: var(--idoole-black-088);
402
+ text-align: left;
403
+ }
404
+ .ele-upload__ext {
405
+ text-align: left;
406
+ font-size: 14px;
407
+ color: var(--idoole-black-06);
408
+ }
409
+ }
410
+ }
411
+ .ele-files__wrapper {
412
+ .ele-file__item {
413
+ width: 100%;
414
+ margin-top: 8px;
415
+ padding: 8px 12px;
416
+ border-radius: var(--idooel-form-border-radius);
417
+ background: var(--idooel-form-upload-bg-color);
418
+ display: flex;
419
+ flex-direction: row;
420
+ align-items: center;
421
+ .ele-file__suffix--icon {}
422
+ .ele-file__name {
423
+ flex: 1;
424
+ text-align: left;
425
+ white-space: nowrap;
426
+ overflow: hidden;
427
+ font-size: 14px;
428
+ margin-left: 8px;
429
+ cursor: pointer;
430
+ .ele-file__inner {
431
+ overflow: hidden;
432
+ text-overflow: ellipsis;
433
+ }
434
+ }
435
+ .ele-file__delete {
436
+ margin-left: 8px;
437
+ .ele-file__delete--icon {
438
+ margin-left: 8px;
439
+ cursor: pointer;
440
+ }
441
+ }
442
+ }
443
+ }
444
+ }
445
445
  </style>