br-dionysus 1.8.4 → 1.8.6

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 (63) hide show
  1. package/README.md +861 -88
  2. package/attributes.json +1 -1
  3. package/cypress/e2e/2-advanced-examples/actions.cy.js +3 -3
  4. package/cypress/e2e/2-advanced-examples/assertions.cy.js +2 -2
  5. package/cypress/e2e/2-advanced-examples/cypress_api.cy.js +5 -6
  6. package/cypress/e2e/2-advanced-examples/files.cy.js +1 -1
  7. package/cypress/e2e/2-advanced-examples/misc.cy.js +1 -1
  8. package/cypress/e2e/2-advanced-examples/navigation.cy.js +1 -1
  9. package/cypress/e2e/2-advanced-examples/network_requests.cy.js +22 -22
  10. package/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js +7 -7
  11. package/cypress/e2e/2-advanced-examples/storage.cy.js +8 -8
  12. package/cypress/e2e/2-advanced-examples/utilities.cy.js +15 -15
  13. package/dist/br-dionysus.es.js +4708 -4519
  14. package/dist/br-dionysus.umd.js +8 -8
  15. package/dist/index.css +1 -1
  16. package/dist/packages/Hook/useFormInline/useFormInline.d.ts +25 -0
  17. package/dist/packages/Hook/usePackageConfig/usePackageConfig.d.ts +1 -1
  18. package/dist/packages/MDialog/src/MDialog.vue.d.ts +1 -1
  19. package/dist/packages/MInline/src/MInline.vue.d.ts +7 -0
  20. package/dist/packages/MInputNumber/src/MInputNumber.vue.d.ts +2 -2
  21. package/dist/packages/MSelectTable/src/MSelectTable.vue.d.ts +2 -2
  22. package/dist/packages/MSelectTableV1/src/MSelectTableV1.vue.d.ts +3 -3
  23. package/dist/packages/MSelectV2/src/MSelectV2.vue.d.ts +1 -1
  24. package/dist/packages/MTableColumnSet/src/MTableColumnSet.vue.d.ts +1 -1
  25. package/dist/packages/MTableSuper/index.d.ts +4 -0
  26. package/dist/packages/MTableSuper/src/MTableSuper.vue.d.ts +11 -0
  27. package/dist/packages/MTableSuper/src/token.d.ts +23 -0
  28. package/dist/packages/MTableV2/src/MTableV2.vue.d.ts +7 -0
  29. package/dist/packages/Tool/slotsToData/slotsToData.d.ts +19 -0
  30. package/dist/packages/index.d.ts +1 -0
  31. package/package.json +1 -1
  32. package/packages/Hook/useFormInline/README.md +45 -0
  33. package/packages/Hook/useFormInline/demo.vue +141 -0
  34. package/packages/Hook/useFormInline/useFormInline.ts +60 -0
  35. package/packages/Hook/usePackageConfig/usePackageConfig.ts +1 -1
  36. package/packages/Hook/useTableConfig/demo.vue +1 -1
  37. package/packages/Hook/useTableConfig/useTableConfig.ts +10 -10
  38. package/packages/MDialog/src/MDialog.vue +12 -1
  39. package/packages/MInline/docs/README.md +7 -6
  40. package/packages/MInline/docs/demo.vue +16 -13
  41. package/packages/MInline/src/MInline.vue +127 -3
  42. package/packages/MInputNumber/docs/demo.vue +42 -2
  43. package/packages/MInputNumber/src/MInputNumber.vue +7 -7
  44. package/packages/MSelectTable/src/MSelectTable.vue +1 -1
  45. package/packages/MTable/src/MTable.vue +0 -32
  46. package/packages/MTableColumn/src/MTableColumn.vue +0 -41
  47. package/packages/MTableSuper/docs/README.md +48 -0
  48. package/packages/MTableSuper/docs/demo.vue +246 -0
  49. package/packages/MTableSuper/index.ts +10 -0
  50. package/packages/MTableSuper/src/MTableSuper.vue +140 -0
  51. package/packages/MTableSuper/src/token.ts +24 -0
  52. package/packages/MTableV2/docs/README.md +1 -0
  53. package/packages/MTableV2/docs/demo.vue +9 -7
  54. package/packages/MTableV2/src/MTableV2.vue +49 -5
  55. package/packages/SkinConfig/src/useSkin.ts +2 -2
  56. package/packages/Tool/slotsToData/README.md +26 -0
  57. package/packages/Tool/slotsToData/slotsToData.ts +38 -0
  58. package/packages/index.ts +3 -0
  59. package/packages/list.json +6 -0
  60. package/packages/typings/global.d.ts +2 -2
  61. package/src/router.ts +5 -0
  62. package/tags.json +1 -1
  63. package/web-types.json +1 -1
@@ -0,0 +1,246 @@
1
+ <template>
2
+ <div class="g-box">
3
+ <h3>基础功能</h3>
4
+ <MTableSuper
5
+ :data="tableData"
6
+ v-if="!tableData"
7
+ border
8
+ >
9
+ <MTableColumn
10
+ v-for="item in tableTitle"
11
+ :key="item.prop"
12
+ :prop="item.prop"
13
+ :label="item.label"
14
+ :align="item.align"
15
+ :minWidth="item.minWidth"
16
+ :className="item.className"
17
+ :filters="item.filters"
18
+ :headerAlign="item.headerAlign"
19
+ :fixed="item.fixed"
20
+ v-model:filtersValue="filtersValue"
21
+ showOverflowTooltip
22
+ ></MTableColumn>
23
+ </MTableSuper>
24
+ <h3>带选择的表格</h3>
25
+ <MTableSuper
26
+ :data="tableData"
27
+ border
28
+ >
29
+ <el-table-column
30
+ fixed="left"
31
+ type="selection"
32
+ />
33
+ <el-table-column
34
+ prop="name"
35
+ label="名称"
36
+ >
37
+ <el-table-column
38
+ prop="date"
39
+ label="时间"
40
+ ></el-table-column>
41
+ <el-table-column
42
+ prop="address"
43
+ label="地址"
44
+ ></el-table-column>
45
+ </el-table-column>
46
+ <MTableColumn
47
+ v-for="item in tableTitle"
48
+ :key="item.prop"
49
+ :prop="item.prop"
50
+ :label="item.label"
51
+ :align="item.align"
52
+ :minWidth="item.minWidth"
53
+ :className="item.className"
54
+ :filters="item.filters"
55
+ :headerAlign="item.headerAlign"
56
+ :fixed="item.fixed"
57
+ v-model:filtersValue="filtersValue"
58
+ showOverflowTooltip
59
+ >
60
+ </MTableColumn>
61
+ </MTableSuper>
62
+ <h3>展开列</h3>
63
+ <MTableSuper
64
+ v-if="!tableData"
65
+ class="style.box"
66
+ :data="tableData"
67
+ border
68
+ :filtersValue="filtersValue"
69
+ scrollbarAlwaysOn
70
+ v-model:tableConfig="tableConfig"
71
+ rowKey="id"
72
+ tableConfigKey="tableConfigKey"
73
+ @headerDragend="headerDragend"
74
+ expandProp="sn"
75
+ @privateExpandChange="privateExpandChange"
76
+ >
77
+ <el-table-column
78
+ fixed="left"
79
+ type="selection"
80
+ />
81
+ <MTableColumn
82
+ type="expand"
83
+ width="1"
84
+ >
85
+ <template #default="props">
86
+ <h1>index{{ props.index }}</h1>
87
+ <h1>$index{{ props.$index }}</h1>
88
+ <h1>测试</h1>
89
+ </template>
90
+ </MTableColumn>
91
+ <MTableColumn
92
+ v-for="item in tableTitle"
93
+ :key="item.prop"
94
+ :prop="item.prop"
95
+ :label="item.label"
96
+ :align="item.align"
97
+ :minWidth="item.minWidth"
98
+ :className="item.className"
99
+ :filters="item.filters"
100
+ :headerAlign="item.headerAlign"
101
+ :fixed="item.fixed"
102
+ v-model:filtersValue="filtersValue"
103
+ showOverflowTooltip
104
+ >
105
+ </MTableColumn>
106
+ </MTableSuper>
107
+ <h3>树状表格</h3>
108
+ <MTableSuper
109
+ v-if="!tableData"
110
+ class="style.box"
111
+ :data="tableData"
112
+ border
113
+ @headerDragend="headerDragend"
114
+ :filtersValue="filtersValue"
115
+ scrollbarAlwaysOn
116
+ v-model:tableConfig="tableConfig"
117
+ rowKey="id"
118
+ tableConfigKey="tableConfigKey"
119
+ @expandChange="privateExpandChange"
120
+ >
121
+ <MTableColumn
122
+ v-for="item in tableTitle"
123
+ :key="item.prop"
124
+ :prop="item.prop"
125
+ :label="item.label"
126
+ :align="item.align"
127
+ :minWidth="item.minWidth"
128
+ :className="item.className"
129
+ :filters="item.filters"
130
+ :headerAlign="item.headerAlign"
131
+ :fixed="item.fixed"
132
+ v-model:filtersValue="filtersValue"
133
+ showOverflowTooltip
134
+ >
135
+ </MTableColumn>
136
+ </MTableSuper>
137
+ </div>
138
+ </template>
139
+
140
+ <script setup lang="ts">
141
+ import { ref } from 'vue'
142
+ import { useTableConfig } from 'packages/index'
143
+ import { MTableColumn } from 'packages/MTableColumn'
144
+
145
+ const privateExpandChange = (row: any, expandedRows: any[]) => {
146
+ console.log('row', row)
147
+ console.log('expandedRows', expandedRows)
148
+ }
149
+
150
+ // const test = (data: any) => {
151
+ // console.log('data', data)
152
+ // }
153
+
154
+ const tableData = ref<any[]>([])
155
+ const { tableTitle, headerDragend, tableConfig, filtersValue } = useTableConfig('MTableDemo', [{
156
+ label: '序号',
157
+ prop: 'sn',
158
+ minWidth: 200
159
+ // fixed: 'right'
160
+ }, {
161
+ label: '时间',
162
+ prop: 'date',
163
+ minWidth: 200
164
+ // fixed: 'left'
165
+ }, {
166
+ label: '地址',
167
+ prop: 'address',
168
+ minWidth: 200
169
+ }, {
170
+ label: '名称',
171
+ prop: 'name',
172
+ minWidth: 200
173
+ }], tableData)
174
+ console.log('tableTitle', tableTitle.value)
175
+
176
+ tableData.value = [{
177
+ id: 1,
178
+ sn: 1,
179
+ date: '2016-05-03',
180
+ name: 'Tom1',
181
+ address: 'No. 189',
182
+ tag: 'Home',
183
+ pid: 0
184
+ }, {
185
+ id: 2,
186
+ sn: 2,
187
+ date: '2016-05-02',
188
+ name: 'Tom2',
189
+ address: 'No. 189, Grove St, Los Angeles',
190
+ tag: 'Office',
191
+ pid: 0,
192
+ children: [{
193
+ id: 21,
194
+ sn: 1,
195
+ date: '2016-05-02',
196
+ name: 'Tom21',
197
+ address: 'No. 189, Grove St, Los Angeles',
198
+ tag: 'Office'
199
+ }, {
200
+ id: 22,
201
+ sn: 2,
202
+ date: '2016-05-02',
203
+ name: 'Tom22',
204
+ address: 'No. 189, Grove St, Los Angeles',
205
+ tag: 'Office'
206
+ }]
207
+ }, {
208
+ id: 3,
209
+ sn: 3,
210
+ date: '2016-05-04',
211
+ name: 'Tom3',
212
+ address: 'No. 189',
213
+ tag: 'Home',
214
+ pid: 0
215
+ }, {
216
+ id: 4,
217
+ sn: 4,
218
+ date: '2016-05-01',
219
+ name: 'Tom4',
220
+ address: 'No. 189, Grove St, Los Angeles',
221
+ tag: 'Office',
222
+ pid: 0
223
+ }, {
224
+ id: 5,
225
+ sn: 5,
226
+ date: '2016-05-05',
227
+ name: 'Tom4',
228
+ address: 'No. 189, Grove St, Los Angeles',
229
+ tag: 'Office',
230
+ pid: 0
231
+ }, {
232
+ id: 6,
233
+ sn: 6,
234
+ date: '2016-06-01',
235
+ name: 'Tom4',
236
+ address: 'No. 189, Grove St, Los Angeles',
237
+ tag: 'Office',
238
+ pid: 0
239
+ }]
240
+ </script>
241
+
242
+ <style lang="scss" scoped>
243
+ .g-box {
244
+ max-width: 1000px;
245
+ }
246
+ </style>
@@ -0,0 +1,10 @@
1
+ import { App, Plugin } from 'vue'
2
+ import MTableSuper from './src/MTableSuper.vue'
3
+
4
+ export const MTableSuperPlugin: Plugin = {
5
+ install (app: App) {
6
+ app.component('MTableSuper', MTableSuper)
7
+ }
8
+ }
9
+
10
+ export { MTableSuper }
@@ -0,0 +1,140 @@
1
+ <template>
2
+ <div class="br-m-table-super-box">
3
+ <MTable
4
+ v-if="showTableV2Mode"
5
+ v-bind="attrs"
6
+ v-on="attrs"
7
+ >
8
+ <slot name="default"></slot>
9
+ <slot name="append"></slot>
10
+ <slot name="empty"></slot>
11
+ </MTable>
12
+ <MTableV2
13
+ v-if="showTableV2Mode"
14
+ :data="tableData"
15
+ :height="400"
16
+ border
17
+ fixed
18
+ :columns="tableColumn"
19
+ cellWidthAdaptive
20
+ ></MTableV2>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { useAttrs, useSlots, computed, createVNode, unref, ref } from 'vue'
26
+ import { MTableV2 } from 'packages/MTableV2'
27
+ import { MTable } from 'packages/MTable'
28
+ import { ElCheckbox } from 'element-plus'
29
+
30
+ const attrs = useAttrs()
31
+ interface Slots {
32
+ default?: () => any[]
33
+ }
34
+ const slots: Slots = useSlots()
35
+ // const slotsDefault = slots.default as Function
36
+ // console.log('slots', slotsDefault())
37
+
38
+ const selectionDom = {
39
+ key: 'selection',
40
+ width: 50,
41
+ cellRenderer: ({ rowData }: any) => {
42
+ const onChange = (value: any) => (rowData.checked = value)
43
+ return createVNode(ElCheckbox, {
44
+ modelValue: rowData.checked,
45
+ indeterminate: false,
46
+ 'onUpdate:modelValue': onChange
47
+ })
48
+ },
49
+ headerCellRenderer: () => {
50
+ const allSelected = unref(tableData.value).every((row: any) => row.checked)
51
+ const containsChecked = unref(tableData.value).some((row: any) => row.checked)
52
+ const onChange = (value: any) => {
53
+ tableData.value = unref(tableData).map((row: any) => {
54
+ row.checked = value
55
+ return row
56
+ })
57
+ }
58
+
59
+ return createVNode(ElCheckbox, {
60
+ modelValue: allSelected,
61
+ indeterminate: containsChecked && !allSelected,
62
+ 'onUpdate:modelValue': onChange
63
+ })
64
+ }
65
+ }
66
+
67
+ interface GetColumnReturn extends TableTitle {
68
+ key?: string,
69
+ cellRenderer?: any,
70
+ headerCellRenderer?: any,
71
+ children?: GetColumnReturn[]
72
+ }
73
+ const getColumn = (slots: Slots, data: GetColumnReturn[] = []): GetColumnReturn[] => {
74
+ const slotsDefault = slots.default as Function | undefined
75
+ const slotsDefaultData: any[] = slotsDefault ? slotsDefault() : slots
76
+ // console.log('slotsDefaultData', slotsDefaultData)
77
+
78
+ const list = slotsDefaultData.filter(item => item?.props?.type !== 'expand')
79
+ for (let i = 0; i < list.length; i++) {
80
+ const item = list[i]
81
+
82
+ const children = item.children
83
+
84
+ const node = {
85
+ ...item.props,
86
+ children: []
87
+ }
88
+
89
+ const isSelection = node.type === 'selection'
90
+ if (isSelection) {
91
+ data.push(selectionDom)
92
+ continue
93
+ }
94
+
95
+ const isForTemp = !item.props
96
+ if (isForTemp) {
97
+ data.push(...getColumn(children))
98
+ continue
99
+ }
100
+
101
+ const isChildren = Boolean(children)
102
+ if (isChildren) node.children = getColumn(children)
103
+
104
+ data.push(node)
105
+ }
106
+ return data
107
+ }
108
+
109
+ const tableTitleToTableV2Title = (tableTitle: GetColumnReturn[]): TableV2Title[] => {
110
+ // console.log('tableTitle', tableTitle)
111
+ return tableTitle.map(item => {
112
+ return {
113
+ title: item.label,
114
+ key: item.prop,
115
+ dataKey: item.prop,
116
+ ...(item.align ? { align: item.align } : {}),
117
+ ...(item.className ? { class: item.className } : {}),
118
+ ...(item.fixed ? { fixed: item.fixed } : {}),
119
+ ...(item.labelClassName ? { headerClass: item.labelClassName } : {}),
120
+ ...(item.minWidth ? { minWidth: item.minWidth || item.width } : {}),
121
+ ...(item.width || item.minWidth ? { width: item.width || item.minWidth || 100 } : {})
122
+ } as TableV2Title
123
+ })
124
+ }
125
+ const tableColumn: any = tableTitleToTableV2Title(getColumn(slots))
126
+ console.log('tableColumn', tableColumn)
127
+ // console.log('getColumn(slots)[0].children', getColumn(slots)[0].children)
128
+
129
+ const tableData = ref<any[]>(attrs?.data as any[] || [])
130
+ /** 切换阈值 */
131
+ const switchThreshold = 5
132
+ /** 是否为虚拟化表格模式 */
133
+ const showTableV2Mode = computed(() => tableData.value?.length > switchThreshold)
134
+ </script>
135
+
136
+ <style scoped lang="scss">
137
+ </style>
138
+
139
+ <style lang="scss">
140
+ </style>
@@ -0,0 +1,24 @@
1
+ import { InjectionKey } from 'vue'
2
+ import type { Ref } from 'vue'
3
+ import { TableConfig } from 'packages/Hook/useTableConfig/useTableConfig'
4
+
5
+ export const tableKey: InjectionKey<{
6
+ /** 表格列配置 */
7
+ tableConfig: Ref<TableConfig>,
8
+ /** 最后一列 */
9
+ lastColumnProp: Ref<string>,
10
+ /** 展开图标列 */
11
+ expandProp: string,
12
+ /** 表格数据 */
13
+ tableData: Ref<any[]>,
14
+ /** 展开列 */
15
+ expandRowKeys: Ref<any[] | null>,
16
+ /** 行数据的 Key */
17
+ rowKey: Function | string,
18
+ /** 表格配置key */
19
+ tableConfigKey: string,
20
+ /** expandProp模式下 当用户对某一行展开或者关闭的时候会触发 */
21
+ privateExpandChange: Function,
22
+ /** 是否显示筛选图标 */
23
+ showFilter: boolean
24
+ }> = Symbol('tableKey')
@@ -24,6 +24,7 @@ import demo from './demo.vue'
24
24
  | fixed | 单元格宽度是自适应还是固定 | boolean | - | false |
25
25
  | estimatedRowHeight | 渲染动态的单元格的预估高度 | number \| null | - | null |
26
26
  | headerHeight | Header 的高度由height设置。 如果传入数组,它会使 header row 等于数组长度 | number \| number[] \| null | - | null |
27
+ | cellWidthAdaptive | 单元格宽度自适应 | boolean | - | false |
27
28
  | 其余参数 | 参考el官网的table | any | - | https://element-plus.org/zh-CN/component/table-v2.html#tablev2-%E5%B1%9E%E6%80%A7 |
28
29
 
29
30
  ### 3) Events
@@ -43,13 +43,15 @@ const { tableTitle, tableConfig, filtersValue } = useTableV2Config('MTableV2Demo
43
43
  const test = () => {
44
44
  filtersValue.value = {}
45
45
  }
46
- tableData.value = [{
47
- id: 1,
48
- sn: 'sn',
49
- date: 'date',
50
- address: 'address',
51
- name: 'name'
52
- }]
46
+ for (let i = 0; i < 1000; i++) {
47
+ tableData.value.push({
48
+ id: i,
49
+ sn: 'sn' + i,
50
+ date: 'date' + i,
51
+ address: 'address' + i,
52
+ name: 'name' + i
53
+ })
54
+ }
53
55
  </script>
54
56
 
55
57
  <style lang="scss" scoped>
@@ -14,7 +14,8 @@
14
14
  <el-auto-resizer>
15
15
  <template #default="{ width }">
16
16
  <el-table-v2
17
- :columns="props.columns"
17
+ v-if="width"
18
+ :columns="props.cellWidthAdaptive ? getAdaptive(props.columns, width) : props.columns"
18
19
  :data="props.data"
19
20
  :width="width"
20
21
  :height="props.height"
@@ -22,16 +23,24 @@
22
23
  :estimatedRowHeight="estimatedRowHeight"
23
24
  :headerHeight="headerHeight"
24
25
  v-bind="$attrs"
25
- ></el-table-v2>
26
+ >
27
+ <template
28
+ v-if="!slots.empty"
29
+ #empty
30
+ >
31
+ <img src="./../../../src/assets/empty.png" />
32
+ </template>
33
+ </el-table-v2>
26
34
  </template>
27
35
  </el-auto-resizer>
28
36
  </div>
29
37
  </template>
30
38
 
31
39
  <script setup lang="ts">
32
- import { ref, watch, computed } from 'vue'
40
+ import { ref, watch, computed, useSlots } from 'vue'
33
41
  import { TableConfig } from './../../Hook/useTableConfig/useTableConfig'
34
42
  import MTableColumnSet from './../../MTableColumnSet/src/MTableColumnSet.vue'
43
+ import checkType from 'packages/Tool/checkType/checkType'
35
44
 
36
45
  interface FilterValue {
37
46
  [key: string]: Array<string | number>
@@ -59,7 +68,9 @@ const props = withDefaults(defineProps<{
59
68
  /** 渲染动态的单元格的预估高度 */
60
69
  estimatedRowHeight?: number | null,
61
70
  /** Header 的高度由height设置。 如果传入数组,它会使 header row 等于数组长度 */
62
- headerHeight?: number | number[] | null
71
+ headerHeight?: number | number[] | null,
72
+ /** 单元格宽度自适应 */
73
+ cellWidthAdaptive?: boolean
63
74
  }>(), {
64
75
  size: 'default',
65
76
  data: () => [],
@@ -71,9 +82,12 @@ const props = withDefaults(defineProps<{
71
82
  tableConfigKey: '',
72
83
  fixed: false,
73
84
  estimatedRowHeight: null,
74
- headerHeight: null
85
+ headerHeight: null,
86
+ cellWidthAdaptive: false
75
87
  })
76
88
 
89
+ const slots = useSlots()
90
+
77
91
  const sizeToHeight: { [key: string]: number } = {
78
92
  small: 30,
79
93
  default: 50,
@@ -128,6 +142,25 @@ const emit = defineEmits<{
128
142
 
129
143
  const tableRef = ref<any>(null)
130
144
 
145
+ const getAdaptive = (columns: TableV2Title[], tableWidth: number | 100): TableV2Title[] => {
146
+ if (!columns.length) return []
147
+
148
+ // 格式化宽度(去除px)
149
+ const formatWidth = (data: number | string = 0): number => checkType(data).isNumber() ? data as number : Number((data as string).replace(/[^0-9]/g, ''))
150
+
151
+ // 总份数
152
+ const total = columns
153
+ .map(item => formatWidth(item.width))
154
+ .reduce((a, b) => a + b)
155
+
156
+ return columns.map(item => {
157
+ return {
158
+ ...item,
159
+ width: formatWidth(item.width) / total * (tableWidth - 6)
160
+ }
161
+ })
162
+ }
163
+
131
164
  defineExpose({
132
165
  scrollTo: (param: { scrollLeft?: number, scrollTop?: number }) => tableRef.value?.scrollTo(param),
133
166
  scrollToLeft: (scrollLeft: number) => tableRef.value?.scrollToLeft(scrollLeft),
@@ -159,6 +192,10 @@ defineExpose({
159
192
  top: 20px;
160
193
  }
161
194
  }
195
+
196
+ .el-table-v2__empty img {
197
+ width: 8%
198
+ }
162
199
  </style>
163
200
 
164
201
  <style lang="scss">
@@ -170,6 +207,7 @@ defineExpose({
170
207
  &[data-border="true"] {
171
208
  .el-table-v2 {
172
209
  border: 1px solid var(--el-table-border-color);
210
+ //box-sizing: border-box; //宽度问题涉及表格内虚拟计算,所有无法改变盒模型模式
173
211
 
174
212
  .el-table-v2__header-cell, .el-table-v2__row-cell {
175
213
  border-right: var(--el-table-border);
@@ -192,5 +230,11 @@ defineExpose({
192
230
  &[data-size="large"] .el-table-v2__cell-text {
193
231
  line-height: 65px;
194
232
  }
233
+
234
+ .el-table-v2__empty {
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ }
195
239
  }
196
240
  </style>
@@ -98,7 +98,7 @@ const useSkin = (): {
98
98
  }
99
99
 
100
100
  // 清洗数据
101
- const skinConfigData = packageConfig.get('skinConfig')
101
+ const skinConfigData = packageConfig.get('skinConfig') as SkinConfig
102
102
  // 数据结构不一致,既认为为不同版本需要清洗
103
103
  if (!compareStructures(skinConfigData, defaultSkinConfig)) {
104
104
  packageConfig.set('skinConfig', defaultSkinConfig)
@@ -226,7 +226,7 @@ const useSkin = (): {
226
226
  * @description 同步本地数据到弹窗
227
227
  * */
228
228
  const syncData = () => {
229
- const _skinConfigData = packageConfig.get('skinConfig')
229
+ const _skinConfigData = packageConfig.get('skinConfig') as SkinConfig
230
230
  skinConfig.darkTheme = _skinConfigData.darkTheme
231
231
  }
232
232
 
@@ -0,0 +1,26 @@
1
+ ## vue3的slots转json
2
+
3
+ ### 1) 参数
4
+
5
+ | 参数 | 描述 | 类型 | 默认值 |
6
+ |-------|-------------|--------|-----------|
7
+ | slots | vue的slots对象 | Slots | - |
8
+ | name | 插槽名 | string | 'default' |
9
+
10
+ ### 2) 返参
11
+
12
+ | 参数 | 描述 | 类型 | 默认值 |
13
+ |----|--------------|-------------------|-----|
14
+ | - | 格式化后的slots数据 | SlotsToDataReturn | [] |
15
+
16
+ #### 2.1) SlotsToDataReturn
17
+ | 参数 | 描述 | 类型 | 默认值 |
18
+ |-------------------|--------------|-------------------------|-----|
19
+ | SlotsToDataReturn | 格式化后的slots数据 | SlotsToDataReturnItem[] | [] |
20
+
21
+ #### 2.1) SlotsToDataReturn
22
+ | 参数 | 描述 | 类型 | 默认值 |
23
+ |----------|---------------|-----------------------------|-----|
24
+ | name | 标签名 | string | - |
25
+ | props | 组件标签上的props参数 | Record<string, any> \| null | - |
26
+ | children | 子级 | SlotsToDataReturnItem[] | - |
@@ -0,0 +1,38 @@
1
+ interface Slots {
2
+ default?: () => any[];
3
+ inlineBtn?: () => any[];
4
+ submitBtn?: () => any[];
5
+ }
6
+
7
+ export interface SlotsToDataReturnItem {
8
+ name: string;
9
+ props: Record<string, any> | null;
10
+ children: SlotsToDataReturnItem[];
11
+ }
12
+ export type SlotsToDataReturn = SlotsToDataReturnItem[]
13
+ /**
14
+ * @description vue3的slots转json
15
+ * @param slots 插槽对象
16
+ * @param name 插槽名
17
+ * @param data
18
+ * */
19
+ const slotsToData = (slots: Slots, name: string = 'default', data: SlotsToDataReturn = []): SlotsToDataReturn => {
20
+ const slotsObj = slots[name as keyof typeof slots] as Function | undefined
21
+ const slotsData: any[] = slotsObj ? slotsObj() : slots
22
+ for (let i = 0; i < slotsData.length; i++) {
23
+ const item = slotsData[i]
24
+
25
+ const children = item.children
26
+ const isChildren = Boolean(children)
27
+ const _data = isChildren ? slotsToData(children) : []
28
+
29
+ data.push({
30
+ name: item.type.name,
31
+ props: item.props,
32
+ children: _data
33
+ })
34
+ }
35
+ return data
36
+ }
37
+
38
+ export default slotsToData
package/packages/index.ts CHANGED
@@ -13,6 +13,7 @@ import { MSelectTablePlugin } from 'packages/MSelectTable'
13
13
  import { MDialogPlugin } from 'packages/MDialog'
14
14
  import { MSelectTableV1Plugin } from 'packages/MSelectTableV1'
15
15
  import { MTableV2Plugin } from 'packages/MTableV2'
16
+ import { MTableSuperPlugin } from 'packages/MTableSuper'
16
17
 
17
18
  import useTableConfig from 'packages/Hook/useTableConfig/useTableConfig'
18
19
  import useTableV2Config from 'packages/Hook/useTableV2Config/useTableV2Config'
@@ -42,6 +43,7 @@ const BrPlugin: Plugin = {
42
43
  MDialogPlugin.install?.(app)
43
44
  MSelectTableV1Plugin.install?.(app)
44
45
  MTableV2Plugin.install?.(app)
46
+ MTableSuperPlugin.install?.(app)
45
47
  }
46
48
  }
47
49
 
@@ -58,6 +60,7 @@ export * from './MSelectV2'
58
60
  export * from './MDialog'
59
61
  export * from './MSelectTableV1'
60
62
  export * from './MTableV2'
63
+ export * from './MTableSuper'
61
64
 
62
65
  export { useTableConfig }
63
66
  export { useTableV2Config }
@@ -35,6 +35,12 @@
35
35
  "compDesc": "这是一个虚拟化表格组件",
36
36
  "compClassName": "m-table-v2"
37
37
  },
38
+ {
39
+ "compName": "MTableSuper",
40
+ "compZhName": "整合表格组件",
41
+ "compDesc": "这是一个整合表格组件",
42
+ "compClassName": "m-table-super"
43
+ },
38
44
  {
39
45
  "compName": "MTableColumn",
40
46
  "compZhName": "表格列组件",