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,9 @@
1
+ import ProForm from './src'
2
+
3
+ // 为组件提供 install 方法
4
+ ProForm.install = function(Vue) {
5
+ Vue.component(ProForm.name, ProForm)
6
+ }
7
+
8
+ // 默认导出组件
9
+ export default ProForm
@@ -0,0 +1,47 @@
1
+ <script>
2
+ export default {
3
+ name: 'Submitter',
4
+ props: {
5
+ render: {
6
+ validator: (value) => {
7
+ return value === null || typeof value === 'function'
8
+ },
9
+ required: true
10
+ },
11
+ submitter: {
12
+ type: Object,
13
+ required: true
14
+ },
15
+ actions: {
16
+ type: Object,
17
+ required: true
18
+ }
19
+ },
20
+ render: function(h) {
21
+ const {
22
+ submitter: { resetText, submitText, resetButtonProps, submitButtonProps },
23
+ actions: { reset, submit },
24
+ render
25
+ } = this
26
+ // { ...props } 传递组件属性时 需要 props 包裹
27
+ const resetProps = { props: resetButtonProps, resetButtonProps }
28
+ const submitProps = { props: submitButtonProps, submitButtonProps }
29
+ const doms = [
30
+ <el-button { ...resetProps } onClick={reset} key='reset'>{ resetText }</el-button>,
31
+ <el-button type="primary" { ...submitProps } onClick={submit} key='submit'>{ submitText }</el-button>
32
+ ]
33
+
34
+ return (
35
+ render
36
+ ? <Fragment>{render(this.actions, doms)}</Fragment>
37
+ : <el-form-item class="pro-form__submitter">
38
+ {doms}
39
+ </el-form-item>
40
+ )
41
+ }
42
+ }
43
+ </script>
44
+
45
+ <style scoped>
46
+
47
+ </style>
@@ -0,0 +1,309 @@
1
+ <template>
2
+ <el-form
3
+ ref="proFormRef"
4
+ :model="form"
5
+ class="pro-form"
6
+ :class="className"
7
+ v-bind="formProps"
8
+ >
9
+ <!-- 栅格布局 -->
10
+ <!-- start -->
11
+ <template v-if="grid">
12
+ <el-row v-bind="rowProps">
13
+ <el-col
14
+ v-for="formItem in normalizedFormItems"
15
+ v-bind="formItem.colProps"
16
+ :key="formItem.prop || formItem.key"
17
+ >
18
+ <!-- 自定义 el-form-item -->
19
+ <!-- start -->
20
+ <slot
21
+ v-if="formItem.customSlot"
22
+ :name="formItem.customSlot === true ? formItem.prop : formItem.customSlot"
23
+ v-bind="{ form }"
24
+ ></slot>
25
+ <CustomRender
26
+ v-else-if="formItem.renderFormItem"
27
+ :render="() => formItem.renderFormItem(form)"
28
+ />
29
+ <!-- end -->
30
+ <!-- ProFormItem -->
31
+ <!-- start -->
32
+ <ProFormItem
33
+ v-else
34
+ :form="form"
35
+ :formItem="formItem"
36
+ >
37
+ <template #[formItem.prop]>
38
+ <slot :name="formItem.prop" v-bind="{ form, formItem }"></slot>
39
+ </template>
40
+ </ProFormItem>
41
+ <!-- end -->
42
+ </el-col>
43
+ </el-row>
44
+ </template>
45
+ <!-- end -->
46
+ <!-- 非栅格布局 -->
47
+ <!-- start -->
48
+ <template v-else>
49
+ <template v-for="formItem in normalizedFormItems">
50
+ <!-- 自定义 el-form-item -->
51
+ <!-- start -->
52
+ <slot
53
+ v-if="formItem.customSlot"
54
+ :name="formItem.customSlot === true ? formItem.prop : formItem.customSlot"
55
+ v-bind="{ form }"
56
+ ></slot>
57
+ <CustomRender
58
+ v-else-if="formItem.renderFormItem"
59
+ :render="() => formItem.renderFormItem(form)"
60
+ :key="formItem.prop || formItem.key"
61
+ />
62
+ <!-- end -->
63
+ <!-- ProFormItem -->
64
+ <!-- start -->
65
+ <ProFormItem
66
+ v-else
67
+ :form="form"
68
+ :formItem="formItem"
69
+ :key="formItem.prop || formItem.key"
70
+ >
71
+ <template #[formItem.prop]>
72
+ <slot :name="formItem.prop" v-bind="{ form, formItem }"></slot>
73
+ </template>
74
+ </ProFormItem>
75
+ <!-- end -->
76
+ </template>
77
+ </template>
78
+ <!-- end -->
79
+ <!-- submitter -->
80
+ <!-- start -->
81
+ <template v-if="submitter">
82
+ <Submitter
83
+ :submitter="submitterProps"
84
+ :actions="{ submit, reset, resetAllFields }"
85
+ :render="submitter.customRender
86
+ ? (actions, doms) => submitter.customRender(form, actions, doms)
87
+ : null"
88
+ />
89
+ </template>
90
+ <!-- end -->
91
+ </el-form>
92
+ </template>
93
+
94
+ <script>
95
+ import CustomRender from '@/components/custom-render'
96
+ import ProFormItem from '@/components/pro-form-item'
97
+ import Submitter from './components/Submitter'
98
+ import { setPlaceholder, setSelectOptions, setCascaderOptions } from 'element-ui-pro-components/src/utils/form'
99
+ import { t } from 'element-ui-pro-components/src/locale'
100
+
101
+ export default {
102
+ name: 'ProForm',
103
+ components: {
104
+ CustomRender,
105
+ ProFormItem,
106
+ Submitter
107
+ },
108
+ props: {
109
+ // el-form attributes 的配置
110
+ formProps: {
111
+ type: Object,
112
+ default: () => ({})
113
+ },
114
+ // el-form 的类名
115
+ className: {
116
+ type: String
117
+ },
118
+ // 列定义
119
+ formItems: {
120
+ type: Array,
121
+ required: true,
122
+ default: () => []
123
+ },
124
+ // 提交按钮相关配置
125
+ submitter: {
126
+ type: [Boolean, Object],
127
+ default: true
128
+ },
129
+ // 开启栅格化模式
130
+ grid: {
131
+ type: Boolean,
132
+ },
133
+ // 开启 grid 模式时传递给 el-row
134
+ rowProps: {
135
+ type: Object,
136
+ default: () => ({ gutter: 8 })
137
+ },
138
+ // 表单默认值
139
+ initialValues: {
140
+ type: Object,
141
+ default: () => ({})
142
+ },
143
+ },
144
+ computed: {
145
+ // formItems 标准化处理
146
+ normalizedFormItems() {
147
+ return this.formItems
148
+ // 过滤隐藏项
149
+ .filter(item => !item.hideInForm)
150
+ .map(item => {
151
+ const { valueType, fieldProps = {} } = item
152
+ // 设置 placeholder
153
+ setPlaceholder(fieldProps, valueType)
154
+
155
+ // 设置 select options
156
+ setSelectOptions(item, this.cachedOptions)
157
+
158
+ // 设置 cascader options
159
+ setCascaderOptions(fieldProps, item, this.cachedOptions)
160
+
161
+ return {
162
+ ...item,
163
+ fieldProps
164
+ }
165
+ })
166
+ },
167
+ // submitter 标准化处理
168
+ submitterProps() {
169
+ if (this.submitter) {
170
+ // 配置按钮文本
171
+ const defaultTextConfig = {
172
+ resetText: t('elProComponents.proForm.reset'),
173
+ submitText: t('elProComponents.proForm.submit')
174
+ }
175
+
176
+ // 对象类型
177
+ if (typeof this.submitter === 'object') {
178
+ return {
179
+ ...defaultTextConfig,
180
+ ...this.submitter
181
+ }
182
+ }
183
+
184
+ // 返回默认配置
185
+ return {
186
+ ...defaultTextConfig
187
+ }
188
+ }
189
+
190
+ return false
191
+ }
192
+ },
193
+ data() {
194
+ return {
195
+ cachedOptions: {}, // 下拉数据 { [prop]: res }
196
+ form: this.initForm(), // 表单数据
197
+ }
198
+ },
199
+ created () {
200
+ // 获取异步数据
201
+ this.getOptions()
202
+ },
203
+ methods: {
204
+ /**
205
+ * @desc 获取异步下拉数据
206
+ */
207
+ getOptions() {
208
+ for (const item of this.formItems) {
209
+ const { prop, optionLoader } = item
210
+ if (typeof optionLoader === 'function') {
211
+ optionLoader().then(res => {
212
+ this.cachedOptions = {
213
+ ...this.cachedOptions,
214
+ [prop]: res
215
+ }
216
+ })
217
+ }
218
+ }
219
+ },
220
+ /**
221
+ * @desc 初始化表单数据
222
+ */
223
+ initForm() {
224
+ const { formItems, initialValues } = this
225
+ const data = formItems.reduce((accu, cur) => {
226
+ const { prop, initialValue } = cur
227
+ if (!prop) {
228
+ return accu
229
+ }
230
+
231
+ return {
232
+ ...accu,
233
+ [prop]: initialValue
234
+ }
235
+ }, {})
236
+
237
+ return { ...initialValues, ...data }
238
+ },
239
+ /**
240
+ * @desc 获取 el-form ref
241
+ * @returns {Object}
242
+ */
243
+ getFormRef() {
244
+ return this.$refs.proFormRef
245
+ },
246
+ /**
247
+ * @desc 获取表单数据
248
+ * @returns {Object}
249
+ */
250
+ getForm() {
251
+ return this.form
252
+ },
253
+ /**
254
+ * @desc 手动更新表单数据
255
+ * @param {Object} data 数据
256
+ */
257
+ setFieldsValue(data) {
258
+ this.form = {
259
+ ...this.form,
260
+ ...data
261
+ }
262
+ },
263
+ /**
264
+ * @desc 手动更新单个字段数据
265
+ * @param {String} key 键
266
+ * @param {any} value 值
267
+ */
268
+ setFieldValue(key, value) {
269
+ this.form[key] = value
270
+ },
271
+ /**
272
+ * @desc 提交
273
+ */
274
+ submit() {
275
+ this.$refs.proFormRef?.validate((valid, object) => {
276
+ if (valid) {
277
+ // 回传给父组件
278
+ this.$emit('onFinish', this.form)
279
+ return
280
+ }
281
+
282
+ // 回传给父组件
283
+ this.$emit('onError', object)
284
+ })
285
+ },
286
+ /**
287
+ * @desc 重置
288
+ */
289
+ async reset() {
290
+ try {
291
+ await this.$refs.proFormRef?.resetFields()
292
+ // 回传给父组件
293
+ this.$emit('onReset')
294
+ } catch (err) {
295
+ console.error('err', err)
296
+ }
297
+ },
298
+ /**
299
+ * @desc 重置表单的拓展方法,过滤了非表单项的字段
300
+ */
301
+ resetAllFields() {
302
+ // 清除校验
303
+ this.$refs.proFormRef?.clearValidate()
304
+ // 重置数据
305
+ this.form = this.initForm()
306
+ }
307
+ }
308
+ }
309
+ </script>
@@ -0,0 +1,9 @@
1
+ import ProTable from './src'
2
+
3
+ // 为组件提供 install 方法
4
+ ProTable.install = function(Vue) {
5
+ Vue.component(ProTable.name, ProTable)
6
+ }
7
+
8
+ // 默认导出组件
9
+ export default ProTable
@@ -0,0 +1,77 @@
1
+ <template>
2
+ <span class="icon-algin-group">
3
+ <template v-if="column.fixed !== 'left'">
4
+ <el-tooltip :content="t('elProComponents.tableToolBar.leftPin')" placement="top">
5
+ <VerticalAlignTopIcon @click.native.stop.prevent="handleAlgin('left')" />
6
+ </el-tooltip>
7
+ </template>
8
+ <template v-if="column.fixed === 'left' || column.fixed === 'right'">
9
+ <el-tooltip :content="t('elProComponents.tableToolBar.noPin')" placement="top">
10
+ <VerticalAlginMiddleIcon @click.native.stop.prevent="handleAlgin()" />
11
+ </el-tooltip>
12
+ </template>
13
+ <template v-if="column.fixed !== 'right'">
14
+ <el-tooltip :content="t('elProComponents.tableToolBar.rightPin')" placement="top">
15
+ <VerticalAlginBottomIcon @click.native.stop.prevent="handleAlgin('right')" />
16
+ </el-tooltip>
17
+ </template>
18
+ </span>
19
+ </template>
20
+
21
+ <script>
22
+ import VerticalAlignTopIcon from "./svg/VerticalAlignTopIcon"
23
+ import VerticalAlginBottomIcon from "./svg/VerticalAlginBottomIcon"
24
+ import VerticalAlginMiddleIcon from "./svg/VerticalAlginMiddleIcon"
25
+ import { t } from 'element-ui-pro-components/src/locale'
26
+
27
+ export default {
28
+ name: "ColumnAlginSettings",
29
+ inject: ["onColumnSettingsChange"],
30
+ components: {
31
+ VerticalAlignTopIcon,
32
+ VerticalAlginMiddleIcon,
33
+ VerticalAlginBottomIcon,
34
+ },
35
+ props: {
36
+ // 单个列表项
37
+ column: {
38
+ type: Object,
39
+ default: () => ({}),
40
+ },
41
+ },
42
+ methods: {
43
+ /**
44
+ * @desc 支持国际化
45
+ * @param key
46
+ */
47
+ t(key) {
48
+ return t(key)
49
+ },
50
+ /**
51
+ * @desc 监听修改
52
+ * @param {string | undefined} fixed 固定位置
53
+ */
54
+ handleAlgin(fixed) {
55
+ const { prop } = this.column
56
+ // ProTable provide 提供
57
+ this.onColumnSettingsChange({ event: "align", prop, fixed })
58
+ },
59
+ },
60
+ };
61
+ </script>
62
+
63
+ <style scoped>
64
+ .icon-algin-group {
65
+ margin-left: auto;
66
+ align-items: center;
67
+ gap: 8px;
68
+ color: #1677ff;
69
+ cursor: pointer;
70
+ display: none;
71
+ transition: display 0.2s;
72
+ }
73
+
74
+ .icon-algin-group svg {
75
+ outline: none;
76
+ }
77
+ </style>
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <el-popover
3
+ popper-class="column-settings-popover"
4
+ placement="bottom-end"
5
+ trigger="click"
6
+ >
7
+ <div class="pro-table__toolbar-item" slot="reference">
8
+ <el-tooltip :content="columnSettings.columnSetting" placement="top">
9
+ <SettingIcon />
10
+ </el-tooltip>
11
+ </div>
12
+ <div class="popover-header">
13
+ <el-checkbox
14
+ v-if="columnSettings.checkable"
15
+ :value="checkAll"
16
+ :indeterminate="isIndeterminate"
17
+ @change="handleChange"
18
+ >
19
+ {{ columnSettings.columnDisplay }}
20
+ </el-checkbox>
21
+ <span class="column-display" v-else>{{ columnSettings.columnDisplay }}</span>
22
+ <a type="text" class="btn-reset" @click="handleReset">{{ columnSettings.resetText }}</a>
23
+ </div>
24
+ <div class="popover-content">
25
+ <!-- 固定在列首 -->
26
+ <!-- start -->
27
+ <ColumnSettingsItem
28
+ :columns="leftFixedColumns"
29
+ :columnSettings="columnSettings"
30
+ />
31
+ <!-- end -->
32
+ <!-- 不固定 -->
33
+ <!-- start -->
34
+ <ColumnSettingsItem
35
+ :columns="noFixedColumns"
36
+ :columnSettings="columnSettings"
37
+ />
38
+ <!-- end -->
39
+ <!-- 固定在列尾 -->
40
+ <!-- start -->
41
+ <ColumnSettingsItem
42
+ :columns="rightFixedColumns"
43
+ :columnSettings="columnSettings"
44
+ />
45
+ <!-- end -->
46
+ </div>
47
+ </el-popover>
48
+ </template>
49
+
50
+ <script>
51
+ import SettingIcon from './svg/SettingIcon'
52
+ import ColumnSettingsItem from './ColumnSettingsItem'
53
+
54
+ export default {
55
+ name: 'ColumnSettings',
56
+ components: {
57
+ SettingIcon,
58
+ ColumnSettingsItem
59
+ },
60
+ inject: ["onColumnSettingsChange"],
61
+ props: {
62
+ // 列表项
63
+ columns: {
64
+ type: Array,
65
+ required: true,
66
+ },
67
+ // 列设置
68
+ columnSettings: {
69
+ type: Object,
70
+ },
71
+ },
72
+ computed: {
73
+ // 固定在左侧列
74
+ leftFixedColumns() {
75
+ return this.columns.filter((item) => item.fixed === "left")
76
+ },
77
+ // 不固定列
78
+ noFixedColumns() {
79
+ return this.columns.filter(
80
+ (item) => item.fixed !== "left" && item.fixed !== "right"
81
+ )
82
+ },
83
+ // 固定在右侧列
84
+ rightFixedColumns() {
85
+ return this.columns.filter((item) => item.fixed === "right")
86
+ },
87
+ // 列展示勾选状态
88
+ checkAll() {
89
+ return this.columns.length === this.columns.filter(item => item.checkable).length
90
+ },
91
+ // 表示 checkbox 的不确定状态
92
+ isIndeterminate() {
93
+ return !this.checkAll && this.columns.filter(item => !item.disabled && item.checkable).length > 0
94
+ },
95
+ },
96
+ data() {
97
+ return {
98
+ }
99
+ },
100
+ methods: {
101
+ /**
102
+ * @desc 监听修改
103
+ * @param {Boolean} checked 状态
104
+ */
105
+ handleChange(checked) {
106
+ // ProTable provide 提供
107
+ this.onColumnSettingsChange({ event: "checkAll", checked });
108
+ },
109
+ /**
110
+ * @desc 重置
111
+ */
112
+ handleReset() {
113
+ // ProTable provide 提供
114
+ this.onColumnSettingsChange({ event: "reset" })
115
+ },
116
+ }
117
+ }
118
+ </script>
119
+
120
+ <style lang="less" scoped>
121
+ .pro-table__toolbar-item {
122
+ display: flex;
123
+ margin-block: 0;
124
+ margin-inline: 4px;
125
+ color: rgba(42, 46, 54, 0.88);
126
+ font-size: 16px;
127
+ cursor: pointer;
128
+
129
+ svg {
130
+ outline: none;
131
+ }
132
+
133
+ &:hover {
134
+ color: #409eff;
135
+ }
136
+ }
137
+
138
+ .column-settings-popover {
139
+ .popover-header {
140
+ display: flex;
141
+ justify-content: space-between;
142
+ padding: 5px 0;
143
+
144
+ ::v-deep .el-checkbox__label {
145
+ padding-inline-start: 8px;
146
+ }
147
+
148
+ .btn-reset {
149
+ color: #409EFF;
150
+ font-weight: 500;
151
+ cursor: pointer;
152
+
153
+ &:hover {
154
+ color: #66b1ff;
155
+ }
156
+ }
157
+
158
+ ::v-deep .el-checkbox__label,
159
+ .column-display,
160
+ .btn-reset {
161
+ line-height: 22px;
162
+ }
163
+ }
164
+
165
+ .popover-content {
166
+ width: 200px;
167
+ padding-block: 0;
168
+ padding-inline: 0;
169
+ padding-block-end: 8px;
170
+ }
171
+ }
172
+ </style>