@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,161 @@
1
+ <template>
2
+ <d-dialog
3
+ v-model="visible"
4
+ form-refs="importForm"
5
+ :width="width"
6
+ :title="title"
7
+ submit-btn-text="导入"
8
+ submit-btn-icon="el-icon-upload2"
9
+ @submit="submit"
10
+ >
11
+ <el-form ref="importForm" :model="form" :inline="true">
12
+ <el-form-item
13
+ class="import-form-item"
14
+ prop="file"
15
+ label="选择文件"
16
+ :rules="[{ required: true, message: '请选择文件' }]"
17
+ >
18
+ <div class="d-import__custom-file-input">
19
+ <div class="d-import__custom-file-content">
20
+ {{ form.file ? form.file.name : '请选择' }}
21
+ </div>
22
+ <el-upload
23
+ :file-list="fileList"
24
+ :show-file-list="false"
25
+ :auto-upload="false"
26
+ action=""
27
+ :on-change="uploadChange"
28
+ >
29
+ <el-button type="primary" icon="el-icon-folder" />
30
+ </el-upload>
31
+ </div>
32
+ </el-form-item>
33
+ <el-button v-show="templateUrl" icon="el-icon-paperclip" type="text" @click="downloadFile">
34
+ 模板下载
35
+ </el-button>
36
+ </el-form>
37
+ <slot>
38
+ <p>1. 支持导入格式为{{ fileType.join('、') }}的文件,且文件大小不可超过{{ fileSize }}M</p>
39
+ <p>2. 模板的表头不可更改,不可删除</p>
40
+ <p>3. 若导入数据存在编码一致的情况则会更新原有数据</p>
41
+ <p>4. 若导入过程中有问题,需调整模板内容后再重新导入</p>
42
+ </slot>
43
+ </d-dialog>
44
+ </template>
45
+
46
+ <script>
47
+ import DDialog from '../dialog'
48
+
49
+ export default {
50
+ name: 'DImportFile',
51
+ components: { DDialog },
52
+ model: {
53
+ prop: 'modelValue',
54
+ event: 'change'
55
+ },
56
+ props: {
57
+ modelValue: {
58
+ default: false,
59
+ type: Boolean
60
+ },
61
+ width: {
62
+ default: '520px',
63
+ type: String
64
+ },
65
+ title: {
66
+ default: '',
67
+ type: String
68
+ },
69
+ templateUrl: {
70
+ default: '',
71
+ type: String
72
+ },
73
+ fileType: {
74
+ default: () => ['xlsx', 'xls'],
75
+ type: Array
76
+ },
77
+ fileSize: {
78
+ default: 5,
79
+ type: Number
80
+ }
81
+ },
82
+ data() {
83
+ return {
84
+ fileList: [],
85
+ form: {
86
+ file: ''
87
+ }
88
+ }
89
+ },
90
+ computed: {
91
+ visible: {
92
+ get() {
93
+ return this.modelValue
94
+ },
95
+ set(value) {
96
+ this.form.file = ''
97
+ this.fileList = []
98
+ this.$refs.importForm.clearValidate()
99
+ this.$emit('change', value)
100
+ }
101
+ }
102
+ },
103
+ methods: {
104
+ downloadFile() {
105
+ let token
106
+ try {
107
+ token = JSON.parse(window.localStorage.getItem('userInfo')).token
108
+ } catch (e) {
109
+ token = ''
110
+ }
111
+ window.location.href = `${this.templateUrl}?authToken=${token}`
112
+ },
113
+ uploadChange(file, fileList) {
114
+ const isLimit = file.size / 1024 / 1024 < this.fileSize
115
+ const isType = this.fileType.includes(
116
+ file.name.substr(file.name.lastIndexOf('.') + 1).toLocaleLowerCase()
117
+ )
118
+ if (!isType) {
119
+ this.$message.error(`请上传正确的文件格式(${this.fileType.join('、')})`)
120
+ return false
121
+ }
122
+ if (!isLimit) {
123
+ this.$message.error(`上传文件大小不能超过${this.fileSize}MB`)
124
+ return false
125
+ }
126
+ this.fileList = fileList
127
+ this.form.file = file.raw
128
+ },
129
+ async submit(callback) {
130
+ if (!this.form.file) {
131
+ this.$message.error('请选择导入文件')
132
+ callback(new Error(false))
133
+ return
134
+ }
135
+ try {
136
+ this.$emit('submit', this.form.file, callback)
137
+ } catch (e) {
138
+ callback(new Error(false))
139
+ }
140
+ }
141
+ }
142
+ }
143
+ </script>
144
+
145
+ <style lang="scss">
146
+ .d-import__custom-file-input {
147
+ display: flex;
148
+ width: 230px;
149
+ .d-import__custom-file-content {
150
+ width: 100%;
151
+ height: 32px;
152
+ border: 1px solid #dcdfe6;
153
+ border-right: none;
154
+ border-radius: 2px 0 0 2px;
155
+ padding: 0 8px;
156
+ white-space: nowrap;
157
+ overflow: hidden;
158
+ text-overflow: ellipsis;
159
+ }
160
+ }
161
+ </style>
@@ -0,0 +1,68 @@
1
+ <!-- 菜单 -->
2
+ <template>
3
+ <el-menu
4
+ class="d-menu"
5
+ :default-active="isVertical ? $route.path : activeMenu"
6
+ :router="isVertical"
7
+ unique-opened
8
+ :mode="mode"
9
+ @select="menuSelect"
10
+ >
11
+ <menu-item v-for="item in data" :key="item.name" :data="item" :mode="mode"></menu-item>
12
+ </el-menu>
13
+ </template>
14
+
15
+ <script>
16
+ import MenuItem from './menuItem.vue'
17
+ export default {
18
+ name: 'DMenu',
19
+ components: { MenuItem },
20
+ props: {
21
+ data: {
22
+ type: Array,
23
+ default: () => []
24
+ },
25
+ mode: {
26
+ type: String,
27
+ default: 'vertical'
28
+ }
29
+ },
30
+ data() {
31
+ return {
32
+ activeMenu: ''
33
+ }
34
+ },
35
+ computed: {
36
+ isVertical() {
37
+ return this.mode === 'vertical'
38
+ }
39
+ },
40
+ watch: {
41
+ '$route.path': {
42
+ handler(path) {
43
+ if (!this.isVertical) {
44
+ if (this.activeMenu && path.substring(0, this.activeMenu.length) === this.activeMenu)
45
+ return
46
+ const data = this.data.find((item) => path.substring(0, item.path.length) === item.path)
47
+ this.activeMenu = data?.path
48
+ this.$emit('select', data, false)
49
+ }
50
+ },
51
+ immediate: true
52
+ }
53
+ },
54
+ methods: {
55
+ menuSelect(index) {
56
+ if (this.isVertical) return
57
+ const data = this.data.find((item) => item.path === index)
58
+ this.$emit('select', data, true)
59
+ }
60
+ }
61
+ }
62
+ </script>
63
+
64
+ <style lang="scss">
65
+ .d-menu {
66
+ height: 100%;
67
+ }
68
+ </style>
@@ -0,0 +1,73 @@
1
+ <!-- 菜单子项 -->
2
+ <template>
3
+ <el-submenu
4
+ v-if="mode === 'vertical' && data.children && data.children.length"
5
+ class="d-menu__submenu"
6
+ :index="data.path"
7
+ >
8
+ <template slot="title">
9
+ <img v-if="data.meta.icon" class="mr8 menu-icon" :src="data.meta.icon" />
10
+ <span>{{ data.meta.title }}</span>
11
+ </template>
12
+ <menu-item v-for="item in data.children" :key="item.name" :data="item" />
13
+ </el-submenu>
14
+ <el-menu-item v-else :index="data.path">
15
+ <template slot="title">
16
+ <div v-if="data.meta.icon" class="d-menu-icon-box">
17
+ <img class="d-menu-icon" :src="data.meta.icon" />
18
+ </div>
19
+ <span
20
+ v-if="data.meta.isNewWindow"
21
+ class="ml6 ellipsis flex-1"
22
+ @click.stop="openNewWindow(data)"
23
+ >{{ data.meta.title }}</span
24
+ >
25
+ <span v-else class="ml6 ellipsis flex-1">{{ data.meta.title }}</span>
26
+ </template>
27
+ </el-menu-item>
28
+ </template>
29
+
30
+ <script>
31
+ export default {
32
+ name: 'MenuItem',
33
+ components: {},
34
+ props: {
35
+ data: {
36
+ type: Object,
37
+ default: () => ({})
38
+ },
39
+ mode: {
40
+ type: String,
41
+ default: 'vertical'
42
+ }
43
+ },
44
+ data() {
45
+ return {}
46
+ },
47
+ computed: {},
48
+ created() {},
49
+ methods: {
50
+ openNewWindow(data) {
51
+ window.open(data.path, '_blank')
52
+ }
53
+ }
54
+ }
55
+ </script>
56
+
57
+ <style lang="scss">
58
+ .d-menu__submenu {
59
+ .d-menu-icon-box {
60
+ width: 26px;
61
+ height: 26px;
62
+ border-radius: 50%;
63
+ background-color: #fff;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ }
68
+ .d-menu-icon {
69
+ width: 16px;
70
+ height: 16px;
71
+ }
72
+ }
73
+ </style>
@@ -0,0 +1,34 @@
1
+ <!-- 二次确认气泡 -->
2
+ <template>
3
+ <el-popconfirm :title="title" cancel-button-type="" icon="el-icon-warning" @confirm="confirm">
4
+ <span slot="reference" :class="`${type}-text-btn`">{{ buttonName }}</span>
5
+ </el-popconfirm>
6
+ </template>
7
+
8
+ <script>
9
+ export default {
10
+ name: 'DPopconfirm',
11
+ props: {
12
+ title: {
13
+ default: '您确定删除该信息?',
14
+ type: String
15
+ },
16
+ buttonName: {
17
+ default: '删除',
18
+ type: String
19
+ },
20
+ type: {
21
+ default: 'primary',
22
+ type: String
23
+ }
24
+ },
25
+ data() {
26
+ return {}
27
+ },
28
+ methods: {
29
+ confirm() {
30
+ this.$emit('confirm')
31
+ }
32
+ }
33
+ }
34
+ </script>
@@ -0,0 +1,47 @@
1
+ <!-- 单选框组 -->
2
+ <template>
3
+ <el-radio-group v-model="value" v-bind="$attrs" v-on="$listeners">
4
+ <el-radio v-for="item in options" :key="item.value" :label="item.value">
5
+ {{ item.label }}
6
+ </el-radio>
7
+ </el-radio-group>
8
+ </template>
9
+
10
+ <script>
11
+ export default {
12
+ name: 'DRadioGroup',
13
+ components: {},
14
+ model: {
15
+ prop: 'modelValue',
16
+ event: 'modelChange'
17
+ },
18
+ props: {
19
+ modelValue: {
20
+ type: [String, Number],
21
+ default: ''
22
+ },
23
+ options: {
24
+ type: Array,
25
+ default: () => []
26
+ }
27
+ },
28
+ data() {
29
+ return {}
30
+ },
31
+ computed: {
32
+ value: {
33
+ get() {
34
+ return this.modelValue
35
+ },
36
+ set(value) {
37
+ this.$emit('modelChange', value)
38
+ }
39
+ }
40
+ },
41
+ watch: {},
42
+ created() {},
43
+ methods: {}
44
+ }
45
+ </script>
46
+
47
+ <style lang="scss"></style>
@@ -0,0 +1,14 @@
1
+ <!-- eslint-disable vue/require-default-prop -->
2
+ <script>
3
+ export default {
4
+ name: 'DRender',
5
+ functional: true,
6
+ props: {
7
+ scope: Object,
8
+ render: Function
9
+ },
10
+ render: (h, ctx) => {
11
+ return ctx.props.render ? ctx.props.render(ctx.props.scope, h) : ''
12
+ }
13
+ }
14
+ </script>
@@ -0,0 +1,257 @@
1
+ <!-- 搜索组件 -->
2
+ <template>
3
+ <div class="d-search-form">
4
+ <el-row class="flex-wrap" :gutter="gutter">
5
+ <el-col
6
+ v-for="(item, index) in list"
7
+ v-show="showCol(index)"
8
+ :key="item.prop"
9
+ :span="item.span || Math.floor(24 / cell)"
10
+ class="col-item"
11
+ >
12
+ <div class="d-search-item">
13
+ <div class="d-search-item-label">
14
+ {{ item.label }}
15
+ </div>
16
+ <form-item v-model="form[item.prop]" :config="item" />
17
+ </div>
18
+ </el-col>
19
+ <el-col :span="hiddenIndex === list.length || expend ? emptySpan : 0" style="height: 68px">
20
+ <span />
21
+ </el-col>
22
+ <el-col v-if="hasSlot && expend && !suffixSlot" :span="24 - submitSpan" class="mb16">
23
+ <slot />
24
+ </el-col>
25
+ <el-col :span="submitSpan">
26
+ <div
27
+ :style="{
28
+ 'margin-top': hasSlot && expend && !suffixSlot ? '0px' : '24px'
29
+ }"
30
+ class="d-search-form-btn"
31
+ >
32
+ <el-button type="primary" :disabled="searchLoading" @click="search"> 查询 </el-button>
33
+ <el-button :disabled="searchLoading" @click="reset"> 重置 </el-button>
34
+ <el-button
35
+ v-if="list.length > hiddenIndex"
36
+ class="expend-btn"
37
+ :class="`el-icon-arrow-${expend ? 'up' : 'down'}`"
38
+ @click="changeStatus"
39
+ />
40
+ </div>
41
+ </el-col>
42
+ <el-col v-if="hasSlot && (!expend || suffixSlot)" :span="20" class="mb16">
43
+ <slot />
44
+ </el-col>
45
+ </el-row>
46
+ </div>
47
+ </template>
48
+
49
+ <script>
50
+ import FormItem from '../form-item'
51
+ import { cloneDeep } from 'lodash'
52
+
53
+ // 初始化表单
54
+ let initForm = {}
55
+
56
+ export default {
57
+ name: 'DSearchForm',
58
+ components: {
59
+ FormItem
60
+ },
61
+ model: {
62
+ prop: 'value',
63
+ event: 'change'
64
+ },
65
+ props: {
66
+ config: {
67
+ require: true,
68
+ default: () => [],
69
+ type: Array
70
+ },
71
+ cell: {
72
+ default: 6,
73
+ type: Number
74
+ },
75
+ gutter: {
76
+ default: 16,
77
+ type: Number
78
+ },
79
+ value: {
80
+ default: () => {},
81
+ type: Object
82
+ },
83
+ searchData: {
84
+ default: null,
85
+ type: Function
86
+ },
87
+ buttonSpan: {
88
+ default: 0,
89
+ type: Number
90
+ }
91
+ },
92
+ data() {
93
+ return {
94
+ list: [],
95
+ hiddenIndex: 0,
96
+ emptySpan: 0,
97
+ expend: false,
98
+ searchLoading: false,
99
+ // 判断是否有插槽节点,目前只在组件初始化完成时判断
100
+ hasSlot: false,
101
+ suffixSlot: true
102
+ }
103
+ },
104
+ computed: {
105
+ form: {
106
+ get() {
107
+ return this.value
108
+ },
109
+ set(value) {
110
+ this.$emit('change', value)
111
+ }
112
+ },
113
+ submitSpan() {
114
+ return this.buttonSpan || 24 / this.cell
115
+ },
116
+ spanList() {
117
+ return this.list.map((item) => item.span || Math.floor(24 / this.cell)) || []
118
+ },
119
+ showCol() {
120
+ return (index) => {
121
+ return this.expend || index < this.hiddenIndex
122
+ }
123
+ }
124
+ },
125
+ watch: {
126
+ config: {
127
+ handler() {
128
+ this.list = this.config.filter((item) => !item.hidden)
129
+ },
130
+ deep: true,
131
+ immediate: true
132
+ },
133
+ spanList: {
134
+ handler(val, oldVal) {
135
+ if (!val.length || JSON.stringify(val) === JSON.stringify(oldVal)) {
136
+ return
137
+ }
138
+ this.calcSpan()
139
+ },
140
+ deep: true,
141
+ immediate: true
142
+ }
143
+ },
144
+ created() {
145
+ initForm = cloneDeep(this.value)
146
+ this.$nextTick(() => {
147
+ this.hasSlot = !!(this.$slots.default && this.$slots.default.length)
148
+ this.calcSpan()
149
+ })
150
+ },
151
+ methods: {
152
+ /**
153
+ * @description: 查询
154
+ */
155
+ async search() {
156
+ this.$emit('search')
157
+ if (this.searchData) {
158
+ try {
159
+ this.searchLoading = true
160
+ await this.searchData({ pageNum: 1 }, this.form)
161
+ this.searchLoading = false
162
+ } catch (e) {
163
+ this.searchLoading = false
164
+ }
165
+ }
166
+ },
167
+ /**
168
+ * @description: 重置
169
+ */
170
+ async reset() {
171
+ this.form = cloneDeep(initForm)
172
+ this.$emit('search')
173
+ if (this.searchData) {
174
+ this.resetLoading = true
175
+ await this.searchData({ pageNum: 1 }, this.form)
176
+ this.resetLoading = false
177
+ }
178
+ },
179
+ /**
180
+ * @description: 展开/收起
181
+ */
182
+ changeStatus() {
183
+ this.expend = !this.expend
184
+ this.$emit('expand-change', this.expend)
185
+ },
186
+ calcSpan() {
187
+ let hiddenIndex = 1
188
+ const total = this.spanList.length
189
+ ? this.spanList.reduce((a, b, index) => {
190
+ const sum = a + b
191
+ if (hiddenIndex < 2) {
192
+ if (24 - sum < this.submitSpan) {
193
+ hiddenIndex = index
194
+ }
195
+ if (24 - sum >= this.submitSpan && index === this.spanList.length - 1) {
196
+ hiddenIndex = index + 1
197
+ }
198
+ }
199
+ return sum
200
+ })
201
+ : 0
202
+ this.hiddenIndex = hiddenIndex
203
+
204
+ const offsetSpan = 24 - (total % 24)
205
+ if (this.hasSlot) {
206
+ if (offsetSpan < this.submitSpan || offsetSpan === 24) {
207
+ this.suffixSlot = false
208
+ this.emptySpan = 0
209
+ } else {
210
+ this.suffixSlot = true
211
+ this.emptySpan =
212
+ offsetSpan >= this.submitSpan ? offsetSpan - this.submitSpan : 24 - this.submitSpan
213
+ }
214
+ } else {
215
+ this.emptySpan =
216
+ offsetSpan >= this.submitSpan ? offsetSpan - this.submitSpan : 24 - this.submitSpan
217
+ }
218
+ }
219
+ }
220
+ }
221
+ </script>
222
+
223
+ <style lang="scss">
224
+ .d-search-form {
225
+ margin-bottom: 4px;
226
+ .col-item {
227
+ align-items: end;
228
+ }
229
+ .el-select {
230
+ width: 100%;
231
+ .el-input_inner {
232
+ height: 32px;
233
+ }
234
+ }
235
+ &-btn {
236
+ text-align: right;
237
+ margin-bottom: 16px;
238
+ }
239
+ &-overflow {
240
+ margin-top: 24px;
241
+ }
242
+ .expend-btn {
243
+ padding: 4px 8px;
244
+ }
245
+ .d-search-item {
246
+ margin-bottom: 12px;
247
+ &-label {
248
+ margin-bottom: 4px;
249
+ font-weight: 400;
250
+ color: #333333;
251
+ }
252
+ .el-input__inner {
253
+ height: 32px !important;
254
+ }
255
+ }
256
+ }
257
+ </style>