element-ui-pro-components-test 1.5.0

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 (53) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/lib/dialog-form.js +1175 -0
  5. package/lib/editable-pro-table.js +2080 -0
  6. package/lib/element-ui-pro-components.common.js +193 -0
  7. package/lib/index.js +1 -0
  8. package/lib/locale/index.js +44 -0
  9. package/lib/locale/lang/en.js +46 -0
  10. package/lib/locale/lang/zh-CN.js +46 -0
  11. package/lib/pro-form.js +1036 -0
  12. package/lib/pro-table.js +2779 -0
  13. package/lib/theme-chalk/editable-pro-table.css +1 -0
  14. package/lib/theme-chalk/index.css +1 -0
  15. package/lib/theme-chalk/pro-table.css +1 -0
  16. package/lib/umd/locale/en.js +67 -0
  17. package/lib/umd/locale/zh-CN.js +67 -0
  18. package/lib/utils/breakpoints.js +68 -0
  19. package/lib/utils/debounce.js +20 -0
  20. package/lib/utils/form.js +108 -0
  21. package/package.json +78 -0
  22. package/packages/dialog-form/index.js +9 -0
  23. package/packages/dialog-form/src/components/Submitter.vue +47 -0
  24. package/packages/dialog-form/src/index.vue +404 -0
  25. package/packages/editable-pro-table/index.js +9 -0
  26. package/packages/editable-pro-table/src/components/Editable.vue +203 -0
  27. package/packages/editable-pro-table/src/components/FormItem.vue +193 -0
  28. package/packages/editable-pro-table/src/components/RecordCreator.vue +43 -0
  29. package/packages/editable-pro-table/src/components/RenderCell.vue +181 -0
  30. package/packages/editable-pro-table/src/index.vue +805 -0
  31. package/packages/pro-form/index.js +9 -0
  32. package/packages/pro-form/src/components/Submitter.vue +47 -0
  33. package/packages/pro-form/src/index.vue +309 -0
  34. package/packages/pro-table/index.js +9 -0
  35. package/packages/pro-table/src/components/ColumnAlignSettings.vue +77 -0
  36. package/packages/pro-table/src/components/ColumnSettings.vue +172 -0
  37. package/packages/pro-table/src/components/ColumnSettingsItem.vue +401 -0
  38. package/packages/pro-table/src/components/svg/ArrowIcon.vue +16 -0
  39. package/packages/pro-table/src/components/svg/HolderIcon.vue +17 -0
  40. package/packages/pro-table/src/components/svg/SettingIcon.vue +20 -0
  41. package/packages/pro-table/src/components/svg/VerticalAlginBottomIcon.vue +17 -0
  42. package/packages/pro-table/src/components/svg/VerticalAlginMiddleIcon.vue +17 -0
  43. package/packages/pro-table/src/components/svg/VerticalAlignTopIcon.vue +17 -0
  44. package/packages/pro-table/src/index.vue +934 -0
  45. package/src/components/custom-render/index.vue +16 -0
  46. package/src/components/pro-form-item/index.vue +129 -0
  47. package/src/index.js +57 -0
  48. package/src/locale/index.js +47 -0
  49. package/src/locale/lang/en.js +46 -0
  50. package/src/locale/lang/zh-CN.js +46 -0
  51. package/src/utils/breakpoints.js +61 -0
  52. package/src/utils/debounce.js +22 -0
  53. package/src/utils/form.js +94 -0
@@ -0,0 +1,193 @@
1
+ <template>
2
+ <el-form-item
3
+ v-bind="normalizedFormItem"
4
+ :prop="formItemProp"
5
+ label=""
6
+ class="editable-form-item is-editable"
7
+ >
8
+ <!-- 自定义渲染 -->
9
+ <!-- start -->
10
+ <CustomRender
11
+ v-if="formItem.renderField"
12
+ :render="() => formItem.renderField({ form, formItem, recordKey, index })"
13
+ />
14
+ <slot
15
+ v-else-if="formItem.valueType === 'slot'"
16
+ :name="formItem.prop"
17
+ ></slot>
18
+ <!-- end -->
19
+ <!-- 元素渲染 -->
20
+ <!-- start -->
21
+ <component
22
+ v-else
23
+ :is="`el-${formItem.valueType}`"
24
+ v-model="form[formItem.prop]"
25
+ v-bind="formItem.fieldProps"
26
+ v-on="normalizedFieldEvents"
27
+ >
28
+ <!-- Select -->
29
+ <!-- start -->
30
+ <template v-if="formItem.valueType === 'select'">
31
+ <!-- Option Group -->
32
+ <!-- start -->
33
+ <template v-if="isOptionGroup">
34
+ <el-option-group
35
+ v-for="group in formItem.options"
36
+ v-bind="group"
37
+ :key="group.label"
38
+ >
39
+ <el-option
40
+ v-for="option in group.options"
41
+ v-bind="option"
42
+ :key="option.value"
43
+ ></el-option>
44
+ </el-option-group>
45
+ </template>
46
+ <!-- end -->
47
+ <!-- Option -->
48
+ <!-- start -->
49
+ <template v-else>
50
+ <el-option
51
+ v-for="option in formItem.options"
52
+ v-bind="option"
53
+ :key="option.value"
54
+ ></el-option>
55
+ </template>
56
+ <!-- end -->
57
+ </template>
58
+ <!-- end -->
59
+ <template v-else-if="groups.includes(formItem.valueType)">
60
+ <component
61
+ :is="selection[formItem.valueType]"
62
+ v-for="option in formItem.options"
63
+ :label="option.value"
64
+ :key="option.value"
65
+ >
66
+ {{ option.label }}
67
+ </component>
68
+ </template>
69
+ </component>
70
+ <!-- end -->
71
+ </el-form-item>
72
+ </template>
73
+
74
+ <script>
75
+ import CustomRender from '@/components/custom-render'
76
+
77
+ export default {
78
+ name: 'FormItem',
79
+ components: {
80
+ CustomRender,
81
+ },
82
+ props: {
83
+ // formItem 项
84
+ formItem: {
85
+ type: Object,
86
+ required: true
87
+ },
88
+ // 表单数据
89
+ form: {
90
+ type: Object,
91
+ required: true
92
+ },
93
+ // 可编辑表格名称
94
+ name: {
95
+ type: String,
96
+ },
97
+ recordKey: {
98
+ type: [Number, String],
99
+ },
100
+ // 下标
101
+ index: {
102
+ type: Number
103
+ },
104
+ // el-form-item prop
105
+ formItemProp: {
106
+ type: String
107
+ }
108
+ },
109
+ computed: {
110
+ // 过滤 el-form-item 的属性
111
+ normalizedFormItem() {
112
+ const {
113
+ valueType,
114
+ renderField,
115
+ fieldProps,
116
+ fieldEvents,
117
+ options,
118
+ valueEnum,
119
+ optionLoader,
120
+ initialValue,
121
+ colProps,
122
+ ...keys
123
+ } = this.formItem
124
+ return keys
125
+ },
126
+ // 表单事件
127
+ normalizedFieldEvents() {
128
+ const { formItem: { fieldEvents } } = this
129
+
130
+ if (!fieldEvents) {
131
+ return
132
+ }
133
+
134
+ const newEvents = {}
135
+ const { recordKey, form: row, index } = this
136
+ for (const eventName in fieldEvents) {
137
+ const handler = (...args) => fieldEvents[eventName]?.(...args, {
138
+ recordKey,
139
+ row,
140
+ index,
141
+ })
142
+
143
+ newEvents[eventName] = handler
144
+ }
145
+
146
+ return newEvents
147
+ },
148
+ isOptionGroup() {
149
+ return this.formItem.options?.[0]?.options
150
+ }
151
+ },
152
+ data() {
153
+ return {
154
+ groups: ['radio-group', 'checkbox-group'], // valueType
155
+ selection: { // 选项组对应的组件
156
+ 'radio-group': 'el-radio',
157
+ 'checkbox-group': 'el-checkbox'
158
+ }
159
+ }
160
+ },
161
+ }
162
+ </script>
163
+
164
+ <style lang="less" scoped>
165
+ .editable-form-item.el-form-item {
166
+ &.is-editable{
167
+ /* 防止 show-overflow-tooltip 触发 */
168
+ width: calc(100% - 1px);
169
+ }
170
+ }
171
+
172
+ .editable-form-item.is-required {
173
+ position: relative;
174
+
175
+ &::before {
176
+ content: '*';
177
+ color: #f56c6c;
178
+ position: absolute;
179
+ left: -8px;
180
+ }
181
+ }
182
+
183
+ .editable-form-item {
184
+ ::v-deep .el-form-item__content {
185
+ .el-select,
186
+ .el-input-number,
187
+ .el-date-editor,
188
+ .el-cascader {
189
+ width: 100%;
190
+ }
191
+ }
192
+ }
193
+ </style>
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <el-button
3
+ class="btn-add"
4
+ icon="el-icon-plus"
5
+ :style="recordCreatorProps.style"
6
+ v-bind="initializedButtonProps"
7
+ >
8
+ {{ recordCreatorProps.creatorButtonText }}
9
+ </el-button>
10
+ </template>
11
+
12
+ <script>
13
+ export default {
14
+ name: 'RecordCreator',
15
+ props: {
16
+ recordCreatorProps: {
17
+ type: [Boolean, Object],
18
+ required: true
19
+ },
20
+ size: {
21
+ type: String
22
+ }
23
+ },
24
+ computed: {
25
+ initializedButtonProps() {
26
+ const { size, recordCreatorProps: { buttonProps = {} } } = this
27
+ return {
28
+ plain: true,
29
+ ...buttonProps,
30
+ size,
31
+ }
32
+ }
33
+ },
34
+ }
35
+ </script>
36
+
37
+ <style scoped>
38
+ .btn-add {
39
+ width: 100%;
40
+ margin: 10px 0;
41
+ border-style: dashed;
42
+ }
43
+ </style>
@@ -0,0 +1,181 @@
1
+ <template>
2
+ <Fragment>
3
+ <!-- 编辑 -->
4
+ <!-- start -->
5
+ <FormItem
6
+ v-if="isEditable"
7
+ :formItem="formItem"
8
+ :formItemProp="formItemProp"
9
+ :form="row"
10
+ :name="name"
11
+ :recordKey="recordKey"
12
+ :index="index"
13
+ >
14
+ <template #[formItem.prop]>
15
+ <slot
16
+ :name="formItem.prop"
17
+ v-bind="{ form: row, formItem, recordKey, index }"
18
+ ></slot>
19
+ </template>
20
+ </FormItem>
21
+ <!-- end -->
22
+ <!-- 文本 -->
23
+ <!-- start -->
24
+ <template v-else>
25
+ <!-- 无 el-form-item 包裹会造成表单校验失败 -->
26
+ <!-- start -->
27
+ <el-form-item class="editable-form-item" :prop="formItemProp">
28
+ <CustomRender
29
+ v-if="column.renderCell"
30
+ :render="() => column.renderCell(scope)"
31
+ />
32
+ <span v-else :class="{ 'text-ellipsis': column['show-overflow-tooltip'] }">{{ value }}</span>
33
+ </el-form-item>
34
+ <!-- end -->
35
+ </template>
36
+ <!-- end -->
37
+ </Fragment>
38
+ </template>
39
+
40
+ <script>
41
+ import FormItem from './FormItem'
42
+ import CustomRender from '@/components/custom-render'
43
+ import { setPlaceholder, setSelectOptions, setCascaderOptions } from 'element-ui-pro-components/src/utils/form'
44
+
45
+ export default {
46
+ name: 'RenderCell',
47
+ components: {
48
+ FormItem,
49
+ CustomRender
50
+ },
51
+ props: {
52
+ editable: {
53
+ type: Object,
54
+ required: true
55
+ },
56
+ // 列
57
+ column: {
58
+ type: Object,
59
+ required: true
60
+ },
61
+ // 数据
62
+ scope: {
63
+ type: Object
64
+ },
65
+ name: {
66
+ type: String,
67
+ required: true
68
+ },
69
+ recordKey: {
70
+ type: [String, Number]
71
+ },
72
+ cachedOptions: {
73
+ type: Object
74
+ },
75
+ preEditRows: {
76
+ type: Map
77
+ }
78
+ },
79
+ computed: {
80
+ // 表单项
81
+ formItem() {
82
+ const {
83
+ column,
84
+ column: {
85
+ prop,
86
+ formItemProps = {},
87
+ valueType,
88
+ renderField,
89
+ fieldProps = {},
90
+ fieldEvents,
91
+ }
92
+ } = this
93
+ // 设置 placeholder
94
+ setPlaceholder(fieldProps, valueType)
95
+
96
+ // 设置 select options
97
+ setSelectOptions(column, this.cachedOptions)
98
+
99
+ // 设置 cascader options
100
+ setCascaderOptions(fieldProps, column, this.cachedOptions)
101
+
102
+ return {
103
+ ...formItemProps,
104
+ prop,
105
+ valueType,
106
+ renderField,
107
+ fieldProps,
108
+ fieldEvents,
109
+ options: column.options,
110
+ }
111
+ },
112
+ // 行数据
113
+ row() {
114
+ return this.scope.row
115
+ },
116
+ // 下标
117
+ index() {
118
+ return this.scope.$index
119
+ },
120
+ // 可编辑表格 el-form-item prop
121
+ formItemProp() {
122
+ const { formItem: { prop }, name, index } = this
123
+ return `${name}.${index}.${prop}`
124
+ },
125
+ isEditable() {
126
+ const {
127
+ editable: { editableKeys },
128
+ recordKey,
129
+ formItem: { prop },
130
+ column: { readonly, editable}
131
+ } = this
132
+ const preEditCellValue = this.preEditRows.get(this.recordKey)?.[prop]
133
+ return editableKeys?.some(key => recordKey === key)
134
+ && readonly !== true
135
+ && (editable ? editable?.(preEditCellValue, this.row, this.index) : true)
136
+ },
137
+ // 文本
138
+ value() {
139
+ const { column: { formatter }, formItem, scope, row, index } = this
140
+ const { prop, valueType, options, valueEnum } = formItem
141
+ const cellValue = row[prop]
142
+
143
+ if (formatter) { // formatter
144
+ return formatter(row, scope.column, cellValue, index)
145
+ } else if (valueType === 'select') { // 选择器
146
+ if (valueEnum) { // 枚举
147
+ if (valueEnum instanceof Map) {
148
+ return valueEnum.get(cellValue)
149
+ } else {
150
+ return valueEnum[cellValue]
151
+ }
152
+ } else { // options
153
+ const map = (options || []).reduce((accu, cur) => ({ ...accu, [cur.value]: cur.label }), {})
154
+ return map[cellValue]
155
+ }
156
+ }
157
+
158
+ return cellValue ?? '-'
159
+ }
160
+ },
161
+ }
162
+ </script>
163
+
164
+ <style lang="less" scoped>
165
+ .text-ellipsis {
166
+ display: block;
167
+ width: 100%;
168
+ overflow: hidden;
169
+ text-overflow: ellipsis;
170
+ white-space: nowrap;
171
+ line-height: inherit;
172
+ }
173
+
174
+ .editable-form-item.el-form-item {
175
+ margin-bottom: 0;
176
+
177
+ ::v-deep .el-form-item__content {
178
+ font-size: unset;
179
+ }
180
+ }
181
+ </style>