@lx-frontend/wrap-element-ui 1.0.26 → 1.0.27

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 (113) hide show
  1. package/README.md +4 -54
  2. package/package.json +8 -38
  3. package/src/components/AddMembers/index.vue +149 -0
  4. package/src/components/AuditSteps/index.vue +140 -0
  5. package/src/components/DemoComponent/index.vue +21 -0
  6. package/src/components/EditableTable/README.md +147 -0
  7. package/{dist/vue2/types/components/EditableTable/bizHooks/index.d.ts → src/components/EditableTable/bizHooks/index.ts} +1 -1
  8. package/src/components/EditableTable/bizHooks/useCellHover.ts +72 -0
  9. package/src/components/EditableTable/bizHooks/useColumnHeaderOperation.ts +339 -0
  10. package/src/components/EditableTable/bizHooks/useDefaultOperation.ts +96 -0
  11. package/src/components/EditableTable/bizHooks/useDragSort.ts +291 -0
  12. package/src/components/EditableTable/bizHooks/usePagination.ts +31 -0
  13. package/src/components/EditableTable/bizHooks/useRowBgColor.ts +44 -0
  14. package/src/components/EditableTable/bizHooks/useViewSetting.ts +206 -0
  15. package/src/components/EditableTable/features/bizColorSelect.vue +63 -0
  16. package/src/components/EditableTable/features/bizEditCell.vue +44 -0
  17. package/src/components/EditableTable/features/bizTableHeaderPopover/BizCheckboxFilter.vue +40 -0
  18. package/src/components/EditableTable/features/bizTableHeaderPopover/BizColorRadioFilter.vue +56 -0
  19. package/src/components/EditableTable/features/bizTableHeaderPopover/BizDoubleDatePickerFilter.vue +94 -0
  20. package/src/components/EditableTable/features/bizTableHeaderPopover/BizInputFilter.vue +26 -0
  21. package/src/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.helper.ts +131 -0
  22. package/src/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.vue +115 -0
  23. package/src/components/EditableTable/features/bizTableHeaderPopover/BizRadioFilter.vue +39 -0
  24. package/src/components/EditableTable/features/bizTableHeaderPopover/BizSortFilter.vue +50 -0
  25. package/src/components/EditableTable/features/bizTableHeaderPopover/index.vue +160 -0
  26. package/src/components/EditableTable/features/bizTableOperatePopover.vue +67 -0
  27. package/src/components/EditableTable/features/bizViewSettingDialog.vue +137 -0
  28. package/src/components/EditableTable/index.less +820 -0
  29. package/src/components/EditableTable/index.vue +682 -0
  30. package/src/components/EditableTable/pin-top.png +0 -0
  31. package/src/components/EditableTable/types/index.ts +212 -0
  32. package/src/components/Ellipsis/MultilineEllipsis.vue +141 -0
  33. package/src/components/Ellipsis/index.vue +119 -0
  34. package/src/components/LxTable/index.vue +296 -0
  35. package/src/components/PopoverForm/index.vue +66 -0
  36. package/src/components/SearchForm/index.vue +262 -0
  37. package/src/components/SearchForm/types/index.ts +81 -0
  38. package/src/components/SearchSelect/index.vue +153 -0
  39. package/src/components/helper.ts +37 -0
  40. package/src/components/index.ts +24 -0
  41. package/src/components/singleMessage/index.ts +44 -0
  42. package/dist/auto/index.mjs +0 -21
  43. package/dist/auto/types/index.d.ts +0 -9
  44. package/dist/vue2/index.css +0 -1
  45. package/dist/vue2/index.mjs +0 -3017
  46. package/dist/vue2/types/components/AddMembers/index.vue.d.ts +0 -31
  47. package/dist/vue2/types/components/AuditSteps/index.vue.d.ts +0 -46
  48. package/dist/vue2/types/components/DemoComponent/index.vue.d.ts +0 -2
  49. package/dist/vue2/types/components/EditableTable/bizHooks/useCellHover.d.ts +0 -11
  50. package/dist/vue2/types/components/EditableTable/bizHooks/useColumnHeaderOperation.d.ts +0 -34
  51. package/dist/vue2/types/components/EditableTable/bizHooks/useDefaultOperation.d.ts +0 -22
  52. package/dist/vue2/types/components/EditableTable/bizHooks/useDragSort.d.ts +0 -14
  53. package/dist/vue2/types/components/EditableTable/bizHooks/usePagination.d.ts +0 -12
  54. package/dist/vue2/types/components/EditableTable/bizHooks/useRowBgColor.d.ts +0 -15
  55. package/dist/vue2/types/components/EditableTable/bizHooks/useViewSetting.d.ts +0 -26
  56. package/dist/vue2/types/components/EditableTable/features/bizColorSelect.vue.d.ts +0 -25
  57. package/dist/vue2/types/components/EditableTable/features/bizEditCell.vue.d.ts +0 -21
  58. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizCheckboxFilter.vue.d.ts +0 -21
  59. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizColorRadioFilter.vue.d.ts +0 -21
  60. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizDoubleDatePickerFilter.vue.d.ts +0 -21
  61. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizInputFilter.vue.d.ts +0 -21
  62. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.helper.d.ts +0 -48
  63. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.vue.d.ts +0 -21
  64. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizRadioFilter.vue.d.ts +0 -21
  65. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/BizSortFilter.vue.d.ts +0 -23
  66. package/dist/vue2/types/components/EditableTable/features/bizTableHeaderPopover/index.vue.d.ts +0 -311
  67. package/dist/vue2/types/components/EditableTable/features/bizTableOperatePopover.vue.d.ts +0 -32
  68. package/dist/vue2/types/components/EditableTable/features/bizViewSettingDialog.vue.d.ts +0 -30
  69. package/dist/vue2/types/components/EditableTable/index.vue.d.ts +0 -472
  70. package/dist/vue2/types/components/EditableTable/types/index.d.ts +0 -235
  71. package/dist/vue2/types/components/Ellipsis/MultilineEllipsis.vue.d.ts +0 -91
  72. package/dist/vue2/types/components/Ellipsis/index.vue.d.ts +0 -89
  73. package/dist/vue2/types/components/LxTable/index.vue.d.ts +0 -2
  74. package/dist/vue2/types/components/PopoverForm/index.vue.d.ts +0 -50
  75. package/dist/vue2/types/components/SearchForm/index.vue.d.ts +0 -116
  76. package/dist/vue2/types/components/SearchForm/types/index.d.ts +0 -65
  77. package/dist/vue2/types/components/SearchSelect/index.vue.d.ts +0 -53
  78. package/dist/vue2/types/components/helper.d.ts +0 -8
  79. package/dist/vue2/types/components/index.d.ts +0 -12
  80. package/dist/vue2/types/components/singleMessage/index.d.ts +0 -4
  81. package/dist/vue2/types/vue2/index.d.ts +0 -1363
  82. package/dist/vue3/index.css +0 -1
  83. package/dist/vue3/index.mjs +0 -2306
  84. package/dist/vue3/index.mjs.map +0 -1
  85. package/dist/vue3/types/components/EditableTable/features/bizColorSelect.vue.d.ts +0 -31
  86. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizCheckboxFilter.vue.d.ts +0 -23
  87. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizColorRadioFilter.vue.d.ts +0 -23
  88. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizDoubleDatePickerFilter.vue.d.ts +0 -23
  89. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizInputFilter.vue.d.ts +0 -23
  90. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.helper.d.ts +0 -48
  91. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.vue.d.ts +0 -23
  92. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizRadioFilter.vue.d.ts +0 -23
  93. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/BizSortFilter.vue.d.ts +0 -25
  94. package/dist/vue3/types/components/EditableTable/features/bizTableHeaderPopover/index.vue.d.ts +0 -77
  95. package/dist/vue3/types/components/EditableTable/features/bizTableOperatePopover.vue.d.ts +0 -36
  96. package/dist/vue3/types/components/EditableTable/features/bizViewSettingDialog.vue.d.ts +0 -35
  97. package/dist/vue3/types/components/EditableTable/hooks/index.d.ts +0 -9
  98. package/dist/vue3/types/components/EditableTable/hooks/useCellHover.d.ts +0 -19
  99. package/dist/vue3/types/components/EditableTable/hooks/useColumnHeaderOperation.d.ts +0 -37
  100. package/dist/vue3/types/components/EditableTable/hooks/useDefaultOperation.d.ts +0 -22
  101. package/dist/vue3/types/components/EditableTable/hooks/useDragSort.d.ts +0 -15
  102. package/dist/vue3/types/components/EditableTable/hooks/usePagination.d.ts +0 -12
  103. package/dist/vue3/types/components/EditableTable/hooks/useRowBgColor.d.ts +0 -18
  104. package/dist/vue3/types/components/EditableTable/hooks/useRowEdit.d.ts +0 -14
  105. package/dist/vue3/types/components/EditableTable/hooks/useTableRender.d.ts +0 -41
  106. package/dist/vue3/types/components/EditableTable/hooks/useViewSetting.d.ts +0 -26
  107. package/dist/vue3/types/components/EditableTable/index.vue.d.ts +0 -4478
  108. package/dist/vue3/types/components/EditableTable/types.d.ts +0 -419
  109. package/dist/vue3/types/components/helper.d.ts +0 -8
  110. package/dist/vue3/types/index.d.ts +0 -7
  111. package/dist/vue3/types/stories/EditableTable.fake.d.ts +0 -33
  112. package/dist/vue3/types/stories/EditableTable.hook.d.ts +0 -12
  113. package/dist/vue3/types/stories/EditableTable.stories.d.ts +0 -18
@@ -0,0 +1,296 @@
1
+
2
+ <!--
3
+ @row-click="handleRowClick" 当某一行被点击时会触发该事件
4
+ @cell-click="handleCellClick" 当某个单元格被点击时会触发该事件
5
+ @sort-change="sortChange" 排序触发事件
6
+ sortable 配置排序
7
+ default-sort: prop默认字段 order排序方式
8
+ slot='key_header' scopeHeader 支持表头可自定义
9
+ highlightCurrentRow 单行选中状态
10
+ -->
11
+ <template>
12
+ <div class="table-content">
13
+ <FElTable
14
+ ref="lxTableRef"
15
+ v-loading="loading"
16
+ v-bind="$attrs"
17
+ :data="tableData"
18
+ :empty-text="(customConfig || {}).emptyText || ''"
19
+ :highlight-current-row="highlightCurrentRow"
20
+ :row-class-name="tableRowClassName"
21
+ :default-sort="(customConfig || {}).sortValue || defaultSort"
22
+ @selection-change="handleSelectionChange"
23
+ @row-click="handleRowClick"
24
+ @cell-click="handleCellClick"
25
+ @sort-change="sortChange"
26
+ >
27
+ <ElTableColumn
28
+ v-if="customConfig.selection && customConfig.selection.isOpenSelection"
29
+ type="selection"
30
+ :width="customConfig.selection.width"
31
+ />
32
+ <ElTableColumn
33
+ v-for="(item, index) in cloumns"
34
+ :key="`${item}_${index}`"
35
+ :label="item"
36
+ :prop="keys[index]"
37
+ :sortable="getFieldFromConfig(keys[index], 'sortable')"
38
+ :width="getFieldFromConfig(keys[index], 'width')"
39
+ :min-width="getFieldFromConfig(keys[index], 'minWidth')"
40
+ :fixed="getFieldFromConfig(keys[index], 'fixed')"
41
+ >
42
+ <template
43
+ slot="header"
44
+ slot-scope="scope"
45
+ >
46
+ <slot
47
+ v-if="getFieldFromConfig(keys[index], 'scopeHeader')"
48
+ template
49
+ :name="`${keys[index]}_header`"
50
+ :keys="keys[index]"
51
+ :row="scope.row"
52
+ :lable="scope.column"
53
+ :column="scope.$index"
54
+ />
55
+ <span v-else>
56
+ {{ item }}
57
+ </span>
58
+ </template>
59
+ <template slot-scope="scope">
60
+ <!-- 支持keys字段为'car.id'或者'id' -->
61
+ <div v-if="keys[index].indexOf('.') != -1">
62
+ <!-- 一个td需要展示多个字段名 -->
63
+ <div v-if="Array.isArray(keys[index])">
64
+ <div
65
+ v-for="(array, i) in keys[index]"
66
+ :key="i"
67
+ >
68
+ {{ scope.row[array] }}
69
+ </div>
70
+ </div>
71
+ <!-- 字段formatters存在,数据过滤-->
72
+ <span
73
+ v-else-if="getFieldFromConfig(keys[index], 'formatters')"
74
+ >
75
+ {{ formatterMethods(scope.row[keys[index].split('.')[0]][keys[index].split('.')[1]], (customConfig[keys[index]].formatters)) }}
76
+ </span>
77
+ <!-- 复杂情况需要自定义---当前keys存在于customConfig.template数据定义中,传入slot的name作为唯一标识符 -->
78
+ <slot
79
+ v-else-if="getFieldFromConfig(keys[index], 'template')"
80
+ template
81
+ :name="keys[index]"
82
+ :keys="keys[index]"
83
+ :row="scope.row"
84
+ :lable="scope.column"
85
+ :column="scope.$index"
86
+ />
87
+ <div v-else>
88
+ <!-- 传入不需要截取的列 -->
89
+ <span v-if="getFieldFromConfig(keys[index], 'templateCutOut')">
90
+ {{ scope.row[keys[index].split('.')[0]][keys[index].split('.')[1]] | formateValue }}
91
+ </span>
92
+ <Ellipsis
93
+ v-else
94
+ :popover-name="popoverName"
95
+ :line-count="getFieldFromConfig(keys[index], 'lineCount')"
96
+ :content="[`${scope.row[keys[index].split('.')[0]][keys[index].split('.')[1]]}`] | formateValue"
97
+ >
98
+ <div slot="popover">
99
+ <div>{{ scope.row[keys[index].split('.')[0]][keys[index].split('.')[1]] | formateValue }}</div>
100
+ </div>
101
+ </Ellipsis>
102
+ </div>
103
+ </div>
104
+ <div v-else>
105
+ <!-- 一个td需要展示多个字段名 -->
106
+ <div v-if="Array.isArray(keys[index])">
107
+ <div
108
+ v-for="(array, i) in keys[index]"
109
+ :key="i"
110
+ >
111
+ {{ scope.row[array] }}
112
+ </div>
113
+ </div>
114
+ <!-- 字段formatters存在,数据过滤-->
115
+ <span
116
+ v-else-if="getFieldFromConfig(keys[index], 'formatters')"
117
+ >
118
+ {{ formatterMethods(scope.row[keys[index]], (customConfig[keys[index]].formatters)) }}
119
+ </span>
120
+ <!-- 复杂情况需要自定义---当前keys存在于customConfig.template数据定义中,传入slot的name作为唯一标识符 -->
121
+ <slot
122
+ v-else-if="getFieldFromConfig(keys[index], 'template')"
123
+ template
124
+ :name="keys[index]"
125
+ :keys="keys[index]"
126
+ :row="scope.row"
127
+ :lable="scope.column"
128
+ :column="scope.$index"
129
+ />
130
+ <div v-else>
131
+ <!-- 传入不需要截取的列 -->
132
+ <span v-if="getFieldFromConfig(keys[index], 'templateCutOut')">
133
+ {{ scope.row[keys[index]] | formateValue }}
134
+ </span>
135
+ <Ellipsis
136
+ v-else
137
+ :popover-name="popoverName"
138
+ :line-count="getFieldFromConfig(keys[index], 'lineCount')"
139
+ :content="[`${scope.row[keys[index]]}`] | formateValue"
140
+ >
141
+ <div slot="popover">
142
+ <div>{{ scope.row[keys[index]] | formateValue }}</div>
143
+ </div>
144
+ </Ellipsis>
145
+ </div>
146
+ </div>
147
+ </template>
148
+ </ElTableColumn>
149
+ </FElTable>
150
+ <ElPagination
151
+ :background="background"
152
+ v-if="currentPage"
153
+ :current-page="currentPage"
154
+ :page-size="pageSize"
155
+ :total="totals"
156
+ layout="total, prev, pager, next, jumper, slot"
157
+ @current-change="handleCurrentChange"
158
+ />
159
+ </div>
160
+ </template>
161
+ <script>
162
+ import Ellipsis from '../Ellipsis';
163
+ import { Table } from 'element-ui'
164
+ const FElTable = {
165
+ extends: Table,
166
+ methods: {
167
+ doLayout (...args) {
168
+ Table.methods.doLayout.call(this, ...args)
169
+ this.fixLayout() // Looks like we can do it once?
170
+ },
171
+ fixLayout () {
172
+ // Safari header/content misalign fix (possible other browsers?)
173
+ this.columns.forEach(c => {
174
+ // element-ui/packages/table/src/layout-observer.js:49
175
+ const width = c.realWidth || c.width
176
+ const th = this.$el.querySelector(`table.el-table__header th.${c.id}`)
177
+ if (th) {
178
+ if (th.offsetWidth !== width) {
179
+ th.style = `min-width: ${width}px; max-width: ${width}px;`
180
+ }
181
+ let td
182
+ for (td of this.$el.querySelectorAll(`table.el-table__body td.${c.id}`)) {
183
+ if (td.offsetWidth === width) break
184
+ td.style = `min-width: ${width}px; max-width: ${width}px;`
185
+ }
186
+ }
187
+ })
188
+ }
189
+ }
190
+ }
191
+
192
+ export default {
193
+ name: 'LxTable',
194
+ components: {
195
+ Ellipsis,
196
+ FElTable
197
+ },
198
+ filters: {
199
+ formateValue (val) {
200
+ if (Array.isArray(val) && (val[0] === 'null' || val[0] === '')) {
201
+ val = '';
202
+ }
203
+ return (val || val === 0) ? val : '--';
204
+ },
205
+ },
206
+ props: {
207
+ tableData: {
208
+ type : Array,
209
+ default: () => [],
210
+ },
211
+ cloumns: {
212
+ type : Array,
213
+ default: () => [],
214
+ },
215
+ customConfig: Object,
216
+ keys: {
217
+ type : Array,
218
+ default: () => [],
219
+ },
220
+ defaultSort: {
221
+ prop: '',
222
+ order: null,
223
+ },
224
+ stripe: {
225
+ type: Boolean,
226
+ default: true,
227
+ },
228
+ loading: {
229
+ type: Boolean,
230
+ default: false,
231
+ },
232
+ background: {
233
+ type: Boolean,
234
+ default: true,
235
+ },
236
+ totals: Number,
237
+ pageSize: Number,
238
+ currentPage: Number,
239
+ popoverName: String,
240
+ parentFn: {
241
+ type : String,
242
+ default: '',
243
+ },
244
+ highlightCurrentRow: {
245
+ type: Boolean,
246
+ default: true,
247
+ },
248
+ tableRowClassName: {},
249
+ },
250
+ data() {
251
+ return {
252
+ scope: 'scope',
253
+ };
254
+ },
255
+ methods: {
256
+ handleCurrentChange(val) {
257
+ this.$emit('handleCurrentChange', val);
258
+ },
259
+ handleSelectionChange(val) {
260
+ this.$emit('handleSelectionChange', val);
261
+ },
262
+ handleRowClick(row, column, cell, event) {
263
+ this.$emit('handleRowClick', row, column, cell, event);
264
+ },
265
+ handleCellClick(row, column, cell, event){
266
+ this.$emit('handleCellClick', row, column, cell, event);
267
+ },
268
+ sortChange(column, prop, order) {
269
+ this.$emit('sortChange', column, prop, order);
270
+ },
271
+ formatterMethods(key, keyData) {
272
+ // 返回数据,可类型转换; 可添加单位;
273
+ let value = '--';
274
+ if (key || key === 0) {
275
+ const keyValue = keyData[key] || key;
276
+ const unit = keyData.unit || '';
277
+ value = `${keyValue}${unit}`;
278
+ }
279
+ return value;
280
+ },
281
+ formateValue (val) {
282
+ return val || val === 0 ? val : '--';
283
+ },
284
+ getFieldFromConfig(index, name) {
285
+ return this.customConfig && this.customConfig[index] && this.customConfig[index][name];
286
+ },
287
+ }
288
+ }
289
+ </script>
290
+ <style type="scss">
291
+ .table-content .el-pagination {
292
+ text-align: right;
293
+ padding: 14px 0;
294
+ }
295
+ </style>
296
+
@@ -0,0 +1,66 @@
1
+ <template>
2
+ <el-popover :placement="placement" :disabled="isDisabled" :width="width || 300" v-model="show" trigger="click" :visible-arrow="true">
3
+ <div class="el-popover__header">
4
+ {{title}}
5
+ <slot name="title"></slot>
6
+ <el-button type="text" icon="el-icon-close" @click="handleClose"></el-button>
7
+ </div>
8
+ <slot name="form"></slot>
9
+
10
+ <div v-if="withSubmitBtn" class="el-popover__footer">
11
+ <slot name="footer"></slot>
12
+ <el-button type="primary" class="wp100" @click="handleSubmit">{{ okText }}</el-button>
13
+ </div>
14
+ <span slot='reference'>
15
+ <slot name='reference'></slot>
16
+ </span>
17
+ </el-popover>
18
+ </template>
19
+ <script>
20
+ export default {
21
+ name: 'PopoverForm',
22
+ props: {
23
+ title: String,
24
+ width: Number,
25
+ placement: {
26
+ type: String,
27
+ default: 'left',
28
+ },
29
+ withSubmitBtn: {
30
+ type: Boolean,
31
+ default: true,
32
+ },
33
+ isDisabled: {
34
+ type: Boolean,
35
+ default: false,
36
+ },
37
+ okText: {
38
+ type: String,
39
+ default: '确认',
40
+ },
41
+ },
42
+ data() {
43
+ return {
44
+ show: false,
45
+ };
46
+ },
47
+ methods: {
48
+ handleClose() {
49
+ this.show = false;
50
+ },
51
+ handleSubmit() {
52
+ this.$emit('on-sure');
53
+ },
54
+ },
55
+ watch: {
56
+ show(val) {
57
+ this.$emit('on-change', val);
58
+ },
59
+ },
60
+ };
61
+ </script>
62
+ <style type="scss" scoped>
63
+ .wp100{
64
+ width: 100%;
65
+ }
66
+ </style>
@@ -0,0 +1,262 @@
1
+ <template>
2
+ <el-form
3
+ class="search-form"
4
+ :inline="isInline"
5
+ :label-width="width"
6
+ :label-position="labelPosition"
7
+ >
8
+ <el-form-item
9
+ v-for="({
10
+ isEmpty = true, key, type, prop, label, labelWidth, placeholder, candidate, filterable=false, withoutAll=false, collapseTags=false,
11
+ clearable=false, multiple=false, multipleLimit=0, changeCb, inputLimitCallback, slotName, dateType='date', rangeSeparator,
12
+ doubleIsInline = true, maxlength = 255, pickerOptions, limit, required = false
13
+ }) in config"
14
+ :required="required"
15
+ :key="label"
16
+ :label="showLabel ? label : ''"
17
+ :label-width="labelWidth || width"
18
+ style="margin-right: 10px"
19
+ >
20
+ <el-input
21
+ v-if="type === 'input'"
22
+ :placeholder="placeholder ? placeholder : showLabel ? '请输入' : label"
23
+ :value="formData[prop]"
24
+ :maxlength="maxlength"
25
+ @input="val => handleInput(val, prop, inputLimitCallback)"
26
+ />
27
+ <div
28
+ v-if="type === 'doubleInput'"
29
+ :class="doubleIsInline ? 'form-double-inline': ''"
30
+ >
31
+ <el-input
32
+ @input="val => handleInput(val, prop[0], inputLimitCallback)"
33
+ :value="formData[prop[0]]"
34
+ :placeholder="(placeholder || [])[0] || '请输入'"
35
+ />
36
+ <el-input
37
+ :placeholder="(placeholder || [])[1] || '请输入'"
38
+ :value="formData[prop[1]]"
39
+ @input="val => handleInput(val, prop[1], inputLimitCallback)"
40
+ />
41
+ </div>
42
+ <el-select
43
+ v-if="type === 'select'"
44
+ :value="formData[prop]"
45
+ :placeholder="placeholder ? placeholder : showLabel ? '请输入' : label"
46
+ :clearable="clearable"
47
+ @input="val => handleInput(val, prop)"
48
+ @change="(...args) => changeCb && changeCb(...args)"
49
+ :filterable="filterable"
50
+ :multiple="multiple"
51
+ :multiple-limit="multipleLimit"
52
+ :collapse-tags="collapseTags"
53
+ >
54
+ <el-option
55
+ v-if="!withoutAll"
56
+ value=""
57
+ :label="showLabel ? '全部' : label"
58
+ />
59
+ <el-option
60
+ v-for="({name, value, code, id}) in candidate"
61
+ :key="value || code || id"
62
+ :value="value || code || id"
63
+ :label="name"
64
+ />
65
+ </el-select>
66
+ <el-date-picker
67
+ v-if="type === 'datePicker'"
68
+ @input="val => handleInput(val, prop)"
69
+ @change="(...args) => changeCb && changeCb(...args)"
70
+ :value="formData[prop]"
71
+ format="yyyy-MM-dd"
72
+ value-format="yyyy-MM-dd"
73
+ :type="dateType"
74
+ :range-separator="rangeSeparator || '到'"
75
+ :placeholder="dateType == 'date' ? placeholder || '选择日期' : '选择日期范围'"
76
+ start-placeholder="开始日期"
77
+ end-placeholder="结束日期"
78
+ :picker-options="pickerOptions"
79
+ />
80
+ <div
81
+ v-if="type === 'doubleDatePicker'"
82
+ :class="doubleIsInline ? 'form-double-inline': ''"
83
+ >
84
+ <el-date-picker
85
+ @input="val => handleInput(val, prop[0], '', key)"
86
+ @change="(...args) => changeCb && changeCb(...args)"
87
+ :value="formData[prop[0]]"
88
+ value-format="yyyy-MM-dd"
89
+ format="yyyy-MM-dd"
90
+ type="date"
91
+ :editable="false"
92
+ :placeholder="(placeholder || [])[0] || '开始日期'"
93
+ :picker-options="pickerOptions?.start || genStartDateDisabledOptions(formData[prop[1]], limit)"
94
+ />
95
+ <el-date-picker
96
+ @input="val => handleInput(val, prop[1], '', key)"
97
+ @change="(...args) => changeCb && changeCb(...args)"
98
+ :value="formData[prop[1]]"
99
+ value-format="yyyy-MM-dd"
100
+ format="yyyy-MM-dd"
101
+ type="date"
102
+ :editable="false"
103
+ :placeholder="(placeholder || [])[1] || '结束日期'"
104
+ :picker-options="pickerOptions?.end || genEndDateDisabledOptions(formData[prop[0]], limit)"
105
+ />
106
+ <el-checkbox
107
+ :value="checkedIds[key]"
108
+ v-if="isEmpty"
109
+ @change="(value) => handelIsEmpty(prop, value, key)"
110
+ class="is-empty"
111
+ >
112
+ 空白
113
+ </el-checkbox>
114
+ </div>
115
+ <slot
116
+ v-if="type === 'slot'"
117
+ :name="slotName"
118
+ />
119
+ </el-form-item>
120
+ <span v-if="isShowSearchBtn">
121
+ <el-button
122
+ class="search"
123
+ @click="handleSearch"
124
+ type="primary"
125
+ >{{ searchText }}</el-button>
126
+ <el-button
127
+ v-if="showClear"
128
+ @click="handleClearParams"
129
+ >{{ clearText }}</el-button>
130
+ </span>
131
+ </el-form>
132
+ </template>
133
+
134
+ <script>
135
+ import { genStartDateDisabledOptions, genEndDateDisabledOptions } from '../helper';
136
+
137
+ export default {
138
+ name: 'SearchForm',
139
+ props: {
140
+ labelPosition: {
141
+ default: 'right',
142
+ type: String
143
+ },
144
+ isShowSearchBtn: {
145
+ default: true,
146
+ type: Boolean
147
+ },
148
+ isInline: {
149
+ default: false,
150
+ type: Boolean
151
+ },
152
+ config: {
153
+ required: true,
154
+ type: Array
155
+ },
156
+ width: {
157
+ default: '100px',
158
+ type: String
159
+ },
160
+ formData: {
161
+ required: true
162
+ },
163
+ showClear: {
164
+ default: true,
165
+ type: Boolean
166
+ },
167
+ showLabel: {
168
+ default: true,
169
+ type: Boolean
170
+ },
171
+ ownerClear: {
172
+ type: Function
173
+ },
174
+ resetCheckedIds: {
175
+ type: Boolean
176
+ },
177
+ searchText: {
178
+ default: '搜索',
179
+ type: String
180
+ },
181
+ clearText: {
182
+ default: '清除',
183
+ type: String
184
+ }
185
+ },
186
+ data () {
187
+ return {
188
+ visible: true,
189
+ initialData: {},
190
+ checkedIds: {}
191
+ }
192
+ },
193
+ watch: {
194
+ resetCheckedIds () {
195
+ this.config.filter(c => c.type === 'doubleDatePicker').map(t => t.key).forEach(k => {
196
+ this.$set(this.checkedIds, k, false)
197
+ })
198
+ }
199
+ },
200
+ mounted () {
201
+ this.initialData = Object.freeze({ ...this.formData })
202
+ },
203
+ methods: {
204
+ genStartDateDisabledOptions,
205
+ genEndDateDisabledOptions,
206
+ handleInput (val, prop, inputLimitCallback, key) {
207
+ if (inputLimitCallback && !inputLimitCallback(val)) return false
208
+ if (val) {
209
+ this.$set(this.checkedIds, key, false)
210
+ }
211
+ this.$emit('update:formData', { ...this.formData, [prop]: val })
212
+ this.$emit('isPickerEmpty', this.checkedIds)
213
+ },
214
+
215
+ handleSearch () {
216
+ this.$emit('search', this.formData)
217
+ },
218
+
219
+ handelIsEmpty (prop, value, key) {
220
+ if (value) {
221
+ // eslint-disable-next-line
222
+ this.formData[prop[0]] = '';
223
+ // eslint-disable-next-line
224
+ this.formData[prop[1]] = '';
225
+ }
226
+ this.$set(this.checkedIds, key, value)
227
+ this.$emit('isPickerEmpty', this.checkedIds)
228
+ },
229
+
230
+ handleClearParams () { // 父组件可以通过调用 `this.$refs[xx].handleClearParams()` 来清空表单数据
231
+ if (this.ownerClear && typeof this.ownerClear === 'function') {
232
+ this.ownerClear()
233
+ return
234
+ }
235
+ Object.keys(this.checkedIds).forEach((k) => {
236
+ this.checkedIds[k] = false
237
+ })
238
+ this.$emit('update:formData', { ...this.formData, ...this.initialData })
239
+ this.$emit('clear')
240
+ },
241
+
242
+ handleFormClose () {
243
+ this.visible = false;
244
+ },
245
+ }
246
+ }
247
+ </script>
248
+ <style scoped lang="less">
249
+ .form-double-inline {
250
+ display: flex;
251
+ & .el-input {
252
+ &:not(:first-child) {
253
+ margin-left: 4px;
254
+ }
255
+ }
256
+ & .el-date-editor{
257
+ &:not(:first-child){
258
+ margin-left: 4px;
259
+ }
260
+ }
261
+ }
262
+ </style>
@@ -0,0 +1,81 @@
1
+ import { DatePicker } from "element-ui/types/element-ui"
2
+
3
+ type BaseOption = {
4
+ label: string
5
+ prop: string
6
+ labelWidth?: string
7
+ clearable?: boolean
8
+ placeholder?: string
9
+ key?: string
10
+ changeCb?: (value: any) => any
11
+ }
12
+
13
+ type SlotOption = Omit<BaseOption, 'prop'> & {
14
+ prop?: string
15
+ type: 'slot'
16
+ slotName: string
17
+ }
18
+
19
+ type InputOption = BaseOption & {
20
+ type: 'input'
21
+ inputLimitCallback?: (value: string) => boolean
22
+ maxlength?: number
23
+ }
24
+
25
+ type SelectOption = BaseOption & {
26
+ type: 'select'
27
+ multiple?: boolean
28
+ filterable?: boolean
29
+ multipleLimit?: number
30
+ collapseTags?: boolean
31
+ withoutAll?: boolean
32
+ candidate: {
33
+ name: string
34
+ value?: string | number
35
+ id?: string | number
36
+ code?: string | number
37
+ }[]
38
+ }
39
+
40
+ type DatePickerOption = BaseOption & {
41
+ type: 'datePicker'
42
+ dateType?: string
43
+ rangeSeparator?: string
44
+ datePickerOptions?: DatePicker['pickerOptions']
45
+ }
46
+
47
+ type BaseDoubleOption = Omit<BaseOption, 'prop'> & {
48
+ doubleIsInline?: boolean
49
+ prop: [string, string]
50
+ }
51
+
52
+ type DoubleInputOption = BaseDoubleOption & {
53
+ type: 'doubleInput'
54
+ inputLimitCallback?: (value: string) => boolean
55
+ }
56
+
57
+ type DoubleDatePickerOptionBase = BaseDoubleOption & {
58
+ type: 'doubleDatePicker'
59
+ isEmpty?: boolean
60
+ placeholder?: [string, string]
61
+ }
62
+
63
+ type DoubleDatePickerOption = DoubleDatePickerOptionBase & {
64
+ pickerOptions?: {
65
+ start?: DatePicker['pickerOptions']
66
+ end?: DatePicker['pickerOptions']
67
+ }
68
+ }
69
+
70
+ type DoubleDatePickerOptionLimit = DoubleDatePickerOptionBase & {
71
+ limit?: number
72
+ }
73
+
74
+ export type SearchFormConfigOption =
75
+ | InputOption
76
+ | SelectOption
77
+ | DatePickerOption
78
+ | DoubleInputOption
79
+ | DoubleDatePickerOption
80
+ | DoubleDatePickerOptionLimit
81
+ | SlotOption