bri-components 1.4.91 → 1.4.93

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 (156) hide show
  1. package/README.md +83 -83
  2. package/lib/styles/bundle.css +12 -12
  3. package/lib/styles/font/fontello.svg +31 -31
  4. package/package.json +125 -125
  5. package/src/components/Error/Error403.vue +42 -42
  6. package/src/components/Error/Error404.vue +40 -40
  7. package/src/components/Error/Error500.vue +51 -51
  8. package/src/components/Error/error.less +162 -162
  9. package/src/components/Error/errorBack.vue +40 -40
  10. package/src/components/controls/DshControlInput.vue +195 -195
  11. package/src/components/controls/base/BriUpload/BriUpload.vue +434 -435
  12. package/src/components/controls/base/BriUpload/BriUploadImage.vue +373 -373
  13. package/src/components/controls/base/BriUpload/uploadList.vue +724 -724
  14. package/src/components/controls/base/BriUpload/uploadMixin.js +446 -417
  15. package/src/components/controls/base/DshCascader/DshCascader.vue +210 -210
  16. package/src/components/controls/base/DshCascader/components/cascaderModal.vue +366 -366
  17. package/src/components/controls/base/DshCascader/components/cascaderPicker.vue +416 -416
  18. package/src/components/controls/base/DshCascader/components/cascaderSimple.vue +143 -143
  19. package/src/components/controls/base/DshCoordinates.vue +577 -577
  20. package/src/components/controls/base/DshDate/DshDate.vue +191 -191
  21. package/src/components/controls/base/DshDate/DshDaterange.vue +186 -186
  22. package/src/components/controls/base/DshDivider.vue +201 -201
  23. package/src/components/controls/base/DshEditor.vue +274 -274
  24. package/src/components/controls/base/DshInput/BriInputs.vue +166 -166
  25. package/src/components/controls/base/DshInput/DshInput.vue +255 -255
  26. package/src/components/controls/base/DshNumber/BriInputNumber/BriInputNumber.vue +435 -435
  27. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/emitter.js +34 -34
  28. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/form.js +14 -14
  29. package/src/components/controls/base/DshNumber/BriInputNumber/utils/assist.js +322 -322
  30. package/src/components/controls/base/DshNumber/DshNumber.vue +143 -143
  31. package/src/components/controls/base/DshNumber/DshNumberange.vue +109 -109
  32. package/src/components/controls/base/DshSelect/DshCheckbox.vue +168 -168
  33. package/src/components/controls/base/DshSelect/DshSelect.vue +180 -180
  34. package/src/components/controls/base/DshSwitch/DshSwitch.vue +115 -115
  35. package/src/components/controls/control.less +324 -324
  36. package/src/components/controls/controlMap.js +114 -114
  37. package/src/components/controls/extra/DshColor.vue +81 -81
  38. package/src/components/controls/extra/themeColor.vue +104 -104
  39. package/src/components/controls/extra/themeIcon.vue +114 -114
  40. package/src/components/controls/mixins/cascaderMixin.js +295 -295
  41. package/src/components/controls/mixins/cascaderPickerMixin.js +216 -216
  42. package/src/components/controls/mixins/cascaderTableMixin.js +130 -130
  43. package/src/components/controls/mixins/controlMixin.js +368 -368
  44. package/src/components/controls/mixins/dateMixin.js +149 -147
  45. package/src/components/controls/mixins/flatTableMixin.js +111 -111
  46. package/src/components/controls/mixins/numberMixin.js +112 -112
  47. package/src/components/controls/mixins/selectMixin.js +233 -233
  48. package/src/components/controls/mixins/switchMixin.js +87 -87
  49. package/src/components/controls/mixins/userAndDepartMixin.js +218 -218
  50. package/src/components/controls/senior/DshLabels.vue +331 -331
  51. package/src/components/controls/senior/DshPackage.vue +57 -57
  52. package/src/components/controls/senior/cascaderTable.vue +210 -210
  53. package/src/components/controls/senior/flatTable.vue +135 -135
  54. package/src/components/controls/senior/selectDepartments.vue +438 -438
  55. package/src/components/controls/senior/selectUsers/departMenu.vue +293 -293
  56. package/src/components/controls/senior/selectUsers/selectUsers.vue +752 -752
  57. package/src/components/controls/special/DshBack.vue +42 -42
  58. package/src/components/controls/special/DshUndeveloped.vue +41 -41
  59. package/src/components/form/DshAdvSearch.vue +510 -510
  60. package/src/components/form/DshDefaultSearch.vue +258 -258
  61. package/src/components/form/DshForm.vue +494 -494
  62. package/src/components/form/searchMixin.js +375 -375
  63. package/src/components/list/BriCard.vue +95 -95
  64. package/src/components/list/BriTable.vue +205 -205
  65. package/src/components/list/BriTree.vue +529 -529
  66. package/src/components/list/BriTreeItem.vue +163 -163
  67. package/src/components/list/DshBox/DshBox.vue +219 -219
  68. package/src/components/list/DshBox/DshCard.vue +446 -446
  69. package/src/components/list/DshBox/DshCrossTable.vue +827 -827
  70. package/src/components/list/DshBox/DshList.vue +404 -404
  71. package/src/components/list/DshBox/DshPanel.vue +669 -669
  72. package/src/components/list/DshBox/DshSingleData.vue +119 -119
  73. package/src/components/list/DshBox/DshTable.vue +239 -239
  74. package/src/components/list/DshCascaderTable.vue +115 -115
  75. package/src/components/list/DshFlatTable.vue +339 -339
  76. package/src/components/list/DshPage.vue +194 -194
  77. package/src/components/list/DshTreeTable.vue +113 -113
  78. package/src/components/list/common/importModal.vue +243 -243
  79. package/src/components/list/common/quoteListModal.vue +206 -206
  80. package/src/components/list/mixins/DshCascaderTableMixin.js +278 -278
  81. package/src/components/list/mixins/DshFlatTableMixin.js +493 -493
  82. package/src/components/list/mixins/DshTreeTableMixin.js +286 -286
  83. package/src/components/list/mixins/tableBaseMixin.js +1661 -1662
  84. package/src/components/list/mixins/treeTableBaseMixin.js +149 -149
  85. package/src/components/other/BriAvatar.vue +166 -166
  86. package/src/components/other/BriCode.vue +125 -125
  87. package/src/components/other/BriCollapseTree.vue +207 -207
  88. package/src/components/other/BriGantt.vue +1084 -1084
  89. package/src/components/other/BriIframe.vue +116 -116
  90. package/src/components/other/BriLoading.vue +171 -171
  91. package/src/components/other/BriSvg.vue +28 -28
  92. package/src/components/other/DshColorPanel.vue +128 -128
  93. package/src/components/other/DshMenuNav.vue +188 -188
  94. package/src/components/small/BriButton.vue +71 -71
  95. package/src/components/small/BriDrawer.vue +169 -169
  96. package/src/components/small/BriTooltip.vue +87 -87
  97. package/src/components/small/DshBtnModal.vue +68 -68
  98. package/src/components/small/DshButtons.vue +324 -324
  99. package/src/components/small/DshDropdown.vue +225 -225
  100. package/src/components/small/DshIcons.vue +59 -59
  101. package/src/components/small/DshListRender.js +21 -21
  102. package/src/components/small/DshModal.vue +160 -160
  103. package/src/components/small/DshSteps.vue +141 -141
  104. package/src/components/small/DshTabs.vue +598 -598
  105. package/src/components/small/DshTabsSet.vue +309 -309
  106. package/src/components/small/DshTags.vue +251 -251
  107. package/src/components/small/DshTitle.vue +50 -50
  108. package/src/components/small/render.js +20 -20
  109. package/src/components/unit/DshFormUnit.vue +398 -398
  110. package/src/components/unit/DshListUnit.vue +115 -107
  111. package/src/components/unit/unitMixin.js +86 -86
  112. package/src/data/index.js +9 -9
  113. package/src/index.js +271 -271
  114. package/src/styles/bundle.css +12 -12
  115. package/src/styles/components/BriButton.less +292 -292
  116. package/src/styles/components/BriTable.less +344 -344
  117. package/src/styles/components/DshModal.less +250 -250
  118. package/src/styles/components/index.less +3 -3
  119. package/src/styles/global/animate.less +11 -11
  120. package/src/styles/global/base.less +45 -45
  121. package/src/styles/global/box.less +186 -186
  122. package/src/styles/global/control.less +122 -122
  123. package/src/styles/global/flex.less +282 -282
  124. package/src/styles/global/global.less +8 -8
  125. package/src/styles/global/text.less +59 -59
  126. package/src/styles/global/variables.less +85 -85
  127. package/src/styles/iconfont/iconfont.css +254 -254
  128. package/src/styles/iconfont/iconfont.json +422 -422
  129. package/src/styles/iconfont/iconfont.svg +137 -137
  130. package/src/styles/index.less +11 -11
  131. package/src/styles/reset-easytable.less +21 -21
  132. package/src/styles/reset-iview-controls.less +145 -145
  133. package/src/styles/reset-iview-other.less +49 -49
  134. package/src/styles/reset-iview-variables.less +34 -34
  135. package/src/styles/reset.less +45 -45
  136. package/src/utils/index.js +5 -5
  137. package/src/utils/table.js +175 -175
  138. package/lib/0.bri-components.min.js +0 -1
  139. package/lib/1.bri-components.min.js +0 -1
  140. package/lib/10.bri-components.min.js +0 -1
  141. package/lib/11.bri-components.min.js +0 -1
  142. package/lib/2.bri-components.min.js +0 -1
  143. package/lib/3.bri-components.min.js +0 -1
  144. package/lib/4.bri-components.min.js +0 -1
  145. package/lib/5.bri-components.min.js +0 -1
  146. package/lib/6.bri-components.min.js +0 -1
  147. package/lib/7.bri-components.min.js +0 -1
  148. package/lib/8.bri-components.min.js +0 -1
  149. package/lib/9.bri-components.min.js +0 -1
  150. package/lib/bri-components.min.js +0 -18
  151. package/src/.DS_Store +0 -0
  152. package/src/components/.DS_Store +0 -0
  153. package/src/components/controls/.DS_Store +0 -0
  154. package/src/components/controls/senior/.DS_Store +0 -0
  155. package/src/styles/.DS_Store +0 -0
  156. package/src/styles/components/.DS_Store +0 -0
@@ -1,724 +1,724 @@
1
- <template>
2
- <div :class="{
3
- uploadList: true,
4
- [`uploadList-${showMode}`]: true,
5
- [`uploadList-${subType}`]: true
6
- }">
7
- <!-- 普通文本模式 -->
8
- <template v-if="showMode ==='old'">
9
- <!-- 有值 -->
10
- <div
11
- v-if="files.length"
12
- ref="viewerImage"
13
- :class="{
14
- 'uploadList-list': true,
15
- [`uploadList-list-${subType}`]: true
16
- }"
17
- >
18
- <div
19
- v-for="(fileItem, fileIndex) in files"
20
- :key="fileItem._key || fileItem._id"
21
- :class="{
22
- 'item': subType === 'image',
23
- [`item-${subType}`]: true
24
- }"
25
- >
26
- <!-- 展示图 -->
27
- <div class="item-show">
28
- <img
29
- v-if="fileItem.mimetype.includes('image')"
30
- :data-original="fileItem.url"
31
- :src="$imageResize(fileItem.url, imageResizeConfig)"
32
- :alt="fileItem.name"
33
- >
34
- <img
35
- v-else
36
- :src="getFileImage(fileItem)"
37
- :alt="fileItem.name"
38
- >
39
- </div>
40
-
41
- <!-- 展示名称 -->
42
- <p class="item-name-title">{{ fileItem.name }}</p>
43
-
44
- <!-- 图标 -->
45
- <dsh-icons
46
- class="item-action"
47
- item-class="item-action-icon"
48
- :list="$getOperationList(getBtns(fileItem))"
49
- @click="$dispatchEvent($event, fileItem, fileIndex)"
50
- ></dsh-icons>
51
- </div>
52
- </div>
53
-
54
- <!-- 无值 -->
55
- <div
56
- v-else
57
- class="uploadList-nodata"
58
- >
59
- <span>{{ emptyShowVal }}</span>
60
- </div>
61
- </template>
62
-
63
- <!-- 在表格中展开 -->
64
- <template v-else-if="showMode ==='tableList'">
65
- <!-- 有值 -->
66
- <div
67
- v-if="files.length"
68
- ref="viewerImage"
69
- :class="[
70
- 'uploadList-list',
71
- `uploadList-list-${subType}`
72
- ]"
73
- >
74
- <div
75
- v-for="(fileItem, fileIndex) in files"
76
- :key="fileItem._key || fileItem._id"
77
- :class="{
78
- 'item': subType === 'image',
79
- [`item-${subType}`]: true
80
- }"
81
- >
82
- <!-- 展示图 -->
83
- <div class="item-show">
84
- <img
85
- v-if="fileItem.mimetype.includes('image')"
86
- :data-original="fileItem.url"
87
- :src="$imageResize(fileItem.url, imageResizeConfig)"
88
- :alt="fileItem.name"
89
- >
90
- <img
91
- v-else
92
- :src="getFileImage(fileItem)"
93
- :alt="fileItem.name"
94
- >
95
- </div>
96
-
97
- <!-- 展示名称 -->
98
- <p class="item-name-title">{{ fileItem.name }}</p>
99
-
100
- <!-- 图标 -->
101
- <dsh-icons
102
- class="item-action"
103
- item-class="item-action-icon"
104
- :list="$getOperationList(getBtns(fileItem))"
105
- @click="$dispatchEvent($event, fileItem, fileIndex)"
106
- ></dsh-icons>
107
- </div>
108
- </div>
109
-
110
- <!-- 无值 -->
111
- <div
112
- v-else
113
- class="uploadList-inline-nodata"
114
- >
115
- <span>{{ emptyShowVal }}</span>
116
- </div>
117
- </template>
118
-
119
- <!-- 新展示方式 -->
120
- <template v-else>
121
- <!-- 文件类型 -->
122
- <div
123
- v-if="subType === 'file'"
124
- ref="viewerImage"
125
- >
126
- <!-- 有值 -->
127
- <template v-if="files.length">
128
- <dsh-dropdown
129
- :list="files"
130
- trigger="hover"
131
- class="uploadList-fileList"
132
- >
133
- <div :class="{
134
- 'uploadList-fileList-fileName': true,
135
- 'uploadList-fileList-fileName-edit': canEdit
136
- }">
137
- {{ files.length }}个
138
- <Icon
139
- v-if="canEdit"
140
- type="ios-arrow-down"
141
- />
142
- </div>
143
-
144
- <div
145
- slot="dropdownItem"
146
- slot-scope="{ dropdownItem, dropdownIndex }"
147
- class="uploadList-fileList-fileItem"
148
- >
149
- <img
150
- v-if="dropdownItem.mimetype.includes('image')"
151
- :data-original="dropdownItem.url"
152
- :src="$imageResize(dropdownItem.url, imageResizeConfig)"
153
- :alt="dropdownItem.name"
154
- class="fileItem-img"
155
- >
156
- <img
157
- v-else
158
- :src="getFileImage(dropdownItem)"
159
- :alt="dropdownItem.name"
160
- class="fileItem-img"
161
- >
162
-
163
- <p class="fileItem-name-title">{{ dropdownItem.name }}</p>
164
-
165
- <dsh-icons
166
- class="fileItem-action"
167
- item-class="fileItem-action-icon"
168
- :list="$getOperationList(getBtns(dropdownItem))"
169
- @click="$dispatchEvent($event, dropdownItem, dropdownIndex)"
170
- ></dsh-icons>
171
- </div>
172
- </dsh-dropdown>
173
-
174
- <div
175
- v-for="(fileItem) in files"
176
- :key="fileItem._key || fileItem._id"
177
- :class="{
178
- 'item': subType === 'image',
179
- [`item-${subType}`]: true
180
- }"
181
- >
182
- <img
183
- v-if="fileItem.mimetype.includes('image')"
184
- :data-original="fileItem.url"
185
- :src="$imageResize(fileItem.url, imageResizeConfig)"
186
- :alt="fileItem.name"
187
- style="display: none;"
188
- >
189
- </div>
190
- </template>
191
-
192
- <!-- 无值 -->
193
- <span
194
- v-else
195
- class="uploadList-inline-nodata"
196
- >
197
- {{ emptyShowVal }}
198
- </span>
199
- </div>
200
-
201
- <!-- 图片类型 -->
202
- <template v-else>
203
- <!-- 有值 -->
204
- <div
205
- v-if="files.length"
206
- ref="viewerImage"
207
- class="uploadList-inline-list"
208
- >
209
- <div
210
- v-for="(fileItem, fileIndex) in files"
211
- :key="fileItem.url"
212
- class="item"
213
- >
214
- <img
215
- v-if="fileItem.mimetype.includes('image')"
216
- :data-original="fileItem.url"
217
- :src="$imageResize(fileItem.url, imageResizeConfig)"
218
- :alt="fileItem.name"
219
- >
220
- <img
221
- v-else
222
- :src="getFileImage(fileItem)"
223
- :alt="fileItem.name"
224
- >
225
-
226
- <dsh-icons
227
- class="item-action"
228
- item-class="item-action-icon"
229
- :list="$getOperationList(getBtns(fileItem))"
230
- @click="$dispatchEvent($event, fileItem, fileIndex)"
231
- ></dsh-icons>
232
- </div>
233
- </div>
234
-
235
- <!-- 无值 -->
236
- <span
237
- v-else
238
- class="uploadList-inline-nodata"
239
- >
240
- {{ emptyShowVal }}
241
- </span>
242
- </template>
243
- </template>
244
- </div>
245
- </template>
246
-
247
- <script>
248
- import Viewer from "viewerjs";
249
- import axios from "axios";
250
-
251
- export default {
252
- name: "uploadList",
253
- props: {
254
- showMode: {
255
- type: String,
256
- default: "old" // inline, old, normal
257
- },
258
- canEdit: {
259
- type: Boolean,
260
- default: true
261
- },
262
- files: {
263
- type: Array,
264
- default () {
265
- return [];
266
- }
267
- },
268
- propsObj: {
269
- type: Object,
270
- default () {
271
- return {};
272
- }
273
- },
274
- isShowEditIcon: Boolean,
275
- emptyShowVal: String
276
- },
277
- data () {
278
- return {
279
- imageResizeConfig: {}
280
- };
281
- },
282
- computed: {
283
- subType () {
284
- return this.propsObj._fileType;
285
- },
286
-
287
- allOperationMap () {
288
- return {
289
- canDelete: {
290
- name: "删除",
291
- type: "canDelete",
292
- customIcon: "bico-shanchu",
293
- size: "14",
294
- event: "clickDeleteItem"
295
- },
296
- canEdit: {
297
- name: "编辑",
298
- type: "canEdit",
299
- customIcon: "bico-bianji",
300
- size: "14",
301
- event: "clickEdit"
302
- },
303
- canDownload: {
304
- name: "下载",
305
- type: "canDownload",
306
- customIcon: "bico-xiazai1",
307
- size: "14",
308
- event: "handleDownload"
309
- },
310
- canPreview: {
311
- name: "预览",
312
- type: "canPreview",
313
- customIcon: "bico-yulan",
314
- size: "16",
315
- event: "clickPreview"
316
- }
317
- };
318
- },
319
- operationMap () {
320
- return this.canEdit
321
- ? this.$categoryMapToMap(
322
- this.allOperationMap,
323
- undefined,
324
- this.isShowEditIcon ? [] : ["canEdit"]
325
- )
326
- : this.$categoryMapToMap(
327
- this.allOperationMap,
328
- undefined,
329
- ["canDelete", "canEdit"]
330
- );
331
- }
332
- },
333
- methods: {
334
- // 点击删除某项
335
- clickDeleteItem (operationItem, fileItem, fileIndex) {
336
- this.$emit("deleteItem", fileItem, fileIndex);
337
- },
338
- // 点击文件预览 -file服务器的数据列表
339
- clickPreview (operationItem, fileItem, fileIndex) {
340
- if (fileItem.mimetype.includes("image")) {
341
- const viewerImage = this.$refs.viewerImage;
342
- const findIndex = this.files
343
- .filter(valItem => valItem.mimetype.includes("image"))
344
- .findIndex(valItem => valItem.url === fileItem.url);
345
-
346
- const viewer = new Viewer(viewerImage, {
347
- url: "data-original",
348
- hidden: function () {
349
- viewer.destroy();
350
- },
351
- loop: false,
352
- initialViewIndex: findIndex,
353
- zIndex: 2147483647
354
- });
355
- viewer.show();
356
- } else {
357
- window.open(fileItem.url);
358
- }
359
- },
360
- // 点击文件编辑
361
- clickEdit (operationItem, fileItem) {
362
- let fileName = fileItem.name;
363
- const lastIndex = fileName.lastIndexOf(".");
364
- const formate = fileName.substring(lastIndex);
365
- fileName = fileName.substring(0, lastIndex);
366
-
367
- this.$Modal.confirm({
368
- title: "修改名称",
369
- render: (h) => {
370
- // // 第二种方式
371
- // const lastIndex = fileName.lastIndexOf(".");
372
- // const formate = fileName.substring(lastIndex);
373
-
374
- return h("Input", {
375
- props: {
376
- // value: fileItem.name.substring(0, lastIndex),
377
- value: fileName,
378
- autofocus: true,
379
- placeholder: "请输入名称"
380
- },
381
- scopedSlots: {
382
- append: formate
383
- },
384
- on: {
385
- input: (val) => {
386
- // fileItem.name = val + formate;
387
- fileName = val;
388
- }
389
- }
390
- });
391
- },
392
- onOk: () => {
393
- fileItem.name = fileName + formate;
394
- this.$emit("editItemName", fileItem);
395
- },
396
- onCancel: () => {}
397
- });
398
- },
399
- // 接口 -下载
400
- handleDownload (operationItem, fileItem, fileIndex) {
401
- axios
402
- .get(fileItem.downloadUrl, {
403
- responseType: "blob"
404
- })
405
- .then((res) => {
406
- if (window.navigator.msSaveOrOpenBlob) {
407
- // 兼容IE10
408
- navigator.msSaveBlob(res, fileItem.name);
409
- } else {
410
- const href = URL.createObjectURL(res.data); // 创建新的URL表示指定的blob对象
411
- const a = document.createElement("a");
412
- a.style.display = "none";
413
- a.href = href; // 指定下载链接
414
- a.download = fileItem.name; // 指定下载文件名
415
- a.click();
416
- URL.revokeObjectURL(a.href); // 释放URL对象
417
- a.remove();
418
- }
419
- });
420
- },
421
- // 获取不同类型文件的图片
422
- getFileImage (fileItem) {
423
- if (!fileItem.mimetype) {
424
- return this.$imageSrcMap.fileType.other;
425
- } else if (fileItem.mimetype.includes("image")) {
426
- return fileItem.url; // 压缩图片:将图片最长的边限制在100像素,短边按比例处理
427
- } else if (fileItem.mimetype.includes("text/plain")) {
428
- return this.$imageSrcMap.fileType.text;
429
- } else if (fileItem.mimetype.includes("application/pdf")) {
430
- return this.$imageSrcMap.fileType.pdf;
431
- } else if (fileItem.mimetype.includes("wordprocessingml.document") || fileItem.mimetype.includes("application/msword")) {
432
- return this.$imageSrcMap.fileType.doc;
433
- } else if (fileItem.mimetype.includes("presentationml.presentation") || fileItem.mimetype.includes("application/vnd.ms-powerpoint")) {
434
- return this.$imageSrcMap.fileType.ppt;
435
- } else if (fileItem.mimetype.includes("spreadsheetml.sheet")) {
436
- return this.$imageSrcMap.fileType.excel;
437
- } else if (fileItem.mimetype.includes("application/x-zip-compressed")) {
438
- return this.$imageSrcMap.fileType.zip;
439
- } else if (fileItem.mimetype.includes("application/x-rar-compressed")) {
440
- return this.$imageSrcMap.fileType.rar;
441
- } else {
442
- return this.$imageSrcMap.fileType.other;
443
- }
444
- },
445
- getBtns (fileItem) {
446
- if (["image", "application/pdf", "text/plain"].some(type => fileItem.mimetype.includes(type)) ||
447
- fileItem.mimetype.includes("wordprocessingml.document") ||
448
- fileItem.mimetype.includes("application/msword") ||
449
- fileItem.mimetype.includes("presentationml.presentation") ||
450
- fileItem.mimetype.includes("application/vnd.ms-powerpoint") ||
451
- fileItem.mimetype.includes("spreadsheetml.sheet"))
452
- {
453
- return undefined;
454
- }
455
- else {
456
- ["canDelete", "canEdit", "canDownload"];
457
- }
458
- }
459
- }
460
- };
461
- </script>
462
-
463
- <style lang="less">
464
- .uploadList {
465
- width: 100%;
466
- overflow: auto;
467
-
468
- // 普通文件
469
- &-old {
470
- margin: 16px;
471
- }
472
-
473
- &-nodata {
474
- width: 100%;
475
- height: 100%;
476
- text-align: center;
477
- line-height: 120px;
478
- color: @placeholderColor;
479
- white-space: nowrap;
480
-
481
- span {
482
- margin-left: 5px;
483
- }
484
- }
485
-
486
- &-list {
487
- display: flex;
488
- flex-wrap: nowrap;
489
-
490
- .item {
491
- flex: 0 0 120px;
492
- height: 120px;
493
- margin-right: 10px;
494
- border-radius: @borderRadius;
495
- background: #f4f5fa;
496
- text-align: center;
497
- overflow: hidden;
498
- display: inline-flex;
499
- flex-direction: column;
500
- justify-content: space-between;
501
- position: relative;
502
-
503
- &:hover {
504
- .item-action {
505
- display: flex !important;
506
- }
507
- }
508
-
509
- &-show {
510
- display: flex;
511
- overflow: hidden;
512
- align-items: center;
513
- justify-content: center;
514
- flex: 2;
515
- min-height: 50px;
516
-
517
- img {
518
- max-width: 100%;
519
- max-height: 100%;
520
- }
521
- }
522
-
523
- &-name {
524
- flex: 1;
525
- display: flex;
526
- max-height: 32px;
527
-
528
- &-title {
529
- padding: 0 8px;
530
- overflow: hidden;
531
- text-overflow: ellipsis;
532
- white-space: nowrap;
533
- color: @themeColor;
534
- }
535
- }
536
-
537
- &-action {
538
- position: absolute;
539
- right: 0px;
540
- top: 0px;
541
- left: 0px;
542
- bottom: 0px;
543
- background-color: @placeholderColor;
544
- display: none !important;
545
- align-items: center;
546
- justify-content: center;
547
-
548
- &-icon {
549
- width: 22px;
550
- height: 22px;
551
- line-height: 22px;
552
- color: #fff;
553
- }
554
- }
555
- }
556
-
557
- // file 模式
558
- &-file {
559
- flex-direction: column;
560
- .item-file {
561
- flex: 0 0 100%;
562
- height: auto;
563
- display: flex;
564
- flex-direction: row;
565
- justify-content: space-between;
566
- align-items: center;
567
- border-radius: 0px;
568
- margin: 0px;
569
- padding: 2px 0;
570
- background: transparent;
571
- &:hover {
572
- background: #f4f5fa;
573
- }
574
- .item-show {
575
- flex: 0 0 22px;
576
- min-height: 20px;
577
- img {
578
- width: 22px;
579
- height: 22px;
580
- }
581
- }
582
- .item-name-title {
583
- color: @textColor;
584
- flex: 1;
585
- text-align: left;
586
- }
587
- .item-action {
588
- position: static;
589
- display: flex !important;
590
- background: transparent;
591
- white-space: nowrap;
592
- &-icon {
593
- color: @contentColor;
594
- width: 16px;
595
- }
596
- }
597
- }
598
- }
599
- }
600
-
601
- &-inline {
602
- height: 32px;
603
- line-height: 32px;
604
-
605
- &-list {
606
- width: 100%;
607
- height: 100%;
608
- padding-left: 3px;
609
- display: flex;
610
- flex-wrap: nowrap;
611
- overflow-x: auto;
612
- overflow-y: hidden;
613
-
614
- .item {
615
- flex: 0 0 32px;
616
- margin-right: 3px;
617
- border-radius: @borderRadius;
618
- background: #f4f5fa;
619
- text-align: center;
620
- position: relative;
621
-
622
- img {
623
- max-width: 100%;
624
- max-height: 100%;
625
- margin: auto;
626
- }
627
-
628
- &-action {
629
- position: absolute;
630
- left: 0;
631
- right: 0;
632
- top: 0;
633
- bottom: 0;
634
- display: none !important;
635
- background-color: @placeholderColor;
636
- color: #fff;
637
- align-items: center;
638
- justify-content: center;
639
- flex-wrap: wrap;
640
-
641
- &-icon {
642
- width: 16px;
643
- height: 16px;
644
- font-size: 16px !important;
645
- margin: 0px;
646
- }
647
- }
648
-
649
- @keyframes toTop {
650
- from {
651
- top: 100%;
652
- }
653
-
654
- to {
655
- top: 0;
656
- }
657
- }
658
-
659
- &:hover {
660
- .item-action {
661
- display: flex !important;
662
- animation: toTop 0.1s;
663
- }
664
- }
665
- }
666
- }
667
-
668
- &-nodata {
669
- padding-left: 7px;
670
- line-height: 32px;
671
- color: @placeholderColor;
672
- }
673
- }
674
-
675
- &-fileList {
676
- width: 100%;
677
- &-fileName {
678
- width: 100%;
679
- height: 100%;
680
- cursor: pointer;
681
- display: flex;
682
- justify-content: space-between;
683
- align-items: center;
684
-
685
- &-edit {
686
- padding: 0 8px;
687
- }
688
- }
689
- }
690
- }
691
-
692
- .DshDropdown {
693
- .uploadList-fileList-fileItem {
694
- width: 100%;
695
- display: flex;
696
- justify-content: space-between;
697
- align-items: center;
698
- .fileItem {
699
- &-img {
700
- width: 22px;
701
- height: 22px;
702
- }
703
- &-name-title {
704
- white-space: nowrap;
705
- overflow: hidden;
706
- text-overflow: ellipsis;
707
- margin: 0 8px;
708
- flex: 1;
709
- text-align: left;
710
- }
711
- &-action {
712
- display: flex;
713
- align-items: center;
714
- justify-content: flex-end;
715
- &-icon {
716
- width: 16px;
717
- color: @contentColor;
718
- }
719
- }
720
- }
721
-
722
- }
723
- }
724
- </style>
1
+ <template>
2
+ <div :class="{
3
+ uploadList: true,
4
+ [`uploadList-${showMode}`]: true,
5
+ [`uploadList-${subType}`]: true
6
+ }">
7
+ <!-- 普通文本模式 -->
8
+ <template v-if="showMode ==='old'">
9
+ <!-- 有值 -->
10
+ <div
11
+ v-if="files.length"
12
+ ref="viewerImage"
13
+ :class="{
14
+ 'uploadList-list': true,
15
+ [`uploadList-list-${subType}`]: true
16
+ }"
17
+ >
18
+ <div
19
+ v-for="(fileItem, fileIndex) in files"
20
+ :key="fileItem._key || fileItem._id"
21
+ :class="{
22
+ 'item': subType === 'image',
23
+ [`item-${subType}`]: true
24
+ }"
25
+ >
26
+ <!-- 展示图 -->
27
+ <div class="item-show">
28
+ <img
29
+ v-if="fileItem.mimetype.includes('image')"
30
+ :data-original="fileItem.url"
31
+ :src="$imageResize(fileItem.url, imageResizeConfig)"
32
+ :alt="fileItem.name"
33
+ >
34
+ <img
35
+ v-else
36
+ :src="getFileImage(fileItem)"
37
+ :alt="fileItem.name"
38
+ >
39
+ </div>
40
+
41
+ <!-- 展示名称 -->
42
+ <p class="item-name-title">{{ fileItem.name }}</p>
43
+
44
+ <!-- 图标 -->
45
+ <dsh-icons
46
+ class="item-action"
47
+ item-class="item-action-icon"
48
+ :list="$getOperationList(getBtns(fileItem))"
49
+ @click="$dispatchEvent($event, fileItem, fileIndex)"
50
+ ></dsh-icons>
51
+ </div>
52
+ </div>
53
+
54
+ <!-- 无值 -->
55
+ <div
56
+ v-else
57
+ class="uploadList-nodata"
58
+ >
59
+ <span>{{ emptyShowVal }}</span>
60
+ </div>
61
+ </template>
62
+
63
+ <!-- 在表格中展开 -->
64
+ <template v-else-if="showMode ==='tableList'">
65
+ <!-- 有值 -->
66
+ <div
67
+ v-if="files.length"
68
+ ref="viewerImage"
69
+ :class="[
70
+ 'uploadList-list',
71
+ `uploadList-list-${subType}`
72
+ ]"
73
+ >
74
+ <div
75
+ v-for="(fileItem, fileIndex) in files"
76
+ :key="fileItem._key || fileItem._id"
77
+ :class="{
78
+ 'item': subType === 'image',
79
+ [`item-${subType}`]: true
80
+ }"
81
+ >
82
+ <!-- 展示图 -->
83
+ <div class="item-show">
84
+ <img
85
+ v-if="fileItem.mimetype.includes('image')"
86
+ :data-original="fileItem.url"
87
+ :src="$imageResize(fileItem.url, imageResizeConfig)"
88
+ :alt="fileItem.name"
89
+ >
90
+ <img
91
+ v-else
92
+ :src="getFileImage(fileItem)"
93
+ :alt="fileItem.name"
94
+ >
95
+ </div>
96
+
97
+ <!-- 展示名称 -->
98
+ <p class="item-name-title">{{ fileItem.name }}</p>
99
+
100
+ <!-- 图标 -->
101
+ <dsh-icons
102
+ class="item-action"
103
+ item-class="item-action-icon"
104
+ :list="$getOperationList(getBtns(fileItem))"
105
+ @click="$dispatchEvent($event, fileItem, fileIndex)"
106
+ ></dsh-icons>
107
+ </div>
108
+ </div>
109
+
110
+ <!-- 无值 -->
111
+ <div
112
+ v-else
113
+ class="uploadList-inline-nodata"
114
+ >
115
+ <span>{{ emptyShowVal }}</span>
116
+ </div>
117
+ </template>
118
+
119
+ <!-- 新展示方式 -->
120
+ <template v-else>
121
+ <!-- 文件类型 -->
122
+ <div
123
+ v-if="subType === 'file'"
124
+ ref="viewerImage"
125
+ >
126
+ <!-- 有值 -->
127
+ <template v-if="files.length">
128
+ <dsh-dropdown
129
+ :list="files"
130
+ trigger="hover"
131
+ class="uploadList-fileList"
132
+ >
133
+ <div :class="{
134
+ 'uploadList-fileList-fileName': true,
135
+ 'uploadList-fileList-fileName-edit': canEdit
136
+ }">
137
+ {{ files.length }}个
138
+ <Icon
139
+ v-if="canEdit"
140
+ type="ios-arrow-down"
141
+ />
142
+ </div>
143
+
144
+ <div
145
+ slot="dropdownItem"
146
+ slot-scope="{ dropdownItem, dropdownIndex }"
147
+ class="uploadList-fileList-fileItem"
148
+ >
149
+ <img
150
+ v-if="dropdownItem.mimetype.includes('image')"
151
+ :data-original="dropdownItem.url"
152
+ :src="$imageResize(dropdownItem.url, imageResizeConfig)"
153
+ :alt="dropdownItem.name"
154
+ class="fileItem-img"
155
+ >
156
+ <img
157
+ v-else
158
+ :src="getFileImage(dropdownItem)"
159
+ :alt="dropdownItem.name"
160
+ class="fileItem-img"
161
+ >
162
+
163
+ <p class="fileItem-name-title">{{ dropdownItem.name }}</p>
164
+
165
+ <dsh-icons
166
+ class="fileItem-action"
167
+ item-class="fileItem-action-icon"
168
+ :list="$getOperationList(getBtns(dropdownItem))"
169
+ @click="$dispatchEvent($event, dropdownItem, dropdownIndex)"
170
+ ></dsh-icons>
171
+ </div>
172
+ </dsh-dropdown>
173
+
174
+ <div
175
+ v-for="(fileItem) in files"
176
+ :key="fileItem._key || fileItem._id"
177
+ :class="{
178
+ 'item': subType === 'image',
179
+ [`item-${subType}`]: true
180
+ }"
181
+ >
182
+ <img
183
+ v-if="fileItem.mimetype.includes('image')"
184
+ :data-original="fileItem.url"
185
+ :src="$imageResize(fileItem.url, imageResizeConfig)"
186
+ :alt="fileItem.name"
187
+ style="display: none;"
188
+ >
189
+ </div>
190
+ </template>
191
+
192
+ <!-- 无值 -->
193
+ <span
194
+ v-else
195
+ class="uploadList-inline-nodata"
196
+ >
197
+ {{ emptyShowVal }}
198
+ </span>
199
+ </div>
200
+
201
+ <!-- 图片类型 -->
202
+ <template v-else>
203
+ <!-- 有值 -->
204
+ <div
205
+ v-if="files.length"
206
+ ref="viewerImage"
207
+ class="uploadList-inline-list"
208
+ >
209
+ <div
210
+ v-for="(fileItem, fileIndex) in files"
211
+ :key="fileItem.url"
212
+ class="item"
213
+ >
214
+ <img
215
+ v-if="fileItem.mimetype.includes('image')"
216
+ :data-original="fileItem.url"
217
+ :src="$imageResize(fileItem.url, imageResizeConfig)"
218
+ :alt="fileItem.name"
219
+ >
220
+ <img
221
+ v-else
222
+ :src="getFileImage(fileItem)"
223
+ :alt="fileItem.name"
224
+ >
225
+
226
+ <dsh-icons
227
+ class="item-action"
228
+ item-class="item-action-icon"
229
+ :list="$getOperationList(getBtns(fileItem))"
230
+ @click="$dispatchEvent($event, fileItem, fileIndex)"
231
+ ></dsh-icons>
232
+ </div>
233
+ </div>
234
+
235
+ <!-- 无值 -->
236
+ <span
237
+ v-else
238
+ class="uploadList-inline-nodata"
239
+ >
240
+ {{ emptyShowVal }}
241
+ </span>
242
+ </template>
243
+ </template>
244
+ </div>
245
+ </template>
246
+
247
+ <script>
248
+ import Viewer from "viewerjs";
249
+ import axios from "axios";
250
+
251
+ export default {
252
+ name: "uploadList",
253
+ props: {
254
+ showMode: {
255
+ type: String,
256
+ default: "old" // inline, old, normal
257
+ },
258
+ canEdit: {
259
+ type: Boolean,
260
+ default: true
261
+ },
262
+ files: {
263
+ type: Array,
264
+ default () {
265
+ return [];
266
+ }
267
+ },
268
+ propsObj: {
269
+ type: Object,
270
+ default () {
271
+ return {};
272
+ }
273
+ },
274
+ isShowEditIcon: Boolean,
275
+ emptyShowVal: String
276
+ },
277
+ data () {
278
+ return {
279
+ imageResizeConfig: {}
280
+ };
281
+ },
282
+ computed: {
283
+ subType () {
284
+ return this.propsObj._fileType;
285
+ },
286
+
287
+ allOperationMap () {
288
+ return {
289
+ canDelete: {
290
+ name: "删除",
291
+ type: "canDelete",
292
+ customIcon: "bico-shanchu",
293
+ size: "14",
294
+ event: "clickDeleteItem"
295
+ },
296
+ canEdit: {
297
+ name: "编辑",
298
+ type: "canEdit",
299
+ customIcon: "bico-bianji",
300
+ size: "14",
301
+ event: "clickEdit"
302
+ },
303
+ canDownload: {
304
+ name: "下载",
305
+ type: "canDownload",
306
+ customIcon: "bico-xiazai1",
307
+ size: "14",
308
+ event: "handleDownload"
309
+ },
310
+ canPreview: {
311
+ name: "预览",
312
+ type: "canPreview",
313
+ customIcon: "bico-yulan",
314
+ size: "16",
315
+ event: "clickPreview"
316
+ }
317
+ };
318
+ },
319
+ operationMap () {
320
+ return this.canEdit
321
+ ? this.$categoryMapToMap(
322
+ this.allOperationMap,
323
+ undefined,
324
+ this.isShowEditIcon ? [] : ["canEdit"]
325
+ )
326
+ : this.$categoryMapToMap(
327
+ this.allOperationMap,
328
+ undefined,
329
+ ["canDelete", "canEdit"]
330
+ );
331
+ }
332
+ },
333
+ methods: {
334
+ // 点击删除某项
335
+ clickDeleteItem (operationItem, fileItem, fileIndex) {
336
+ this.$emit("deleteItem", fileItem, fileIndex);
337
+ },
338
+ // 点击文件预览 -file服务器的数据列表
339
+ clickPreview (operationItem, fileItem, fileIndex) {
340
+ if (fileItem.mimetype.includes("image")) {
341
+ const viewerImage = this.$refs.viewerImage;
342
+ const findIndex = this.files
343
+ .filter(valItem => valItem.mimetype.includes("image"))
344
+ .findIndex(valItem => valItem.url === fileItem.url);
345
+
346
+ const viewer = new Viewer(viewerImage, {
347
+ url: "data-original",
348
+ hidden: function () {
349
+ viewer.destroy();
350
+ },
351
+ loop: false,
352
+ initialViewIndex: findIndex,
353
+ zIndex: 2147483647
354
+ });
355
+ viewer.show();
356
+ } else {
357
+ window.open(fileItem.url);
358
+ }
359
+ },
360
+ // 点击文件编辑
361
+ clickEdit (operationItem, fileItem) {
362
+ let fileName = fileItem.name;
363
+ const lastIndex = fileName.lastIndexOf(".");
364
+ const formate = fileName.substring(lastIndex);
365
+ fileName = fileName.substring(0, lastIndex);
366
+
367
+ this.$Modal.confirm({
368
+ title: "修改名称",
369
+ render: (h) => {
370
+ // // 第二种方式
371
+ // const lastIndex = fileName.lastIndexOf(".");
372
+ // const formate = fileName.substring(lastIndex);
373
+
374
+ return h("Input", {
375
+ props: {
376
+ // value: fileItem.name.substring(0, lastIndex),
377
+ value: fileName,
378
+ autofocus: true,
379
+ placeholder: "请输入名称"
380
+ },
381
+ scopedSlots: {
382
+ append: formate
383
+ },
384
+ on: {
385
+ input: (val) => {
386
+ // fileItem.name = val + formate;
387
+ fileName = val;
388
+ }
389
+ }
390
+ });
391
+ },
392
+ onOk: () => {
393
+ fileItem.name = fileName + formate;
394
+ this.$emit("editItemName", fileItem);
395
+ },
396
+ onCancel: () => {}
397
+ });
398
+ },
399
+ // 接口 -下载
400
+ handleDownload (operationItem, fileItem, fileIndex) {
401
+ axios
402
+ .get(fileItem.downloadUrl, {
403
+ responseType: "blob"
404
+ })
405
+ .then((res) => {
406
+ if (window.navigator.msSaveOrOpenBlob) {
407
+ // 兼容IE10
408
+ navigator.msSaveBlob(res, fileItem.name);
409
+ } else {
410
+ const href = URL.createObjectURL(res.data); // 创建新的URL表示指定的blob对象
411
+ const a = document.createElement("a");
412
+ a.style.display = "none";
413
+ a.href = href; // 指定下载链接
414
+ a.download = fileItem.name; // 指定下载文件名
415
+ a.click();
416
+ URL.revokeObjectURL(a.href); // 释放URL对象
417
+ a.remove();
418
+ }
419
+ });
420
+ },
421
+ // 获取不同类型文件的图片
422
+ getFileImage (fileItem) {
423
+ if (!fileItem.mimetype) {
424
+ return this.$imageSrcMap.fileType.other;
425
+ } else if (fileItem.mimetype.includes("image")) {
426
+ return fileItem.url; // 压缩图片:将图片最长的边限制在100像素,短边按比例处理
427
+ } else if (fileItem.mimetype.includes("text/plain")) {
428
+ return this.$imageSrcMap.fileType.text;
429
+ } else if (fileItem.mimetype.includes("application/pdf")) {
430
+ return this.$imageSrcMap.fileType.pdf;
431
+ } else if (fileItem.mimetype.includes("wordprocessingml.document") || fileItem.mimetype.includes("application/msword")) {
432
+ return this.$imageSrcMap.fileType.doc;
433
+ } else if (fileItem.mimetype.includes("presentationml.presentation") || fileItem.mimetype.includes("application/vnd.ms-powerpoint")) {
434
+ return this.$imageSrcMap.fileType.ppt;
435
+ } else if (fileItem.mimetype.includes("spreadsheetml.sheet")) {
436
+ return this.$imageSrcMap.fileType.excel;
437
+ } else if (fileItem.mimetype.includes("application/x-zip-compressed")) {
438
+ return this.$imageSrcMap.fileType.zip;
439
+ } else if (fileItem.mimetype.includes("application/x-rar-compressed")) {
440
+ return this.$imageSrcMap.fileType.rar;
441
+ } else {
442
+ return this.$imageSrcMap.fileType.other;
443
+ }
444
+ },
445
+ getBtns (fileItem) {
446
+ if (["image", "application/pdf", "text/plain"].some(type => fileItem.mimetype.includes(type)) ||
447
+ fileItem.mimetype.includes("wordprocessingml.document") ||
448
+ fileItem.mimetype.includes("application/msword") ||
449
+ fileItem.mimetype.includes("presentationml.presentation") ||
450
+ fileItem.mimetype.includes("application/vnd.ms-powerpoint") ||
451
+ fileItem.mimetype.includes("spreadsheetml.sheet"))
452
+ {
453
+ return undefined;
454
+ }
455
+ else {
456
+ ["canDelete", "canEdit", "canDownload"];
457
+ }
458
+ }
459
+ }
460
+ };
461
+ </script>
462
+
463
+ <style lang="less">
464
+ .uploadList {
465
+ width: 100%;
466
+ overflow: auto;
467
+
468
+ // 普通文件
469
+ &-old {
470
+ margin: 16px;
471
+ }
472
+
473
+ &-nodata {
474
+ width: 100%;
475
+ height: 100%;
476
+ text-align: center;
477
+ line-height: 120px;
478
+ color: @placeholderColor;
479
+ white-space: nowrap;
480
+
481
+ span {
482
+ margin-left: 5px;
483
+ }
484
+ }
485
+
486
+ &-list {
487
+ display: flex;
488
+ flex-wrap: nowrap;
489
+
490
+ .item {
491
+ flex: 0 0 120px;
492
+ height: 120px;
493
+ margin-right: 10px;
494
+ border-radius: @borderRadius;
495
+ background: #f4f5fa;
496
+ text-align: center;
497
+ overflow: hidden;
498
+ display: inline-flex;
499
+ flex-direction: column;
500
+ justify-content: space-between;
501
+ position: relative;
502
+
503
+ &:hover {
504
+ .item-action {
505
+ display: flex !important;
506
+ }
507
+ }
508
+
509
+ &-show {
510
+ display: flex;
511
+ overflow: hidden;
512
+ align-items: center;
513
+ justify-content: center;
514
+ flex: 2;
515
+ min-height: 50px;
516
+
517
+ img {
518
+ max-width: 100%;
519
+ max-height: 100%;
520
+ }
521
+ }
522
+
523
+ &-name {
524
+ flex: 1;
525
+ display: flex;
526
+ max-height: 32px;
527
+
528
+ &-title {
529
+ padding: 0 8px;
530
+ overflow: hidden;
531
+ text-overflow: ellipsis;
532
+ white-space: nowrap;
533
+ color: @themeColor;
534
+ }
535
+ }
536
+
537
+ &-action {
538
+ position: absolute;
539
+ right: 0px;
540
+ top: 0px;
541
+ left: 0px;
542
+ bottom: 0px;
543
+ background-color: @placeholderColor;
544
+ display: none !important;
545
+ align-items: center;
546
+ justify-content: center;
547
+
548
+ &-icon {
549
+ width: 22px;
550
+ height: 22px;
551
+ line-height: 22px;
552
+ color: #fff;
553
+ }
554
+ }
555
+ }
556
+
557
+ // file 模式
558
+ &-file {
559
+ flex-direction: column;
560
+ .item-file {
561
+ flex: 0 0 100%;
562
+ height: auto;
563
+ display: flex;
564
+ flex-direction: row;
565
+ justify-content: space-between;
566
+ align-items: center;
567
+ border-radius: 0px;
568
+ margin: 0px;
569
+ padding: 2px 0;
570
+ background: transparent;
571
+ &:hover {
572
+ background: #f4f5fa;
573
+ }
574
+ .item-show {
575
+ flex: 0 0 22px;
576
+ min-height: 20px;
577
+ img {
578
+ width: 22px;
579
+ height: 22px;
580
+ }
581
+ }
582
+ .item-name-title {
583
+ color: @textColor;
584
+ flex: 1;
585
+ text-align: left;
586
+ }
587
+ .item-action {
588
+ position: static;
589
+ display: flex !important;
590
+ background: transparent;
591
+ white-space: nowrap;
592
+ &-icon {
593
+ color: @contentColor;
594
+ width: 16px;
595
+ }
596
+ }
597
+ }
598
+ }
599
+ }
600
+
601
+ &-inline {
602
+ height: 32px;
603
+ line-height: 32px;
604
+
605
+ &-list {
606
+ width: 100%;
607
+ height: 100%;
608
+ padding-left: 3px;
609
+ display: flex;
610
+ flex-wrap: nowrap;
611
+ overflow-x: auto;
612
+ overflow-y: hidden;
613
+
614
+ .item {
615
+ flex: 0 0 32px;
616
+ margin-right: 3px;
617
+ border-radius: @borderRadius;
618
+ background: #f4f5fa;
619
+ text-align: center;
620
+ position: relative;
621
+
622
+ img {
623
+ max-width: 100%;
624
+ max-height: 100%;
625
+ margin: auto;
626
+ }
627
+
628
+ &-action {
629
+ position: absolute;
630
+ left: 0;
631
+ right: 0;
632
+ top: 0;
633
+ bottom: 0;
634
+ display: none !important;
635
+ background-color: @placeholderColor;
636
+ color: #fff;
637
+ align-items: center;
638
+ justify-content: center;
639
+ flex-wrap: wrap;
640
+
641
+ &-icon {
642
+ width: 16px;
643
+ height: 16px;
644
+ font-size: 16px !important;
645
+ margin: 0px;
646
+ }
647
+ }
648
+
649
+ @keyframes toTop {
650
+ from {
651
+ top: 100%;
652
+ }
653
+
654
+ to {
655
+ top: 0;
656
+ }
657
+ }
658
+
659
+ &:hover {
660
+ .item-action {
661
+ display: flex !important;
662
+ animation: toTop 0.1s;
663
+ }
664
+ }
665
+ }
666
+ }
667
+
668
+ &-nodata {
669
+ padding-left: 7px;
670
+ line-height: 32px;
671
+ color: @placeholderColor;
672
+ }
673
+ }
674
+
675
+ &-fileList {
676
+ width: 100%;
677
+ &-fileName {
678
+ width: 100%;
679
+ height: 100%;
680
+ cursor: pointer;
681
+ display: flex;
682
+ justify-content: space-between;
683
+ align-items: center;
684
+
685
+ &-edit {
686
+ padding: 0 8px;
687
+ }
688
+ }
689
+ }
690
+ }
691
+
692
+ .DshDropdown {
693
+ .uploadList-fileList-fileItem {
694
+ width: 100%;
695
+ display: flex;
696
+ justify-content: space-between;
697
+ align-items: center;
698
+ .fileItem {
699
+ &-img {
700
+ width: 22px;
701
+ height: 22px;
702
+ }
703
+ &-name-title {
704
+ white-space: nowrap;
705
+ overflow: hidden;
706
+ text-overflow: ellipsis;
707
+ margin: 0 8px;
708
+ flex: 1;
709
+ text-align: left;
710
+ }
711
+ &-action {
712
+ display: flex;
713
+ align-items: center;
714
+ justify-content: flex-end;
715
+ &-icon {
716
+ width: 16px;
717
+ color: @contentColor;
718
+ }
719
+ }
720
+ }
721
+
722
+ }
723
+ }
724
+ </style>