@ddwl/ddwl-ui 1.2.3-beta.1 → 1.2.3-beta.3

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