@ddwl/ddwl-ui 1.2.3-beta.1 → 1.2.3-beta.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 (144) hide show
  1. package/dist/app.common.js +30684 -0
  2. package/dist/app.css +18 -0
  3. package/dist/app.umd.js +30703 -0
  4. package/dist/app.umd.min.js +18 -0
  5. package/dist/demo.html +1 -0
  6. package/package.json +5 -4
  7. package/src/assets/video-play.jpeg +0 -0
  8. package/src/lib/install/index.js +14 -0
  9. package/src/lib/slots/buttonGroup.vue +113 -0
  10. package/src/lib/slots/dict.vue +46 -0
  11. package/src/lib/slots/file.vue +36 -0
  12. package/src/lib/slots/icon.vue +74 -0
  13. package/src/lib/slots/index.js +11 -0
  14. package/src/lib/theme/alert.css +1 -0
  15. package/src/lib/theme/aside.css +1 -0
  16. package/src/lib/theme/autocomplete.css +1 -0
  17. package/src/lib/theme/avatar.css +1 -0
  18. package/src/lib/theme/backtop.css +1 -0
  19. package/src/lib/theme/badge.css +1 -0
  20. package/src/lib/theme/base.css +1 -0
  21. package/src/lib/theme/breadcrumb-item.css +0 -0
  22. package/src/lib/theme/breadcrumb.css +1 -0
  23. package/src/lib/theme/button-group.css +0 -0
  24. package/src/lib/theme/button.css +1 -0
  25. package/src/lib/theme/calendar.css +1 -0
  26. package/src/lib/theme/card.css +1 -0
  27. package/src/lib/theme/carousel-item.css +1 -0
  28. package/src/lib/theme/carousel.css +1 -0
  29. package/src/lib/theme/cascader-panel.css +1 -0
  30. package/src/lib/theme/cascader.css +1 -0
  31. package/src/lib/theme/checkbox-button.css +0 -0
  32. package/src/lib/theme/checkbox-group.css +0 -0
  33. package/src/lib/theme/checkbox.css +1 -0
  34. package/src/lib/theme/col.css +1 -0
  35. package/src/lib/theme/collapse-item.css +0 -0
  36. package/src/lib/theme/collapse.css +1 -0
  37. package/src/lib/theme/color-picker.css +1 -0
  38. package/src/lib/theme/container.css +1 -0
  39. package/src/lib/theme/date-picker.css +1 -0
  40. package/src/lib/theme/descriptions-item.css +1 -0
  41. package/src/lib/theme/descriptions.css +1 -0
  42. package/src/lib/theme/dialog.css +1 -0
  43. package/src/lib/theme/display.css +1 -0
  44. package/src/lib/theme/divider.css +1 -0
  45. package/src/lib/theme/drawer.css +1 -0
  46. package/src/lib/theme/dropdown-item.css +0 -0
  47. package/src/lib/theme/dropdown-menu.css +0 -0
  48. package/src/lib/theme/dropdown.css +1 -0
  49. package/src/lib/theme/empty.css +1 -0
  50. package/src/lib/theme/fonts/element-icons.ttf +0 -0
  51. package/src/lib/theme/fonts/element-icons.woff +0 -0
  52. package/src/lib/theme/footer.css +1 -0
  53. package/src/lib/theme/form-item.css +0 -0
  54. package/src/lib/theme/form.css +1 -0
  55. package/src/lib/theme/header.css +1 -0
  56. package/src/lib/theme/icon.css +1 -0
  57. package/src/lib/theme/image.css +1 -0
  58. package/src/lib/theme/index.css +1 -0
  59. package/src/lib/theme/infinite-scroll.css +0 -0
  60. package/src/lib/theme/infiniteScroll.css +0 -0
  61. package/src/lib/theme/input-number.css +1 -0
  62. package/src/lib/theme/input.css +1 -0
  63. package/src/lib/theme/link.css +1 -0
  64. package/src/lib/theme/loading.css +1 -0
  65. package/src/lib/theme/main.css +1 -0
  66. package/src/lib/theme/menu-item-group.css +0 -0
  67. package/src/lib/theme/menu-item.css +0 -0
  68. package/src/lib/theme/menu.css +1 -0
  69. package/src/lib/theme/message-box.css +1 -0
  70. package/src/lib/theme/message.css +1 -0
  71. package/src/lib/theme/notification.css +1 -0
  72. package/src/lib/theme/option-group.css +1 -0
  73. package/src/lib/theme/option.css +1 -0
  74. package/src/lib/theme/page-header.css +1 -0
  75. package/src/lib/theme/pagination.css +1 -0
  76. package/src/lib/theme/popconfirm.css +1 -0
  77. package/src/lib/theme/popover.css +1 -0
  78. package/src/lib/theme/popper.css +1 -0
  79. package/src/lib/theme/progress.css +1 -0
  80. package/src/lib/theme/radio-button.css +1 -0
  81. package/src/lib/theme/radio-group.css +1 -0
  82. package/src/lib/theme/radio.css +1 -0
  83. package/src/lib/theme/rate.css +1 -0
  84. package/src/lib/theme/reset.css +1 -0
  85. package/src/lib/theme/result.css +1 -0
  86. package/src/lib/theme/row.css +1 -0
  87. package/src/lib/theme/scrollbar.css +1 -0
  88. package/src/lib/theme/select-dropdown.css +1 -0
  89. package/src/lib/theme/select.css +1 -0
  90. package/src/lib/theme/skeleton-item.css +1 -0
  91. package/src/lib/theme/skeleton.css +1 -0
  92. package/src/lib/theme/slider.css +1 -0
  93. package/src/lib/theme/spinner.css +1 -0
  94. package/src/lib/theme/step.css +1 -0
  95. package/src/lib/theme/steps.css +1 -0
  96. package/src/lib/theme/submenu.css +0 -0
  97. package/src/lib/theme/switch.css +1 -0
  98. package/src/lib/theme/tab-pane.css +0 -0
  99. package/src/lib/theme/table-column.css +1 -0
  100. package/src/lib/theme/table.css +1 -0
  101. package/src/lib/theme/tabs.css +1 -0
  102. package/src/lib/theme/tag.css +1 -0
  103. package/src/lib/theme/time-picker.css +1 -0
  104. package/src/lib/theme/time-select.css +1 -0
  105. package/src/lib/theme/timeline-item.css +1 -0
  106. package/src/lib/theme/timeline.css +1 -0
  107. package/src/lib/theme/tooltip.css +1 -0
  108. package/src/lib/theme/transfer.css +1 -0
  109. package/src/lib/theme/tree.css +1 -0
  110. package/src/lib/theme/upload.css +1 -0
  111. package/src/main.js +70 -0
  112. package/src/packages/button/index.vue +36 -0
  113. package/src/packages/checkbox-group/index.vue +57 -0
  114. package/src/packages/descriptions/index.vue +124 -0
  115. package/src/packages/dialog/index.vue +172 -0
  116. package/src/packages/dialog-confirm/index.vue +99 -0
  117. package/src/packages/drawer/index.vue +136 -0
  118. package/src/packages/file-preview/index.vue +275 -0
  119. package/src/packages/file-preview/static/audio.png +0 -0
  120. package/src/packages/file-preview/static/video.png +0 -0
  121. package/src/packages/filter-tree/index.vue +292 -0
  122. package/src/packages/form/index.vue +149 -0
  123. package/src/packages/form-item/index.vue +199 -0
  124. package/src/packages/import-file/index.vue +173 -0
  125. package/src/packages/menu/index.vue +66 -0
  126. package/src/packages/menu/menuItem.vue +90 -0
  127. package/src/packages/popconfirm/index.vue +39 -0
  128. package/src/packages/radio-group/index.vue +57 -0
  129. package/src/packages/render/index.vue +14 -0
  130. package/src/packages/search-form/index.vue +257 -0
  131. package/src/packages/search-input/index.vue +68 -0
  132. package/src/packages/search-table/index.vue +93 -0
  133. package/src/packages/select/index.vue +74 -0
  134. package/src/packages/svg-icon/index.vue +43 -0
  135. package/src/packages/table/drag.png +0 -0
  136. package/src/packages/table/index.vue +453 -0
  137. package/src/packages/upload/index.vue +350 -0
  138. package/src/utils/constant.js +4 -0
  139. package/src/utils/index.js +77 -0
  140. package/src/utils/treeLib.js +190 -0
  141. package/dist/index.html +0 -1
  142. package/dist/js/app.js +0 -1
  143. package/dist/js/chunk-vendors.js +0 -17
  144. package/dist/static/css/app.2ec4a629.css +0 -1
@@ -0,0 +1,453 @@
1
+ <!-- 表格 -->
2
+ <template>
3
+ <div
4
+ :key="key"
5
+ v-loading="loading"
6
+ class="d-table"
7
+ :class="draggable && 'drag-query-table'"
8
+ >
9
+ <el-table
10
+ ref="table"
11
+ :row-key="rowKey"
12
+ style="width: 100%"
13
+ :data="list"
14
+ :border="border"
15
+ v-bind="$attrs"
16
+ v-on="$listeners"
17
+ @select="selectChange"
18
+ @select-all="selectAllChange"
19
+ @selection-change="selectionChange"
20
+ >
21
+ <el-table-column
22
+ v-if="selection || asyncSelection"
23
+ key="selection"
24
+ type="selection"
25
+ align="center"
26
+ width="50"
27
+ />
28
+ <el-table-column
29
+ v-if="index"
30
+ key="index"
31
+ label="序号"
32
+ align="center"
33
+ width="55"
34
+ >
35
+ <template slot-scope="scope">
36
+ {{ (pageNum - 1) * pageSize + scope.$index + 1 }}
37
+ </template>
38
+ </el-table-column>
39
+ <el-table-column
40
+ v-for="column in visibleColumns"
41
+ :key="column.prop"
42
+ v-bind="column"
43
+ v-on="$listeners"
44
+ >
45
+ <template slot-scope="scope">
46
+ <component
47
+ :is="column.component"
48
+ v-if="column.component"
49
+ v-bind="{ ...scope.row, ...column }"
50
+ :row="scope.row"
51
+ :index="scope.$index"
52
+ />
53
+ <column-render
54
+ v-else-if="column.render"
55
+ :scope="scope"
56
+ :render="column.render"
57
+ />
58
+ <template v-else>
59
+ {{ scope.row[column.prop] }}
60
+ </template>
61
+ </template>
62
+ </el-table-column>
63
+ <el-table-column
64
+ v-if="draggable && rowKey"
65
+ label=""
66
+ width="55"
67
+ align="center"
68
+ >
69
+ <img
70
+ class="table-drag-icon"
71
+ src="./drag.png"
72
+ >
73
+ </el-table-column>
74
+ </el-table>
75
+ <!-- 分页器 -->
76
+ <div
77
+ v-if="pagination"
78
+ class="d-table-footer"
79
+ >
80
+ <div>
81
+ <slot name="footer" />
82
+ </div>
83
+ <el-pagination
84
+ class="pagination"
85
+ :background="background"
86
+ :layout="layout"
87
+ :total="total"
88
+ :page-sizes="pageSizes"
89
+ :page-size="pageSize"
90
+ :current-page="pageNum"
91
+ v-bind="$attrs"
92
+ @size-change="handleSizeChange"
93
+ @current-change="handleCurrentChange"
94
+ />
95
+ </div>
96
+ </div>
97
+ </template>
98
+
99
+ <script>
100
+ import Sortable from 'sortablejs'
101
+ import { cloneDeep } from 'lodash'
102
+ import modules from '../../lib/slots'
103
+ import ColumnRender from '../render'
104
+
105
+ export default {
106
+ name: 'DTable',
107
+ components: { ...modules, ColumnRender },
108
+ props: {
109
+ data: {
110
+ type: Array,
111
+ default: () => []
112
+ },
113
+ rowKey: {
114
+ type: String,
115
+ default: ''
116
+ },
117
+ border: {
118
+ type: Boolean,
119
+ default: true
120
+ },
121
+ // request config
122
+ requestConfig: {
123
+ type: Object,
124
+ require: false,
125
+ default: () => ({
126
+ api: () => {}, // 接口
127
+ params: {}, // 默认参数
128
+ autoRequest: true, // 是否自动请求
129
+ method: null // 自定义请求方法
130
+ })
131
+ },
132
+ layout: {
133
+ type: String,
134
+ default: 'total, sizes, prev, pager, next, jumper'
135
+ },
136
+ pageSizes: {
137
+ type: Array,
138
+ default: () => ([10, 20, 30, 50])
139
+ },
140
+ background: {
141
+ type: Boolean,
142
+ default: true
143
+ },
144
+ // 是否需要分页
145
+ pagination: {
146
+ default: true,
147
+ type: Boolean
148
+ },
149
+ // 是否拖拽
150
+ draggable: {
151
+ default: false,
152
+ type: Boolean
153
+ },
154
+ // 是否展示多选框
155
+ selection: {
156
+ default: false,
157
+ type: Boolean
158
+ },
159
+ // 是否跨页勾选
160
+ asyncSelection: {
161
+ default: false,
162
+ type: Boolean
163
+ },
164
+ // 默认勾选项,必须设置rowKey
165
+ defaultCheckList: {
166
+ default: () => [],
167
+ type: Array
168
+ },
169
+ // 是否展示排序列
170
+ index: {
171
+ default: false,
172
+ type: Boolean
173
+ },
174
+ // 列表项配置
175
+ columns: {
176
+ default: () => [],
177
+ type: Array
178
+ },
179
+ // 开启静态分页
180
+ staticPaging: {
181
+ default: false,
182
+ type: Boolean
183
+ }
184
+ },
185
+ data () {
186
+ return {
187
+ pageSize: 10,
188
+ pageNum: 1,
189
+ total: 0,
190
+ loading: false,
191
+ checkedList: [],
192
+ ids: [],
193
+ key: 0,
194
+ list: [],
195
+ totalList: []
196
+ }
197
+ },
198
+ computed: {
199
+ visibleColumns () {
200
+ return this.columns.filter(item => !item.hide)
201
+ }
202
+ },
203
+ watch: {
204
+ data: {
205
+ handler (val) {
206
+ if (JSON.stringify(val) === JSON.stringify(this.list)) {
207
+ return
208
+ }
209
+ this.handleRequestData(val)
210
+ if (this.draggable) {
211
+ this.$nextTick(() => {
212
+ this.initSortable()
213
+ })
214
+ }
215
+ },
216
+ deep: true,
217
+ immediate: true
218
+ },
219
+ defaultCheckList: {
220
+ handler () {
221
+ this.handleSelectionData()
222
+ },
223
+ deep: true
224
+ }
225
+ },
226
+ mounted () {
227
+ if (this.draggable && !this.rowKey) {
228
+ console.error('[DTable] 请设置正确的 rowKey 用于拖拽排序')
229
+ }
230
+
231
+ this.checkedList = this.defaultCheckList
232
+ // 如果不需要分页器,每页显示条目数设置最大
233
+ if (!this.pagination) {
234
+ this.pageSize = 9999999
235
+ }
236
+ // 注册表格拖拽
237
+ if (this.draggable) {
238
+ this.initSortable()
239
+ }
240
+ // 是否开启自动请求
241
+ if (!this.staticPaging && (this.requestConfig.autoRequest || this.requestConfig.autoRequest === undefined)) {
242
+ this.search()
243
+ }
244
+ },
245
+ methods: {
246
+ /**
247
+ * @description: 表格查询方法包装
248
+ * @param {*} param 自定义查询条件
249
+ */
250
+ async search (param = {}) {
251
+ this.loading = true
252
+ try {
253
+ if (param.pageNum) {
254
+ this.pageNum = param.pageNum
255
+ }
256
+ if (param.pageSize) {
257
+ this.pageSize = param.pageSize
258
+ }
259
+ const { total, data } = await (this.requestConfig.method || this.getData)({
260
+ pageSize: this.pageSize,
261
+ pageNum: this.pageNum,
262
+ ...this.requestConfig.params,
263
+ ...param
264
+ })
265
+ this.total = total
266
+ this.handleRequestData(data)
267
+ // eslint-disable-next-line no-empty
268
+ } catch (e) {}
269
+ this.loading = false
270
+ },
271
+ async getData (params) {
272
+ const defaultParams = typeof this.requestConfig.params === 'function' ? this.requestConfig.params() : this.requestConfig.params
273
+ const { data } = await this.requestConfig.api({ ...defaultParams, ...params })
274
+ this.total = data.total
275
+ let listData = data.list || []
276
+ if (this.requestConfig.props) {
277
+ if (this.requestConfig.props.list === null) {
278
+ listData = data
279
+ } else if (this.requestConfig.props.list) {
280
+ listData = data[this.requestConfig.props.list]
281
+ }
282
+ }
283
+ return {
284
+ total: data.total,
285
+ data: listData
286
+ }
287
+ },
288
+ /**
289
+ * @description: 处理表格接口获取的数据
290
+ */
291
+ handleRequestData (data) {
292
+ if (this.staticPaging) {
293
+ this.totalList = cloneDeep(data)
294
+ this.total = this.totalList.length
295
+ } else {
296
+ this.list = cloneDeep(data)
297
+ }
298
+
299
+ // 静态分页
300
+ if (this.staticPaging) {
301
+ this.pageNum = 1
302
+ this.calcStaticPageData()
303
+ return
304
+ }
305
+
306
+ this.$emit('loaded', this.list)
307
+
308
+ // 如果当前页码大于1且当前数据列表为空,自动返回上一页并查询
309
+ if (this.list.length === 0 && this.pageNum > 1) {
310
+ this.pageNum = this.pageNum - 1
311
+ this.search()
312
+ return
313
+ }
314
+ // 跨页勾选逻辑
315
+ if (this.asyncSelection || this.selection) {
316
+ this.key++
317
+ this.handleSelectionData()
318
+ }
319
+ },
320
+ /**
321
+ * @description: 处理表格默认勾选
322
+ */
323
+ handleSelectionData () {
324
+ this.checkedList = this.defaultCheckList
325
+ this.$refs.table && this.$refs.table.clearSelection()
326
+ if (this.checkedList.length) {
327
+ const ids = this.checkedList.map(item => item[this.rowKey])
328
+ const rows = this.list.filter(item => ids.includes(item[this.rowKey]))
329
+ this.$nextTick(() => {
330
+ rows.forEach(row => {
331
+ this.$refs.table.toggleRowSelection(row, true)
332
+ })
333
+ })
334
+ }
335
+ },
336
+ calcStaticPageData () {
337
+ const _list = JSON.parse(JSON.stringify(this.totalList))
338
+ this.list = _list.splice((this.pageNum - 1) * this.pageSize, this.pageSize)
339
+ },
340
+ handleSizeChange (val) {
341
+ this.pageSize = val
342
+ this.pageNum = 1
343
+ this.staticPaging ? this.calcStaticPageData() : this.search()
344
+ this.$emit('page-change', { size: this.pageSize, page: this.pageNum })
345
+ },
346
+ handleCurrentChange (val) {
347
+ this.pageNum = val
348
+ this.staticPaging ? this.calcStaticPageData() : this.search()
349
+ this.$emit('page-change', { size: this.pageSize, page: this.pageNum })
350
+ },
351
+ /**
352
+ * @description: 勾选改变事件
353
+ * @param {Array} list
354
+ * @return {Array}
355
+ */
356
+ selectChange (list, row) {
357
+ if (!this.asyncSelection) {
358
+ this.$emit('select-change', list)
359
+ } else {
360
+ if (list.some(i => i[this.rowKey] === row[this.rowKey])) {
361
+ this.checkedList.push(row)
362
+ } else {
363
+ this.checkedList = this.checkedList.filter(item => item[this.rowKey] !== row[this.rowKey])
364
+ }
365
+ this.$emit('select-change', cloneDeep(this.checkedList))
366
+ }
367
+ },
368
+ selectAllChange (list) {
369
+ if (!this.asyncSelection) {
370
+ this.$emit('select-change', list)
371
+ } else {
372
+ if (list.length) {
373
+ const checkedKeys = this.checkedList.map(item => item[this.rowKey])
374
+ const newData = list.filter(item => !checkedKeys.includes(item[this.rowKey]))
375
+ this.checkedList = this.checkedList.concat(newData)
376
+ } else {
377
+ const listKeys = this.list.map(item => item[this.rowKey])
378
+ this.checkedList = this.checkedList.filter(item => !listKeys.includes(item[this.rowKey]))
379
+ }
380
+ this.$emit('select-change', cloneDeep(this.checkedList))
381
+ }
382
+ },
383
+
384
+ selectionChange () {},
385
+ /**
386
+ * @description: 清空用户的选择
387
+ */
388
+ clearSelection () {
389
+ this.checkedList = []
390
+ this.$refs.table.clearSelection()
391
+ },
392
+ /**
393
+ * @description: 改变给定值的选中状态
394
+ * @param {*} value 改变选中状态的值
395
+ * @param {*} selected 是否选中
396
+ */
397
+ toggleAsyncSelection (value, selected = false) {
398
+ this.checkedList = this.checkedList.filter(item => item[this.rowKey] !== value)
399
+ const data = this.list.find(item => item[this.rowKey] === value)
400
+ if (data) {
401
+ this.$refs.table.toggleRowSelection(data, selected)
402
+ } else {
403
+ this.$emit('select-change', this.checkedList)
404
+ }
405
+ },
406
+ /**
407
+ * @description: 表格拖拽
408
+ */
409
+ initSortable () {
410
+ const el = this.$refs.table.$el.querySelector('.el-table__body-wrapper > table > tbody')
411
+ /* eslint-disable no-new */
412
+ new Sortable(el, {
413
+ handle: '.table-drag-icon',
414
+ onEnd: (evt) => {
415
+ // 拖拽后数据位置置换
416
+ const data = this.list.splice(evt.oldIndex, 1)[0]
417
+ this.list.splice(evt.newIndex, 0, data)
418
+
419
+ this.$nextTick(() => {
420
+ // 重新初始化table
421
+ this.initSortable()
422
+ this.handleSelectionData()
423
+ this.$emit('drag-change', this.list, evt)
424
+ })
425
+ }
426
+ })
427
+ }
428
+ }
429
+ }
430
+ </script>
431
+
432
+ <style lang="scss" scoped>
433
+ .d-table {
434
+ display: flex;
435
+ flex-direction: column;
436
+ }
437
+ .drag-query-table {
438
+ :deep(.hover-row) {
439
+ td {
440
+ background-color: #fff;
441
+ }
442
+ }
443
+ }
444
+ .table-drag-icon {
445
+ cursor: pointer;
446
+ }
447
+ .d-table-footer {
448
+ display: flex;
449
+ align-items: center;
450
+ justify-content: space-between;
451
+ margin-top: 16px;
452
+ }
453
+ </style>