@tmagic/form 1.8.0-manmanyu.8 → 1.8.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 (149) hide show
  1. package/dist/es/Form.vue_vue_type_script_setup_true_lang.js +88 -107
  2. package/dist/es/FormBox.vue_vue_type_script_setup_true_lang.js +21 -5
  3. package/dist/es/FormDialog.vue_vue_type_script_setup_true_lang.js +21 -5
  4. package/dist/es/FormDrawer.vue_vue_type_script_setup_true_lang.js +46 -12
  5. package/dist/es/containers/Col.vue_vue_type_script_setup_true_lang.js +6 -2
  6. package/dist/es/containers/Container.vue_vue_type_script_setup_true_lang.js +44 -47
  7. package/dist/es/containers/Fieldset.vue_vue_type_script_setup_true_lang.js +7 -1
  8. package/dist/es/containers/FlexLayout.vue_vue_type_script_setup_true_lang.js +5 -2
  9. package/dist/es/containers/FormLabel.vue_vue_type_script_setup_true_lang.js +1 -1
  10. package/dist/es/containers/GroupList.vue_vue_type_script_setup_true_lang.js +59 -22
  11. package/dist/es/containers/GroupListItem.vue_vue_type_script_setup_true_lang.js +118 -100
  12. package/dist/es/containers/Panel.vue_vue_type_script_setup_true_lang.js +8 -3
  13. package/dist/es/containers/Row.vue_vue_type_script_setup_true_lang.js +4 -1
  14. package/dist/es/containers/Step.vue_vue_type_script_setup_true_lang.js +5 -2
  15. package/dist/es/containers/Tabs.vue_vue_type_script_setup_true_lang.js +8 -1
  16. package/dist/es/containers/table/ActionsColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/containers/table/SortColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  18. package/dist/es/containers/table/Table.vue_vue_type_script_setup_true_lang.js +14 -10
  19. package/dist/es/containers/table/useTableColumns.js +10 -15
  20. package/dist/es/containers/table-group-list/TableGroupList.vue_vue_type_script_setup_true_lang.js +72 -79
  21. package/dist/es/containers/table-group-list/useAdd.js +26 -16
  22. package/dist/es/containers/table-group-list/useScrollLastItemIntoView.js +72 -0
  23. package/dist/es/fields/Cascader.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/es/fields/Checkbox.vue_vue_type_script_setup_true_lang.js +1 -1
  25. package/dist/es/fields/CheckboxGroup/Index.js +5 -0
  26. package/dist/es/fields/{CheckboxGroup.vue_vue_type_script_setup_true_lang.js → CheckboxGroup/Index.vue_vue_type_script_setup_true_lang.js} +6 -7
  27. package/dist/es/fields/CheckboxGroup/effect.js +8 -0
  28. package/dist/es/fields/ColorPicker.vue_vue_type_script_setup_true_lang.js +1 -1
  29. package/dist/es/fields/Date/Index.js +5 -0
  30. package/dist/es/fields/{Date.vue_vue_type_script_setup_true_lang.js → Date/Index.vue_vue_type_script_setup_true_lang.js} +5 -7
  31. package/dist/es/fields/Date/effect.js +10 -0
  32. package/dist/es/fields/DateTime/Index.js +5 -0
  33. package/dist/es/fields/{DateTime.vue_vue_type_script_setup_true_lang.js → DateTime/Index.vue_vue_type_script_setup_true_lang.js} +5 -9
  34. package/dist/es/fields/DateTime/effect.js +15 -0
  35. package/dist/es/fields/Daterange.vue_vue_type_script_setup_true_lang.js +2 -2
  36. package/dist/es/fields/Display/Index.js +5 -0
  37. package/dist/es/fields/{Display.vue_vue_type_script_setup_true_lang.js → Display/Index.vue_vue_type_script_setup_true_lang.js} +6 -7
  38. package/dist/es/fields/Display/effect.js +8 -0
  39. package/dist/es/fields/DynamicField/Index.js +5 -0
  40. package/dist/es/fields/{DynamicField.vue_vue_type_script_setup_true_lang.js → DynamicField/Index.vue_vue_type_script_setup_true_lang.js} +11 -15
  41. package/dist/es/fields/DynamicField/effect.js +40 -0
  42. package/dist/es/fields/Hidden.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/es/fields/Link.vue_vue_type_script_setup_true_lang.js +4 -4
  44. package/dist/es/fields/Number.vue_vue_type_script_setup_true_lang.js +4 -2
  45. package/dist/es/fields/NumberRange/Index.js +5 -0
  46. package/dist/es/fields/{NumberRange.vue_vue_type_script_setup_true_lang.js → NumberRange/Index.vue_vue_type_script_setup_true_lang.js} +5 -6
  47. package/dist/es/fields/NumberRange/effect.js +8 -0
  48. package/dist/es/fields/RadioGroup.vue_vue_type_script_setup_true_lang.js +5 -2
  49. package/dist/es/fields/Select.vue_vue_type_script_setup_true_lang.js +14 -6
  50. package/dist/es/fields/Switch.vue_vue_type_script_setup_true_lang.js +1 -1
  51. package/dist/es/fields/Text.vue_vue_type_script_setup_true_lang.js +13 -10
  52. package/dist/es/fields/Textarea.vue_vue_type_script_setup_true_lang.js +1 -1
  53. package/dist/es/fields/Time.vue_vue_type_script_setup_true_lang.js +1 -1
  54. package/dist/es/fields/Timerange.vue_vue_type_script_setup_true_lang.js +3 -3
  55. package/dist/es/headless.js +13 -0
  56. package/dist/es/index.js +19 -12
  57. package/dist/es/plugin.js +57 -39
  58. package/dist/es/schema.js +11 -2
  59. package/dist/es/style.css +123 -3
  60. package/dist/es/submitForm.js +270 -72
  61. package/dist/es/utils/builtInFields.js +49 -0
  62. package/dist/es/utils/collectFields.js +407 -0
  63. package/dist/es/utils/config.js +4 -8
  64. package/dist/es/utils/fieldInnerConfig.js +42 -0
  65. package/dist/es/utils/fieldValueEffects.js +80 -0
  66. package/dist/es/utils/form.js +154 -19
  67. package/dist/es/utils/formStateProxy.js +111 -0
  68. package/dist/es/utils/registerField.js +158 -0
  69. package/dist/es/utils/submitHeadless.js +54 -0
  70. package/dist/es/utils/tableGroupList.js +104 -0
  71. package/dist/es/utils/typeMatch.js +532 -0
  72. package/dist/es/utils/validateError.js +57 -0
  73. package/dist/es/utils/validateValues.js +115 -0
  74. package/dist/style.css +123 -3
  75. package/dist/themes/magic-admin.css +576 -14
  76. package/dist/tmagic-form-headless.umd.cjs +4515 -0
  77. package/dist/tmagic-form.umd.cjs +3444 -983
  78. package/package.json +16 -10
  79. package/src/Form.vue +113 -129
  80. package/src/FormBox.vue +16 -4
  81. package/src/FormDialog.vue +16 -5
  82. package/src/FormDrawer.vue +41 -13
  83. package/src/containers/Col.vue +3 -0
  84. package/src/containers/Container.vue +40 -45
  85. package/src/containers/Fieldset.vue +5 -0
  86. package/src/containers/FlexLayout.vue +2 -0
  87. package/src/containers/GroupList.vue +64 -13
  88. package/src/containers/GroupListItem.vue +88 -81
  89. package/src/containers/Panel.vue +3 -0
  90. package/src/containers/Row.vue +2 -0
  91. package/src/containers/Step.vue +2 -0
  92. package/src/containers/Tabs.vue +13 -0
  93. package/src/containers/table/ActionsColumn.vue +1 -1
  94. package/src/containers/table/Table.vue +5 -3
  95. package/src/containers/table/usePagination.ts +1 -1
  96. package/src/containers/table/useSortable.ts +1 -1
  97. package/src/containers/table/useTableColumns.ts +15 -22
  98. package/src/containers/table-group-list/TableGroupList.vue +46 -72
  99. package/src/containers/table-group-list/useAdd.ts +40 -25
  100. package/src/containers/table-group-list/useScrollLastItemIntoView.ts +94 -0
  101. package/src/fields/{CheckboxGroup.vue → CheckboxGroup/Index.vue} +3 -8
  102. package/src/fields/CheckboxGroup/effect.ts +27 -0
  103. package/src/fields/{Date.vue → Date/Index.vue} +2 -5
  104. package/src/fields/Date/effect.ts +29 -0
  105. package/src/fields/{DateTime.vue → DateTime/Index.vue} +2 -16
  106. package/src/fields/DateTime/effect.ts +36 -0
  107. package/src/fields/{Display.vue → Display/Index.vue} +3 -7
  108. package/src/fields/Display/effect.ts +28 -0
  109. package/src/fields/{DynamicField.vue → DynamicField/Index.vue} +11 -11
  110. package/src/fields/DynamicField/effect.ts +74 -0
  111. package/src/fields/Link.vue +3 -4
  112. package/src/fields/Number.vue +2 -1
  113. package/src/fields/{NumberRange.vue → NumberRange/Index.vue} +2 -6
  114. package/src/fields/NumberRange/effect.ts +27 -0
  115. package/src/fields/RadioGroup.vue +13 -1
  116. package/src/fields/Select.vue +13 -4
  117. package/src/headless.ts +78 -0
  118. package/src/index.ts +46 -9
  119. package/src/plugin.ts +68 -37
  120. package/src/schema.ts +13 -2
  121. package/src/submitForm.ts +410 -131
  122. package/src/theme/fieldset.scss +1 -0
  123. package/src/theme/form-box.scss +5 -0
  124. package/src/theme/form-dialog.scss +1 -1
  125. package/src/theme/group-list.scss +143 -2
  126. package/src/theme/table.scss +11 -1
  127. package/src/theme/themes/magic-admin/index.scss +27 -16
  128. package/src/utils/builtInFields.ts +69 -0
  129. package/src/utils/collectFields.ts +561 -0
  130. package/src/utils/config.ts +7 -15
  131. package/src/utils/fieldInnerConfig.ts +127 -0
  132. package/src/utils/fieldValueEffects.ts +140 -0
  133. package/src/utils/form.ts +230 -30
  134. package/src/utils/formStateProxy.ts +149 -0
  135. package/src/utils/registerField.ts +308 -0
  136. package/src/utils/submitHeadless.ts +206 -0
  137. package/src/utils/tableGroupList.ts +147 -0
  138. package/src/utils/typeMatch.ts +948 -0
  139. package/src/utils/validateError.ts +92 -0
  140. package/src/utils/validateValues.ts +177 -0
  141. package/types/headless.d.ts +682 -0
  142. package/types/index.d.ts +900 -180
  143. package/dist/es/_virtual/_rolldown/runtime.js +0 -27
  144. package/dist/es/fields/CheckboxGroup.js +0 -5
  145. package/dist/es/fields/Date.js +0 -5
  146. package/dist/es/fields/DateTime.js +0 -5
  147. package/dist/es/fields/Display.js +0 -5
  148. package/dist/es/fields/DynamicField.js +0 -5
  149. package/dist/es/fields/NumberRange.js +0 -5
@@ -1,8 +1,23 @@
1
1
  .m-fields-group-list {
2
+ // footer 高度由这三项派生,改 padding / 按钮尺寸时嵌套吸底按钮的偏移会跟着走;
3
+ // TableGroupList 计算 scroll-margin 时量的是同一个 footer 的实际高度,两边不会漂移
4
+ --m-group-list-footer-padding-top: 12px;
5
+ --m-group-list-footer-padding-bottom: 16px;
6
+ --m-group-list-footer-button-height: 32px;
7
+ --m-group-list-footer-height: calc(
8
+ var(--m-group-list-footer-padding-top) +
9
+ var(--m-group-list-footer-button-height) +
10
+ var(--m-group-list-footer-padding-bottom)
11
+ );
12
+ --m-group-list-footer-bg: var(--el-bg-color, #fff);
13
+ --m-group-list-header-height: 65px;
14
+ --m-group-list-header-bg: #fff;
15
+ width: 100%;
16
+ min-width: 0;
17
+
2
18
  .m-fields-group-list-item.tmagic-design-card--flat:last-child {
3
19
  border: 0;
4
20
  }
5
-
6
21
  .el-button--text {
7
22
  padding: 0;
8
23
  margin-bottom: 7px;
@@ -17,6 +32,7 @@
17
32
  }
18
33
 
19
34
  .m-fields-group-list-item {
35
+ overflow: visible;
20
36
  border-bottom: 1px solid #ebeef5;
21
37
  margin-bottom: 7px;
22
38
 
@@ -24,16 +40,141 @@
24
40
  border-bottom: 0;
25
41
  }
26
42
 
43
+ .el-card__body,
44
+ .t-card__body {
45
+ overflow: visible;
46
+
47
+ > .m-container-row {
48
+ overflow: visible;
49
+ }
50
+
51
+ .tmagic-design-form-item {
52
+ margin-bottom: 16px;
53
+ }
54
+ }
55
+
27
56
  .m-fields-group-list-item-header {
28
57
  display: flex;
29
58
  align-items: center;
30
59
  gap: 8px;
31
60
  }
61
+
62
+ .m-fields-group-list-item-title {
63
+ flex: 1;
64
+ min-width: 0;
65
+ }
66
+
67
+ .m-fields-group-list-item-actions {
68
+ display: flex;
69
+ align-items: center;
70
+ flex-shrink: 0;
71
+ gap: 8px;
72
+ }
73
+ }
74
+
75
+ // 嵌套吸底按钮叠在外层 footer 之上(如「新增条件」叠在「新增条件组」上面)。
76
+ // 每穿过一层「自己渲染了吸底 footer」的列表才多让出一个 footer 高度,外层没有吸底按钮时
77
+ // 内层不能凭空抬高。自定义属性不能自增,所以用 item / list 两个变量交替接力。
78
+ > .m-fields-group-list-item {
79
+ --m-group-list-item-footer-bottom: var(
80
+ --m-group-list-nested-footer-bottom,
81
+ 0px
82
+ );
83
+ }
84
+
85
+ &.is-footer-sticky > .m-fields-group-list-item {
86
+ --m-group-list-item-footer-bottom: calc(
87
+ var(--m-group-list-nested-footer-bottom, 0px) +
88
+ var(--m-group-list-footer-height)
89
+ );
90
+ }
91
+
92
+ .m-fields-group-list-item .m-fields-group-list {
93
+ --m-group-list-nested-footer-bottom: var(
94
+ --m-group-list-item-footer-bottom,
95
+ 0px
96
+ );
97
+ }
98
+
99
+ // 仅 header.sticky 时标题吸顶;直接子 item,避免外层吸顶带动未开启的内层
100
+ &.is-header-sticky {
101
+ // 从外层 item 接过已累加的偏移;最外层没有该变量时走 fallback
102
+ --m-group-list-nested-sticky-top: var(--m-group-list-child-list-sticky-top);
103
+ --m-group-list-nested-header-z: var(--m-group-list-child-list-header-z);
104
+
105
+ > .m-fields-group-list-item {
106
+ --m-group-list-item-sticky-top: var(
107
+ --m-group-list-nested-sticky-top,
108
+ var(--m-group-list-header-sticky-top, 0px)
109
+ );
110
+ --m-group-list-item-header-z: var(--m-group-list-nested-header-z, 7);
111
+ --m-group-list-child-list-sticky-top: calc(
112
+ var(--m-group-list-item-sticky-top) + var(--m-group-list-header-height)
113
+ );
114
+ --m-group-list-child-list-header-z: calc(
115
+ var(--m-group-list-item-header-z) - 1
116
+ );
117
+
118
+ // 卡片标题吸顶;补不透明背景,避免滚动时正文透出。
119
+ // z-index 必须低于吸底 footer,否则标题会盖住「新增」按钮。
120
+ > .el-card__header,
121
+ > .t-card__header {
122
+ position: sticky;
123
+ top: var(--m-group-list-item-sticky-top);
124
+ z-index: var(--m-group-list-item-header-z);
125
+ background-color: var(--m-group-list-header-bg, #fff);
126
+ }
127
+ }
32
128
  }
33
129
 
34
- .m-fields-group-list-footer {
130
+ .el-table__empty-block {
131
+ width: 100%;
132
+ min-height: 0;
133
+ }
134
+
135
+ .el-table__empty-text {
136
+ display: block;
137
+ box-sizing: border-box;
138
+ width: 100%;
139
+ }
140
+
141
+ > .m-fields-group-list-footer {
35
142
  display: flex;
36
143
  justify-content: space-between;
37
144
  margin-top: 10px;
145
+ margin-bottom: 16px;
146
+ }
147
+
148
+ // 吸底全宽主按钮(event-select / code-select / display-conds 外层列表)
149
+ // z-index 高于 item header,避免吸顶标题挡住新增按钮;多层时 bottom 由内层 list 累加
150
+ > .m-fields-group-list-footer.is-sticky-full {
151
+ position: sticky;
152
+ bottom: var(--m-group-list-nested-footer-bottom, 0px);
153
+ z-index: 7;
154
+ margin-bottom: 0;
155
+ padding: var(--m-group-list-footer-padding-top) 0
156
+ var(--m-group-list-footer-padding-bottom);
157
+ background-color: var(--m-group-list-footer-bg);
158
+
159
+ > div {
160
+ justify-content: stretch;
161
+ }
162
+
163
+ .el-button,
164
+ .tmagic-design-button {
165
+ width: 100%;
166
+ height: var(--m-group-list-footer-button-height);
167
+ }
168
+ }
169
+ }
170
+
171
+ /** 最外层的groupList需要每个item需要增加空白区域界限时,增加outer-gorup_list可以实现 */
172
+ .m-container-group-list {
173
+ &.outer-gorup_list {
174
+ > .m-fields-group-list {
175
+ > .m-fields-group-list-item {
176
+ margin-bottom: 10px;
177
+ }
178
+ }
38
179
  }
39
180
  }
@@ -26,6 +26,16 @@
26
26
  }
27
27
  }
28
28
 
29
+ .el-form-item {
30
+ .m-fields-table {
31
+ .el-form-item {
32
+ &.is-error {
33
+ margin-bottom: 18px;
34
+ }
35
+ }
36
+ }
37
+ }
38
+
29
39
  .m-fields-table {
30
40
  width: 100%;
31
41
 
@@ -62,7 +72,7 @@
62
72
  }
63
73
  }
64
74
 
65
- .el-form-item {
75
+ .el-form-item:not(.is-error) {
66
76
  margin-bottom: 0;
67
77
  }
68
78
 
@@ -1,21 +1,29 @@
1
1
  // magic-admin 主题:所有规则均以 `.m-form.m-form--magic-admin` 为前缀,
2
2
  // 仅在 `<MForm theme="magic-admin" />` 时生效,避免污染默认样式。
3
+ @use "../../index.scss";
4
+
3
5
  .m-form.m-form--magic-admin {
6
+ // 精确匹配"只挂 `m-form-container` + `m-container-fieldset` 这两个 class"的元素:
7
+ // `.a.b` 只能保证"包含"这两个 class,多余的 class 也会命中;
8
+ // 用 `[class="..."]` 做全量字符串等值匹配即可排除第三个 class 的情况。
9
+ // 由于 Vue/框架不保证 class 拼接顺序,两种顺序都列出以覆盖到位。
10
+ [class="m-form-container m-container-fieldset"],
11
+ [class="m-container-fieldset m-form-container"] {
12
+ margin-top: 15px;
13
+ }
14
+
4
15
  .m-container-tab:not(.magic-right-panel-tabs-top):not(
5
16
  .magic-form-dynamic-tab
6
17
  ) {
7
18
  > .tmagic-design-tabs:not(.el-tabs--border-card) {
8
- > .el-tabs__content {
19
+ > .el-tabs__content,
20
+ > .t-tabs__content {
9
21
  background-color: #fff;
10
22
  padding: 16px 16px 0 16px;
11
23
  border-radius: 4px;
12
24
  }
13
25
  }
14
26
  }
15
-
16
- .m-container-tab.magic-form-dynamic-tab {
17
- }
18
-
19
27
  .m-form-tip {
20
28
  color: rgba(0, 0, 0, 0.55);
21
29
  }
@@ -37,18 +45,13 @@
37
45
  .el-form-item__content {
38
46
  .tmagic-design-radio-group {
39
47
  .tmagic-design-radio-button {
40
- margin-right: 8px;
41
48
  height: 32px;
42
49
  .el-radio-button__inner {
43
- outline: none !important;
44
- border: 0 !important;
45
50
  height: 32px;
46
- height: 32px;
47
- border-radius: 16px;
48
- padding: 0 16px;
49
- display: inline-flex;
51
+ display: flex;
52
+ padding-top: 0;
53
+ padding-bottom: 0;
50
54
  align-items: center;
51
- justify-content: center;
52
55
  }
53
56
  }
54
57
  }
@@ -73,10 +76,7 @@
73
76
  }
74
77
  }
75
78
  .m-fields-group-list-item-header {
76
- position: relative;
77
79
  .delete-button {
78
- position: absolute;
79
- right: 0;
80
80
  color: #0f1113;
81
81
  }
82
82
  }
@@ -86,4 +86,15 @@
86
86
  text-align: left;
87
87
  }
88
88
  }
89
+
90
+ .m-fields-group-list {
91
+ .el-table__empty-block {
92
+ .el-table__empty-text {
93
+ width: 100%;
94
+ background-color: rgba(0, 0, 0, 0.03);
95
+ margin-top: 8px;
96
+ border-radius: 4px;
97
+ }
98
+ }
99
+ }
89
100
  }
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Tencent is pleased to support the open source community by making TMagicEditor available.
3
+ *
4
+ * Copyright (C) 2025 Tencent. All rights reserved.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import { effect as checkboxGroupEffect } from '../fields/CheckboxGroup/effect';
20
+ import { effect as dateEffect } from '../fields/Date/effect';
21
+ import { effect as dateTimeEffect } from '../fields/DateTime/effect';
22
+ import { effect as displayEffect } from '../fields/Display/effect';
23
+ import { effect as dynamicFieldEffect } from '../fields/DynamicField/effect';
24
+ import { effect as numberRangeEffect } from '../fields/NumberRange/effect';
25
+
26
+ import { expandFieldset, expandPanel, expandRow, expandStep, expandTab, expandTableGroupList } from './collectFields';
27
+ import { type HeadlessFieldOptions } from './registerField';
28
+
29
+ /**
30
+ * 内置字段的无渲染登记表(不含 Vue 组件)。
31
+ *
32
+ * 本模块只导出数据,不登记。调用方自行 `registerBuiltInFields(builtInFields)`,
33
+ * 或 `app.use(MagicForm)`(install 里会登记叠上 Vue 组件后的表)。
34
+ */
35
+ export const builtInFields: Record<string, HeadlessFieldOptions> = {
36
+ text: {},
37
+ 'img-upload': {},
38
+ number: {},
39
+ 'number-range': { effect: numberRangeEffect },
40
+ textarea: {},
41
+ hidden: {},
42
+ date: { effect: dateEffect },
43
+ datetime: { effect: dateTimeEffect },
44
+ daterange: {},
45
+ timerange: {},
46
+ time: {},
47
+ checkbox: {},
48
+ switch: {},
49
+ 'color-picker': {},
50
+ 'checkbox-group': { effect: checkboxGroupEffect },
51
+ 'radio-group': {},
52
+ display: { effect: displayEffect },
53
+ link: {},
54
+ select: {},
55
+ cascader: {},
56
+ 'dynamic-field': { effect: dynamicFieldEffect },
57
+ // Container 对 `type: 'component'` 直接渲染 `config.component`,没有独立的 m-fields-component
58
+ component: {},
59
+ // `type: 'container'` 不登记为叶子:未登记且带 items 时 dispatch 会按普通容器下钻
60
+ tab: { walk: expandTab },
61
+ row: { walk: expandRow },
62
+ 'flex-layout': { walk: expandRow },
63
+ fieldset: { walk: expandFieldset },
64
+ panel: { walk: expandPanel },
65
+ step: { walk: expandStep },
66
+ table: { walk: expandTableGroupList },
67
+ 'group-list': { walk: expandTableGroupList },
68
+ 'table-group-list': { walk: expandTableGroupList },
69
+ };