@tmagic/form 1.8.0-beta.25 → 1.8.0-beta.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 (131) hide show
  1. package/dist/es/Form.vue_vue_type_script_setup_true_lang.js +47 -120
  2. package/dist/es/FormBox.vue_vue_type_script_setup_true_lang.js +3 -3
  3. package/dist/es/FormDialog.vue_vue_type_script_setup_true_lang.js +3 -3
  4. package/dist/es/FormDrawer.vue_vue_type_script_setup_true_lang.js +3 -3
  5. package/dist/es/containers/Col.vue_vue_type_script_setup_true_lang.js +3 -0
  6. package/dist/es/containers/Container.vue_vue_type_script_setup_true_lang.js +36 -51
  7. package/dist/es/containers/Fieldset.vue_vue_type_script_setup_true_lang.js +6 -0
  8. package/dist/es/containers/FlexLayout.vue_vue_type_script_setup_true_lang.js +4 -1
  9. package/dist/es/containers/GroupList.vue_vue_type_script_setup_true_lang.js +37 -15
  10. package/dist/es/containers/GroupListItem.vue_vue_type_script_setup_true_lang.js +109 -97
  11. package/dist/es/containers/Panel.vue_vue_type_script_setup_true_lang.js +7 -2
  12. package/dist/es/containers/Row.vue_vue_type_script_setup_true_lang.js +3 -0
  13. package/dist/es/containers/Step.vue_vue_type_script_setup_true_lang.js +4 -1
  14. package/dist/es/containers/Tabs.vue_vue_type_script_setup_true_lang.js +7 -0
  15. package/dist/es/containers/table/Table.vue_vue_type_script_setup_true_lang.js +7 -5
  16. package/dist/es/containers/table/useTableColumns.js +5 -13
  17. package/dist/es/containers/table-group-list/TableGroupList.vue_vue_type_script_setup_true_lang.js +71 -78
  18. package/dist/es/containers/table-group-list/useAdd.js +26 -16
  19. package/dist/es/containers/table-group-list/useScrollLastItemIntoView.js +72 -0
  20. package/dist/es/fields/Cascader.vue_vue_type_script_setup_true_lang.js +1 -1
  21. package/dist/es/fields/CheckboxGroup/Index.js +5 -0
  22. 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
  23. package/dist/es/fields/CheckboxGroup/effect.js +8 -0
  24. package/dist/es/fields/Date/Index.js +5 -0
  25. 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
  26. package/dist/es/fields/Date/effect.js +10 -0
  27. package/dist/es/fields/DateTime/Index.js +5 -0
  28. 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
  29. package/dist/es/fields/DateTime/effect.js +15 -0
  30. package/dist/es/fields/Display/Index.js +5 -0
  31. 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
  32. package/dist/es/fields/Display/effect.js +8 -0
  33. package/dist/es/fields/DynamicField/Index.js +5 -0
  34. 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
  35. package/dist/es/fields/DynamicField/effect.js +40 -0
  36. package/dist/es/fields/Link.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/Number.vue_vue_type_script_setup_true_lang.js +1 -1
  38. package/dist/es/fields/NumberRange/Index.js +5 -0
  39. 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
  40. package/dist/es/fields/NumberRange/effect.js +8 -0
  41. package/dist/es/fields/Select.vue_vue_type_script_setup_true_lang.js +13 -6
  42. package/dist/es/fields/Text.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/es/headless.js +13 -0
  44. package/dist/es/index.js +17 -12
  45. package/dist/es/plugin.js +57 -41
  46. package/dist/es/schema.js +6 -8
  47. package/dist/es/style.css +81 -1
  48. package/dist/es/submitForm.js +44 -194
  49. package/dist/es/utils/builtInFields.js +49 -0
  50. package/dist/es/utils/collectFields.js +407 -0
  51. package/dist/es/utils/config.js +1 -8
  52. package/dist/es/utils/fieldInnerConfig.js +42 -0
  53. package/dist/es/utils/fieldValueEffects.js +80 -0
  54. package/dist/es/utils/form.js +96 -43
  55. package/dist/es/utils/formStateProxy.js +111 -0
  56. package/dist/es/utils/registerField.js +158 -0
  57. package/dist/es/utils/submitHeadless.js +54 -0
  58. package/dist/es/utils/tableGroupList.js +85 -0
  59. package/dist/es/utils/typeMatch.js +17 -19
  60. package/dist/es/utils/validateError.js +57 -0
  61. package/dist/es/utils/validateValues.js +115 -0
  62. package/dist/style.css +81 -1
  63. package/dist/themes/magic-admin.css +83 -7
  64. package/dist/tmagic-form-headless.umd.cjs +4080 -0
  65. package/dist/tmagic-form.umd.cjs +2020 -876
  66. package/package.json +10 -4
  67. package/src/Form.vue +49 -149
  68. package/src/FormBox.vue +5 -4
  69. package/src/FormDialog.vue +5 -5
  70. package/src/FormDrawer.vue +5 -5
  71. package/src/containers/Col.vue +2 -0
  72. package/src/containers/Container.vue +86 -157
  73. package/src/containers/Fieldset.vue +5 -0
  74. package/src/containers/FlexLayout.vue +2 -0
  75. package/src/containers/GroupList.vue +41 -11
  76. package/src/containers/GroupListItem.vue +83 -80
  77. package/src/containers/Panel.vue +3 -0
  78. package/src/containers/Row.vue +2 -0
  79. package/src/containers/Step.vue +2 -0
  80. package/src/containers/Tabs.vue +13 -0
  81. package/src/containers/table/ActionsColumn.vue +1 -1
  82. package/src/containers/table/Table.vue +4 -3
  83. package/src/containers/table/usePagination.ts +1 -1
  84. package/src/containers/table/useSortable.ts +1 -1
  85. package/src/containers/table/useTableColumns.ts +9 -19
  86. package/src/containers/table-group-list/TableGroupList.vue +43 -71
  87. package/src/containers/table-group-list/useAdd.ts +40 -25
  88. package/src/containers/table-group-list/useScrollLastItemIntoView.ts +94 -0
  89. package/src/fields/{CheckboxGroup.vue → CheckboxGroup/Index.vue} +3 -8
  90. package/src/fields/CheckboxGroup/effect.ts +27 -0
  91. package/src/fields/{Date.vue → Date/Index.vue} +2 -5
  92. package/src/fields/Date/effect.ts +29 -0
  93. package/src/fields/{DateTime.vue → DateTime/Index.vue} +2 -16
  94. package/src/fields/DateTime/effect.ts +36 -0
  95. package/src/fields/{Display.vue → Display/Index.vue} +3 -7
  96. package/src/fields/Display/effect.ts +28 -0
  97. package/src/fields/{DynamicField.vue → DynamicField/Index.vue} +11 -11
  98. package/src/fields/DynamicField/effect.ts +74 -0
  99. package/src/fields/{NumberRange.vue → NumberRange/Index.vue} +2 -6
  100. package/src/fields/NumberRange/effect.ts +27 -0
  101. package/src/fields/Select.vue +13 -4
  102. package/src/headless.ts +78 -0
  103. package/src/index.ts +32 -15
  104. package/src/plugin.ts +63 -42
  105. package/src/schema.ts +6 -8
  106. package/src/submitForm.ts +81 -409
  107. package/src/theme/group-list.scss +107 -1
  108. package/src/theme/themes/magic-admin/index.scss +2 -8
  109. package/src/utils/builtInFields.ts +69 -0
  110. package/src/utils/collectFields.ts +561 -0
  111. package/src/utils/config.ts +1 -15
  112. package/src/utils/fieldInnerConfig.ts +127 -0
  113. package/src/utils/fieldValueEffects.ts +140 -0
  114. package/src/utils/form.ts +141 -75
  115. package/src/utils/formStateProxy.ts +149 -0
  116. package/src/utils/registerField.ts +308 -0
  117. package/src/utils/submitHeadless.ts +206 -0
  118. package/src/utils/tableGroupList.ts +120 -0
  119. package/src/utils/typeMatch.ts +19 -15
  120. package/src/utils/validateError.ts +92 -0
  121. package/src/utils/validateValues.ts +177 -0
  122. package/types/headless.d.ts +682 -0
  123. package/types/index.d.ts +631 -272
  124. package/dist/es/fields/CheckboxGroup.js +0 -5
  125. package/dist/es/fields/Date.js +0 -5
  126. package/dist/es/fields/DateTime.js +0 -5
  127. package/dist/es/fields/Display.js +0 -5
  128. package/dist/es/fields/DynamicField.js +0 -5
  129. package/dist/es/fields/NumberRange.js +0 -5
  130. package/dist/es/utils/silentLeafFieldTypes.js +0 -49
  131. package/src/utils/silentLeafFieldTypes.ts +0 -71
@@ -1,4 +1,20 @@
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
  }
@@ -16,6 +32,7 @@
16
32
  }
17
33
 
18
34
  .m-fields-group-list-item {
35
+ overflow: visible;
19
36
  border-bottom: 1px solid #ebeef5;
20
37
  margin-bottom: 7px;
21
38
 
@@ -23,18 +40,107 @@
23
40
  border-bottom: 0;
24
41
  }
25
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
+
26
56
  .m-fields-group-list-item-header {
27
57
  display: flex;
28
58
  align-items: center;
29
59
  gap: 8px;
30
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
+ // z-index 必须低于吸底 footer,否则标题会盖住「新增」按钮。
76
+ > .el-card__header,
77
+ > .t-card__header {
78
+ position: sticky;
79
+ top: var(--m-group-list-header-sticky-top, 0px);
80
+ z-index: 7;
81
+ background-color: var(--m-group-list-header-bg, #fff);
82
+ }
31
83
  }
32
84
 
33
- .m-fields-group-list-footer {
85
+ // 嵌套标题叠在外层标题之下,层级更低以免盖住外层底部分隔线
86
+ .m-fields-group-list-item .m-fields-group-list-item {
87
+ > .el-card__header,
88
+ > .t-card__header {
89
+ top: calc(
90
+ var(--m-group-list-header-sticky-top, 0px) +
91
+ var(--m-group-list-header-height)
92
+ );
93
+ z-index: 6;
94
+ }
95
+ }
96
+
97
+ .el-table__empty-block {
98
+ width: 100%;
99
+ min-height: 0;
100
+ }
101
+
102
+ .el-table__empty-text {
103
+ display: block;
104
+ box-sizing: border-box;
105
+ width: 100%;
106
+ }
107
+
108
+ > .m-fields-group-list-footer {
109
+ display: flex;
34
110
  justify-content: space-between;
35
111
  margin-top: 10px;
36
112
  margin-bottom: 16px;
37
113
  }
114
+
115
+ // 吸底全宽主按钮(event-select / code-select / display-conds 外层列表)
116
+ // z-index 高于 item header,避免吸顶标题挡住新增按钮
117
+ > .m-fields-group-list-footer.is-sticky-full {
118
+ position: sticky;
119
+ bottom: 0;
120
+ z-index: 7;
121
+ margin-bottom: 0;
122
+ padding: var(--m-group-list-footer-padding-top) 0
123
+ var(--m-group-list-footer-padding-bottom);
124
+ background-color: var(--m-group-list-footer-bg);
125
+
126
+ > div {
127
+ justify-content: stretch;
128
+ }
129
+
130
+ .el-button,
131
+ .tmagic-design-button {
132
+ width: 100%;
133
+ height: var(--m-group-list-footer-button-height);
134
+ }
135
+ }
136
+
137
+ // 嵌套吸底按钮叠在外层 footer 之上(如「新增条件」叠在「新增条件组」上面)
138
+ .m-fields-group-list-item
139
+ .m-fields-group-list
140
+ > .m-fields-group-list-footer.is-sticky-full {
141
+ bottom: var(--m-group-list-footer-height);
142
+ z-index: 7;
143
+ }
38
144
  }
39
145
 
40
146
  /** 最外层的groupList需要每个item需要增加空白区域界限时,增加outer-gorup_list可以实现 */
@@ -16,17 +16,14 @@
16
16
  .magic-form-dynamic-tab
17
17
  ) {
18
18
  > .tmagic-design-tabs:not(.el-tabs--border-card) {
19
- > .el-tabs__content {
19
+ > .el-tabs__content,
20
+ > .t-tabs__content {
20
21
  background-color: #fff;
21
22
  padding: 16px 16px 0 16px;
22
23
  border-radius: 4px;
23
24
  }
24
25
  }
25
26
  }
26
-
27
- .m-container-tab.magic-form-dynamic-tab {
28
- }
29
-
30
27
  .m-form-tip {
31
28
  color: rgba(0, 0, 0, 0.55);
32
29
  }
@@ -79,10 +76,7 @@
79
76
  }
80
77
  }
81
78
  .m-fields-group-list-item-header {
82
- position: relative;
83
79
  .delete-button {
84
- position: absolute;
85
- right: 0;
86
80
  color: #0f1113;
87
81
  }
88
82
  }
@@ -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
+ };