@tmagic/form 1.8.0-beta.9 → 1.8.0-manmanyu.11

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 (64) hide show
  1. package/dist/es/Form.vue_vue_type_script_setup_true_lang.js +44 -5
  2. package/dist/es/FormDialog.vue_vue_type_script_setup_true_lang.js +12 -5
  3. package/dist/es/FormDrawer.vue_vue_type_script_setup_true_lang.js +37 -12
  4. package/dist/es/containers/Container.vue_vue_type_script_setup_true_lang.js +22 -16
  5. package/dist/es/containers/GroupList.vue_vue_type_script_setup_true_lang.js +6 -5
  6. package/dist/es/containers/GroupListItem.vue_vue_type_script_setup_true_lang.js +41 -31
  7. package/dist/es/containers/Panel.vue_vue_type_script_setup_true_lang.js +16 -10
  8. package/dist/es/containers/table/ActionsColumn.vue_vue_type_script_setup_true_lang.js +13 -6
  9. package/dist/es/containers/table/Table.vue_vue_type_script_setup_true_lang.js +4 -2
  10. package/dist/es/containers/table/useTableColumns.js +6 -2
  11. package/dist/es/containers/table-group-list/TableGroupList.vue_vue_type_script_setup_true_lang.js +2 -1
  12. package/dist/es/fields/Cascader.vue_vue_type_script_setup_true_lang.js +4 -1
  13. package/dist/es/fields/Checkbox.vue_vue_type_script_setup_true_lang.js +4 -1
  14. package/dist/es/fields/CheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -1
  15. package/dist/es/fields/ColorPicker.vue_vue_type_script_setup_true_lang.js +4 -1
  16. package/dist/es/fields/Date.vue_vue_type_script_setup_true_lang.js +4 -1
  17. package/dist/es/fields/DateTime.vue_vue_type_script_setup_true_lang.js +4 -1
  18. package/dist/es/fields/Daterange.vue_vue_type_script_setup_true_lang.js +4 -1
  19. package/dist/es/fields/Display.vue_vue_type_script_setup_true_lang.js +4 -1
  20. package/dist/es/fields/DynamicField.vue_vue_type_script_setup_true_lang.js +4 -1
  21. package/dist/es/fields/Link.vue_vue_type_script_setup_true_lang.js +29 -7
  22. package/dist/es/fields/Number.vue_vue_type_script_setup_true_lang.js +8 -3
  23. package/dist/es/fields/NumberRange.vue_vue_type_script_setup_true_lang.js +4 -1
  24. package/dist/es/fields/RadioGroup.vue_vue_type_script_setup_true_lang.js +16 -8
  25. package/dist/es/fields/Select.vue_vue_type_script_setup_true_lang.js +4 -1
  26. package/dist/es/fields/Switch.vue_vue_type_script_setup_true_lang.js +4 -1
  27. package/dist/es/fields/Text.vue_vue_type_script_setup_true_lang.js +112 -77
  28. package/dist/es/fields/Textarea.vue_vue_type_script_setup_true_lang.js +4 -1
  29. package/dist/es/fields/Time.vue_vue_type_script_setup_true_lang.js +4 -1
  30. package/dist/es/fields/Timerange.vue_vue_type_script_setup_true_lang.js +4 -1
  31. package/dist/es/plugin.js +2 -0
  32. package/dist/es/style.css +121 -8
  33. package/dist/style.css +121 -8
  34. package/dist/themes/magic-admin.css +495 -0
  35. package/dist/tmagic-form.umd.cjs +448 -225
  36. package/package.json +4 -4
  37. package/src/Form.vue +53 -4
  38. package/src/FormDialog.vue +14 -3
  39. package/src/FormDrawer.vue +40 -12
  40. package/src/containers/Container.vue +16 -5
  41. package/src/containers/GroupList.vue +1 -1
  42. package/src/containers/GroupListItem.vue +28 -22
  43. package/src/containers/Panel.vue +10 -3
  44. package/src/containers/table/ActionsColumn.vue +10 -4
  45. package/src/containers/table/Table.vue +1 -0
  46. package/src/containers/table/useTableColumns.ts +10 -4
  47. package/src/containers/table-group-list/TableGroupList.vue +7 -1
  48. package/src/fields/Link.vue +17 -3
  49. package/src/fields/Number.vue +5 -2
  50. package/src/fields/RadioGroup.vue +11 -5
  51. package/src/fields/Text.vue +43 -19
  52. package/src/plugin.ts +2 -0
  53. package/src/theme/container.scss +3 -0
  54. package/src/theme/fieldset.scss +50 -0
  55. package/src/theme/form.scss +6 -0
  56. package/src/theme/group-list.scss +9 -7
  57. package/src/theme/index.scss +1 -0
  58. package/src/theme/link.scss +17 -0
  59. package/src/theme/panel.scss +1 -1
  60. package/src/theme/radio-group.scss +23 -0
  61. package/src/theme/tabs.scss +2 -2
  62. package/src/theme/text.scss +38 -0
  63. package/src/theme/themes/magic-admin/index.scss +91 -0
  64. package/types/index.d.ts +46 -1
@@ -2,9 +2,9 @@ import { FORM_DIFF_CONFIG_KEY } from "./schema.js";
2
2
  import { getConfig } from "./utils/config.js";
3
3
  import { initValue } from "./utils/form.js";
4
4
  import Container_default from "./containers/Container.js";
5
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createSlots, defineComponent, mergeProps, normalizeStyle, openBlock, provide, reactive, ref, renderList, renderSlot, shallowRef, toRaw, unref, useTemplateRef, watch, watchEffect, withCtx } from "vue";
5
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createSlots, defineComponent, inject, mergeProps, normalizeClass, normalizeStyle, openBlock, provide, reactive, ref, renderList, renderSlot, shallowRef, toRaw, unref, useTemplateRef, watch, watchEffect, withCtx } from "vue";
6
6
  import { cloneDeep, isEqual } from "lodash-es";
7
- import { TMagicForm, tMagicMessage, tMagicMessageBox } from "@tmagic/design";
7
+ import { M_THEME_KEY, TMagicForm, tMagicMessage, tMagicMessageBox } from "@tmagic/design";
8
8
  import { setValueByKeyPath } from "@tmagic/utils";
9
9
  //#region packages/form/src/Form.vue?vue&type=script&setup=true&lang.ts
10
10
  var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -37,7 +37,8 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
37
37
  preventSubmitDefault: { type: Boolean },
38
38
  extendState: {},
39
39
  showDiff: {},
40
- selfDiffFieldTypes: {}
40
+ selfDiffFieldTypes: {},
41
+ theme: {}
41
42
  },
42
43
  emits: [
43
44
  "change",
@@ -56,6 +57,25 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
56
57
  const fields = /* @__PURE__ */ new Map();
57
58
  const requestFuc = getConfig("request");
58
59
  /**
60
+ * 当前表单生效的主题名称:
61
+ * - 优先用本组件自己的 `props.theme`;
62
+ * - 没设置时回退到最近祖先 `<MEditor>` / `<MForm>` provide 的主题,便于内嵌于编辑器
63
+ * 时自动跟随外层主题,无需在每个 `MForm` 上重复传 `theme`。
64
+ *
65
+ * 同时把合并后的值再 provide 出去(见下方 `provide(M_THEME_KEY, ...)`),让 form 子树
66
+ * 里再嵌套的 portal 组件(`TMagicPopover` 等)依然能拿到非空主题。
67
+ */
68
+ const ancestorTheme = inject(M_THEME_KEY, null);
69
+ const effectiveTheme = computed(() => props.theme || ancestorTheme?.value || "");
70
+ /**
71
+ * 拼到 `formState.popperClass` 上的主题修饰类(仅 `m-theme--<theme>`,
72
+ * 不带 `m-form` / `m-editor` 前缀,因为 Element Plus 弹层节点本身既不是 form 也不是 editor)。
73
+ *
74
+ * 这条类会随所有读 `mForm.popperClass` 的字段(Select / DateTime / Cascader 等)下发到
75
+ * Element Plus 的 `popper-class`,让 portal 节点也命中 `m-theme--<theme>` 上的 CSS 变量。
76
+ */
77
+ const themeClass = computed(() => effectiveTheme.value ? `m-theme--${effectiveTheme.value}` : "");
78
+ /**
59
79
  * formState 实现说明:
60
80
  *
61
81
  * 1. 与 props 直接对应的字段(config / initValues / lastValues / isCompare / parentValues /
@@ -71,13 +91,21 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
71
91
  * 把最新值刷进 formState。
72
92
  * - accessor 描述符(`{ get stage() { return ... } }`)按原样写入,调用方可以控制
73
93
  * 读时求值,每次读取都会重新执行 getter。
94
+ *
95
+ * 4. `popperClass` 会自动拼接 `themeClass`:调用方传入的 `popperClass` + 当前主题
96
+ * 修饰类(含祖先 `<MEditor>` provide 的主题)。这样所有透传到 Element Plus 弹层
97
+ * `popper-class` 的字段(Select / DateTime / Cascader 等)能自带主题作用域。
74
98
  */
75
99
  const formState = reactive({
76
100
  get keyProp() {
77
101
  return props.keyProp;
78
102
  },
79
103
  get popperClass() {
80
- return props.popperClass;
104
+ const userClass = props.popperClass ?? "";
105
+ const tc = themeClass.value;
106
+ if (!userClass) return tc;
107
+ if (!tc) return userClass;
108
+ return `${userClass} ${tc}`;
81
109
  },
82
110
  get config() {
83
111
  return props.config;
@@ -153,6 +181,12 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
153
181
  }
154
182
  });
155
183
  provide("mForm", formState);
184
+ /**
185
+ * 把生效主题(自身或祖先)再 provide 出去,供 form 子树内含 `Teleport` 的组件
186
+ * (如 `TMagicPopover`)在传送目标上挂 `m-theme--<theme>` 类。
187
+ * 详见 `@tmagic/design/theme.ts`。
188
+ */
189
+ provide(M_THEME_KEY, effectiveTheme);
156
190
  provide(FORM_DIFF_CONFIG_KEY, {
157
191
  get showDiff() {
158
192
  return props.showDiff;
@@ -256,7 +290,11 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
256
290
  });
257
291
  return (_ctx, _cache) => {
258
292
  return openBlock(), createBlock(unref(TMagicForm), {
259
- class: "m-form",
293
+ class: normalizeClass([
294
+ "m-form",
295
+ effectiveTheme.value ? `m-form--${effectiveTheme.value}` : "",
296
+ effectiveTheme.value ? `m-theme--${effectiveTheme.value}` : ""
297
+ ]),
260
298
  ref: "tMagicForm",
261
299
  model: values.value,
262
300
  "label-width": __props.labelWidth,
@@ -294,6 +332,7 @@ var Form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
294
332
  }), 128)) : createCommentVNode("v-if", true)]),
295
333
  _: 3
296
334
  }, 8, [
335
+ "class",
297
336
  "model",
298
337
  "label-width",
299
338
  "style",
@@ -1,6 +1,6 @@
1
1
  import Form_default from "./Form.js";
2
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeStyle, openBlock, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
3
- import { TMagicButton, TMagicCol, TMagicDialog, TMagicRow } from "@tmagic/design";
2
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, openBlock, provide, ref, renderSlot, toDisplayString, unref, withCtx } from "vue";
3
+ import { M_THEME_KEY, TMagicButton, TMagicCol, TMagicDialog, TMagicRow } from "@tmagic/design";
4
4
  //#region packages/form/src/FormDialog.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = { style: { "min-height": "1px" } };
6
6
  var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -41,7 +41,8 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
41
41
  type: Boolean,
42
42
  default: true
43
43
  },
44
- extendState: {}
44
+ extendState: {},
45
+ theme: {}
45
46
  },
46
47
  emits: [
47
48
  "close",
@@ -51,6 +52,9 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
51
52
  ],
52
53
  setup(__props, { expose: __expose, emit: __emit }) {
53
54
  const props = __props;
55
+ const ancestorTheme = inject(M_THEME_KEY, null);
56
+ const effectiveTheme = computed(() => props.theme || ancestorTheme?.value || "");
57
+ provide(M_THEME_KEY, effectiveTheme);
54
58
  const emit = __emit;
55
59
  const form = ref();
56
60
  const dialogVisible = ref(false);
@@ -110,7 +114,7 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
110
114
  return openBlock(), createBlock(unref(TMagicDialog), {
111
115
  modelValue: dialogVisible.value,
112
116
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => dialogVisible.value = $event),
113
- class: "m-form-dialog",
117
+ class: normalizeClass(["m-form-dialog", effectiveTheme.value ? `m-theme--${effectiveTheme.value}` : ""]),
114
118
  top: "20px",
115
119
  "append-to-body": "",
116
120
  title: __props.title,
@@ -192,6 +196,7 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
192
196
  inline: __props.inline,
193
197
  "prevent-submit-default": __props.preventSubmitDefault,
194
198
  "extend-state": __props.extendState,
199
+ theme: effectiveTheme.value,
195
200
  onChange: changeHandler
196
201
  }, null, 8, [
197
202
  "modelValue",
@@ -204,11 +209,13 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
204
209
  "label-position",
205
210
  "inline",
206
211
  "prevent-submit-default",
207
- "extend-state"
212
+ "extend-state",
213
+ "theme"
208
214
  ]), renderSlot(_ctx.$slots, "default")], 4)) : createCommentVNode("v-if", true)]),
209
215
  _: 3
210
216
  }, 8, [
211
217
  "modelValue",
218
+ "class",
212
219
  "title",
213
220
  "width",
214
221
  "zIndex",
@@ -1,10 +1,10 @@
1
1
  import Form_default from "./Form.js";
2
- import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderSlot, toDisplayString, unref, watchEffect, withCtx } from "vue";
3
- import { TMagicButton, TMagicCol, TMagicDrawer, TMagicRow } from "@tmagic/design";
2
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, openBlock, provide, ref, renderSlot, toDisplayString, unref, watchEffect, withCtx } from "vue";
3
+ import { M_THEME_KEY, TMagicButton, TMagicCol, TMagicDrawer, TMagicRow } from "@tmagic/design";
4
4
  //#region packages/form/src/FormDrawer.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = { style: { "min-height": "1px" } };
6
6
  var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
7
- name: "MFormDialog",
7
+ name: "MFormDrawer",
8
8
  __name: "FormDrawer",
9
9
  props: {
10
10
  config: { default: () => [] },
@@ -25,7 +25,8 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
25
25
  labelPosition: {},
26
26
  preventSubmitDefault: { type: Boolean },
27
27
  beforeClose: {},
28
- extendState: {}
28
+ extendState: {},
29
+ theme: {}
29
30
  },
30
31
  emits: [
31
32
  "close",
@@ -37,11 +38,15 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
37
38
  "opened"
38
39
  ],
39
40
  setup(__props, { expose: __expose, emit: __emit }) {
41
+ const props = __props;
42
+ const ancestorTheme = inject(M_THEME_KEY, null);
43
+ const effectiveTheme = computed(() => props.theme || ancestorTheme?.value || "");
44
+ provide(M_THEME_KEY, effectiveTheme);
40
45
  const emit = __emit;
41
46
  const drawer = ref();
42
47
  const form = ref();
43
48
  const drawerBody = ref();
44
- const visible = ref(false);
49
+ const dialogVisible = ref(false);
45
50
  const saveFetch = ref(false);
46
51
  const bodyHeight = ref(0);
47
52
  watchEffect(() => {
@@ -71,30 +76,47 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
71
76
  emit("closed");
72
77
  };
73
78
  const show = () => {
74
- visible.value = true;
79
+ dialogVisible.value = true;
75
80
  };
76
81
  const hide = () => {
77
- visible.value = false;
82
+ dialogVisible.value = false;
83
+ };
84
+ const close = () => {
85
+ dialogVisible.value = false;
86
+ };
87
+ const cancel = () => {
88
+ hide();
78
89
  };
79
90
  /** 用于关闭 Drawer, 该方法会调用传入的 before-close 方法 */
80
91
  const handleClose = () => {
81
92
  drawer.value?.handleClose();
82
93
  };
94
+ const save = async () => {
95
+ try {
96
+ const changeRecords = [...form.value?.changeRecords || []];
97
+ emit("submit", await form.value?.submitForm(), { changeRecords });
98
+ } catch (e) {
99
+ emit("error", e);
100
+ }
101
+ };
83
102
  __expose({
84
103
  form,
85
104
  saveFetch,
86
105
  bodyHeight,
106
+ close,
87
107
  show,
88
108
  hide,
109
+ save,
110
+ cancel,
89
111
  handleClose
90
112
  });
91
113
  return (_ctx, _cache) => {
92
114
  return openBlock(), createBlock(unref(TMagicDrawer), {
93
- class: "m-form-drawer",
115
+ class: normalizeClass(["m-form-drawer", effectiveTheme.value ? `m-theme--${effectiveTheme.value}` : ""]),
94
116
  ref_key: "drawer",
95
117
  ref: drawer,
96
- modelValue: visible.value,
97
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => visible.value = $event),
118
+ modelValue: dialogVisible.value,
119
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => dialogVisible.value = $event),
98
120
  title: __props.title,
99
121
  "close-on-press-escape": __props.closeOnPressEscape,
100
122
  "append-to-body": true,
@@ -132,7 +154,7 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
132
154
  })]),
133
155
  _: 3
134
156
  })]),
135
- default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
157
+ default: withCtx(() => [dialogVisible.value ? (openBlock(), createElementBlock("div", {
136
158
  key: 0,
137
159
  ref_key: "drawerBody",
138
160
  ref: drawerBody,
@@ -150,6 +172,7 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
150
172
  inline: __props.inline,
151
173
  "prevent-submit-default": __props.preventSubmitDefault,
152
174
  "extend-state": __props.extendState,
175
+ theme: effectiveTheme.value,
153
176
  onChange: changeHandler
154
177
  }, null, 8, [
155
178
  "size",
@@ -161,10 +184,12 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
161
184
  "label-position",
162
185
  "inline",
163
186
  "prevent-submit-default",
164
- "extend-state"
187
+ "extend-state",
188
+ "theme"
165
189
  ]), renderSlot(_ctx.$slots, "default")], 512)) : createCommentVNode("v-if", true)]),
166
190
  _: 3
167
191
  }, 8, [
192
+ "class",
168
193
  "modelValue",
169
194
  "title",
170
195
  "close-on-press-escape",
@@ -7,19 +7,23 @@ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock
7
7
  import { isEqual } from "lodash-es";
8
8
  import { TMagicButton, TMagicFormItem, TMagicIcon, TMagicTooltip } from "@tmagic/design";
9
9
  import { getValueByKeyPath } from "@tmagic/utils";
10
- import { WarningFilled } from "@element-plus/icons-vue";
10
+ import { ArrowDown, ArrowUp, WarningFilled } from "@element-plus/icons-vue";
11
11
  //#region packages/form/src/containers/Container.vue?vue&type=script&setup=true&lang.ts
12
12
  var _hoisted_1 = ["data-tmagic-id", "data-tmagic-form-item-prop"];
13
- var _hoisted_2 = ["innerHTML"];
13
+ var _hoisted_2 = {
14
+ key: 0,
15
+ class: "m-form-tip m-form-title-extra"
16
+ };
14
17
  var _hoisted_3 = ["innerHTML"];
15
18
  var _hoisted_4 = ["innerHTML"];
16
19
  var _hoisted_5 = ["innerHTML"];
17
20
  var _hoisted_6 = ["innerHTML"];
18
21
  var _hoisted_7 = ["innerHTML"];
19
22
  var _hoisted_8 = ["innerHTML"];
20
- var _hoisted_9 = {
23
+ var _hoisted_9 = ["innerHTML"];
24
+ var _hoisted_10 = {
21
25
  key: 5,
22
- style: { "text-align": "center" }
26
+ class: "m-form-container-expand"
23
27
  };
24
28
  var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
25
29
  name: "MFormContainer",
@@ -144,7 +148,8 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
144
148
  labelWidth: itemLabelWidth.value,
145
149
  labelPosition: props.config.labelPosition,
146
150
  rules: rule.value,
147
- extra: filterFunction(mForm, props.config.extra, props)
151
+ extra: filterFunction(mForm, props.config.extra, props),
152
+ extraTips: props.config.extraTips
148
153
  }));
149
154
  const itemLabelWidth = computed(() => props.config.labelWidth ?? props.labelWidth);
150
155
  watchEffect(() => {
@@ -297,12 +302,12 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
297
302
  "use-label",
298
303
  "label-title",
299
304
  "text"
300
- ])])]),
305
+ ]), __props.config.titleExtra && __props.config.labelPosition === "top" ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.config.titleExtra), 1)) : createCommentVNode("v-if", true)])]),
301
306
  default: withCtx(() => [tooltip.value.text ? (openBlock(), createBlock(unref(TMagicTooltip), {
302
307
  key: 0,
303
308
  placement: tooltip.value.placement
304
309
  }, {
305
- content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_2)]),
310
+ content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_3)]),
306
311
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tagName.value), mergeProps(fieldsProps.value, {
307
312
  model: __props.model,
308
313
  "last-values": __props.lastValues,
@@ -331,7 +336,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
331
336
  key: 0,
332
337
  placement: "top"
333
338
  }, {
334
- content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_3)]),
339
+ content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_4)]),
335
340
  default: withCtx(() => [createVNode(unref(TMagicIcon), { style: {
336
341
  "line-height": "40px",
337
342
  "margin-left": "5px"
@@ -370,7 +375,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
370
375
  key: 0,
371
376
  placement: tooltip.value.placement
372
377
  }, {
373
- content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_4)]),
378
+ content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_5)]),
374
379
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tagName.value), mergeProps(fieldsProps.value, {
375
380
  model: __props.model,
376
381
  "last-values": __props.lastValues,
@@ -423,7 +428,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
423
428
  key: 0,
424
429
  placement: tooltip.value.placement
425
430
  }, {
426
- content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_5)]),
431
+ content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_6)]),
427
432
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tagName.value), mergeProps(fieldsProps.value, {
428
433
  model: __props.lastValues,
429
434
  onChange: onChangeHandler
@@ -439,7 +444,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
439
444
  key: 0,
440
445
  placement: "top"
441
446
  }, {
442
- content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_6)]),
447
+ content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_7)]),
443
448
  default: withCtx(() => [createVNode(unref(TMagicIcon), { style: {
444
449
  "line-height": "40px",
445
450
  "margin-left": "5px"
@@ -480,7 +485,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
480
485
  key: 0,
481
486
  placement: tooltip.value.placement
482
487
  }, {
483
- content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_7)]),
488
+ content: withCtx(() => [createElementVNode("div", { innerHTML: tooltip.value.text }, null, 8, _hoisted_8)]),
484
489
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tagName.value), mergeProps(fieldsProps.value, {
485
490
  model: __props.model,
486
491
  onChange: onChangeHandler
@@ -496,7 +501,7 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
496
501
  key: 1,
497
502
  placement: "top"
498
503
  }, {
499
- content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_8)]),
504
+ content: withCtx(() => [createElementVNode("div", { innerHTML: __props.config.tip }, null, 8, _hoisted_9)]),
500
505
  default: withCtx(() => [createVNode(unref(TMagicIcon), { style: {
501
506
  "line-height": "40px",
502
507
  "margin-left": "5px"
@@ -538,16 +543,17 @@ var Container_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
538
543
  "label-width",
539
544
  "prop"
540
545
  ]);
541
- }), 128)) : createCommentVNode("v-if", true)], 64)) : createCommentVNode("v-if", true), __props.config.expand && type.value !== "fieldset" ? (openBlock(), createElementBlock("div", _hoisted_9, [createVNode(unref(TMagicButton), {
546
+ }), 128)) : createCommentVNode("v-if", true)], 64)) : createCommentVNode("v-if", true), __props.config.expand && type.value !== "fieldset" ? (openBlock(), createElementBlock("div", _hoisted_10, [createVNode(unref(TMagicButton), {
542
547
  type: "primary",
543
548
  size: "small",
544
549
  disabled: false,
545
550
  link: "",
546
- onClick: expandHandler
551
+ onClick: expandHandler,
552
+ icon: expand.value ? unref(ArrowUp) : unref(ArrowDown)
547
553
  }, {
548
554
  default: withCtx(() => [createTextVNode(toDisplayString(expand.value ? "收起配置" : "展开更多配置"), 1)]),
549
555
  _: 1
550
- })])) : createCommentVNode("v-if", true)], 14, _hoisted_1);
556
+ }, 8, ["icon"])])) : createCommentVNode("v-if", true)], 14, _hoisted_1);
551
557
  };
552
558
  }
553
559
  });
@@ -1,5 +1,5 @@
1
1
  import GroupListItem_default from "./GroupListItem.js";
2
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, renderList, renderSlot } from "vue";
2
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, renderList, renderSlot, toDisplayString } from "vue";
3
3
  import { cloneDeep } from "lodash-es";
4
4
  //#region packages/form/src/containers/GroupList.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = { class: "m-fields-group-list" };
@@ -8,11 +8,12 @@ var _hoisted_3 = {
8
8
  key: 1,
9
9
  class: "el-table__empty-block"
10
10
  };
11
- var _hoisted_4 = {
11
+ var _hoisted_4 = { class: "el-table__empty-text t-table__empty" };
12
+ var _hoisted_5 = {
12
13
  key: 3,
13
14
  class: "m-fields-group-list-footer"
14
15
  };
15
- var _hoisted_5 = { style: {
16
+ var _hoisted_6 = { style: {
16
17
  "display": "flex",
17
18
  "justify-content": "flex-end",
18
19
  "flex": "1"
@@ -63,7 +64,7 @@ var GroupList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
63
64
  innerHTML: __props.config.extra,
64
65
  style: { "color": "rgba(0, 0, 0, 0.45)" }
65
66
  }, null, 8, _hoisted_2)) : createCommentVNode("v-if", true),
66
- !__props.model[__props.name] || !__props.model[__props.name].length ? (openBlock(), createElementBlock("div", _hoisted_3, [..._cache[1] || (_cache[1] = [createElementVNode("span", { class: "el-table__empty-text t-table__empty" }, "暂无数据", -1)])])) : (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(__props.model[__props.name], (item, index) => {
67
+ !__props.model[__props.name] || !__props.model[__props.name].length ? (openBlock(), createElementBlock("div", _hoisted_3, [createElementVNode("span", _hoisted_4, "暂无" + toDisplayString(__props.config.titlePrefix || "") + "数据", 1)])) : (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(__props.model[__props.name], (item, index) => {
67
68
  return openBlock(), createBlock(GroupListItem_default, {
68
69
  key: index,
69
70
  model: item,
@@ -94,7 +95,7 @@ var GroupList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
94
95
  "group-model"
95
96
  ]);
96
97
  }), 128)),
97
- !__props.isCompare ? (openBlock(), createElementBlock("div", _hoisted_4, [renderSlot(_ctx.$slots, "toggle-button"), createElementVNode("div", _hoisted_5, [renderSlot(_ctx.$slots, "add-button")])])) : createCommentVNode("v-if", true)
98
+ !__props.isCompare ? (openBlock(), createElementBlock("div", _hoisted_5, [renderSlot(_ctx.$slots, "toggle-button"), createElementVNode("div", _hoisted_6, [renderSlot(_ctx.$slots, "add-button")])])) : createCommentVNode("v-if", true)
98
99
  ]);
99
100
  };
100
101
  }
@@ -1,15 +1,16 @@
1
1
  import { filterFunction } from "../utils/form.js";
2
2
  import Container_default from "./Container.js";
3
3
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, ref, unref, vShow, withCtx, withDirectives } from "vue";
4
- import { TMagicButton, TMagicCard, TMagicIcon, TMagicInputNumber, TMagicPopover } from "@tmagic/design";
5
- import { CaretBottom, CaretRight, CaretTop, Delete, DocumentCopy, Position } from "@element-plus/icons-vue";
4
+ import { TMagicButton, TMagicCard, TMagicIcon, TMagicInputNumber, TMagicPopover, TMagicTooltip } from "@tmagic/design";
5
+ import { ArrowDown, ArrowRight, Bottom, Delete, DocumentCopy, Position, Top } from "@element-plus/icons-vue";
6
6
  //#region packages/form/src/containers/GroupListItem.vue?vue&type=script&setup=true&lang.ts
7
- var _hoisted_1 = ["innerHTML"];
8
- var _hoisted_2 = { style: {
7
+ var _hoisted_1 = { class: "m-fields-group-list-item-header" };
8
+ var _hoisted_2 = ["innerHTML"];
9
+ var _hoisted_3 = { style: {
9
10
  "text-align": "right",
10
11
  "margin-top": "20px"
11
12
  } };
12
- var _hoisted_3 = ["innerHTML"];
13
+ var _hoisted_4 = ["innerHTML"];
13
14
  var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
14
15
  name: "MFormGroupListItem",
15
16
  __name: "GroupListItem",
@@ -46,7 +47,10 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
46
47
  [mForm?.keyProp || "__key"]: `${props.config[mForm?.keyProp || "__key"]}${String(props.index)}`
47
48
  }));
48
49
  const title = computed(() => {
49
- if (props.config.titleKey && props.model[props.config.titleKey]) return props.model[props.config.titleKey];
50
+ if (props.config.titleKey && props.model[props.config.titleKey]) {
51
+ const { titlePrefix } = props.config;
52
+ return titlePrefix ? `${titlePrefix} ${String(props.index + 1)}: ${props.model[props.config.titleKey]}` : `${props.model[props.config.titleKey]}`;
53
+ }
50
54
  if (props.config.title) return filterFunction(mForm, props.config.title, props);
51
55
  return `${props.config.titlePrefix || "组"} ${String(props.index + 1)}`;
52
56
  });
@@ -85,33 +89,39 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
85
89
  return (_ctx, _cache) => {
86
90
  return openBlock(), createBlock(unref(TMagicCard), {
87
91
  class: "m-fields-group-list-item",
92
+ flat: __props.config.flat,
88
93
  "body-style": { display: expand.value ? "block" : "none" }
89
94
  }, {
90
- header: withCtx(() => [createElementVNode("div", null, [
95
+ header: withCtx(() => [createElementVNode("div", _hoisted_1, [
91
96
  createVNode(unref(TMagicButton), {
92
97
  link: "",
93
98
  disabled: __props.disabled,
94
- onClick: expandHandler
99
+ onClick: expandHandler,
100
+ class: "expand-button"
95
101
  }, {
96
102
  default: withCtx(() => [createVNode(unref(TMagicIcon), null, {
97
- default: withCtx(() => [expand.value ? (openBlock(), createBlock(unref(CaretBottom), { key: 0 })) : (openBlock(), createBlock(unref(CaretRight), { key: 1 }))]),
103
+ default: withCtx(() => [expand.value ? (openBlock(), createBlock(unref(ArrowDown), { key: 0 })) : (openBlock(), createBlock(unref(ArrowRight), { key: 1 }))]),
98
104
  _: 1
99
- }), createElementVNode("span", { innerHTML: title.value }, null, 8, _hoisted_1)]),
105
+ })]),
100
106
  _: 1
101
107
  }, 8, ["disabled"]),
102
- !__props.isCompare ? withDirectives((openBlock(), createBlock(unref(TMagicButton), {
103
- key: 0,
104
- type: "danger",
105
- size: "small",
106
- link: "",
107
- icon: unref(Delete),
108
- disabled: __props.disabled,
109
- onClick: removeHandler
110
- }, null, 8, ["icon", "disabled"])), [[vShow, showDelete.value]]) : createCommentVNode("v-if", true),
108
+ createElementVNode("span", { innerHTML: title.value }, null, 8, _hoisted_2),
109
+ createVNode(unref(TMagicTooltip), { content: `删除 ${title.value}` }, {
110
+ default: withCtx(() => [!__props.isCompare ? withDirectives((openBlock(), createBlock(unref(TMagicButton), {
111
+ key: 0,
112
+ size: "default",
113
+ link: "",
114
+ class: "delete-button",
115
+ icon: unref(Delete),
116
+ disabled: __props.disabled,
117
+ onClick: removeHandler
118
+ }, null, 8, ["icon", "disabled"])), [[vShow, showDelete.value]]) : createCommentVNode("v-if", true)]),
119
+ _: 1
120
+ }, 8, ["content"]),
111
121
  copyable.value && !__props.isCompare ? (openBlock(), createBlock(unref(TMagicButton), {
112
- key: 1,
122
+ key: 0,
113
123
  link: "",
114
- size: "small",
124
+ size: "default",
115
125
  type: "primary",
116
126
  icon: unref(DocumentCopy),
117
127
  disabled: __props.disabled,
@@ -120,27 +130,27 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
120
130
  default: withCtx(() => [..._cache[6] || (_cache[6] = [createTextVNode("复制", -1)])]),
121
131
  _: 1
122
132
  }, 8, ["icon", "disabled"])) : createCommentVNode("v-if", true),
123
- movable.value && !__props.isCompare ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [withDirectives(createVNode(unref(TMagicButton), {
133
+ movable.value && !__props.isCompare ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [withDirectives(createVNode(unref(TMagicButton), {
124
134
  link: "",
125
- size: "small",
135
+ size: "default",
126
136
  disabled: __props.disabled,
127
- icon: unref(CaretTop),
137
+ icon: unref(Top),
128
138
  onClick: _cache[0] || (_cache[0] = ($event) => changeOrder(-1))
129
139
  }, {
130
140
  default: withCtx(() => [..._cache[7] || (_cache[7] = [createTextVNode("上移", -1)])]),
131
141
  _: 1
132
142
  }, 8, ["disabled", "icon"]), [[vShow, __props.index !== 0]]), withDirectives(createVNode(unref(TMagicButton), {
133
143
  link: "",
134
- size: "small",
144
+ size: "default",
135
145
  disabled: __props.disabled,
136
- icon: unref(CaretBottom),
146
+ icon: unref(Bottom),
137
147
  onClick: _cache[1] || (_cache[1] = ($event) => changeOrder(1))
138
148
  }, {
139
149
  default: withCtx(() => [..._cache[8] || (_cache[8] = [createTextVNode("下移", -1)])]),
140
150
  _: 1
141
151
  }, 8, ["disabled", "icon"]), [[vShow, __props.index !== length.value - 1]])], 64)) : createCommentVNode("v-if", true),
142
152
  __props.config.moveSpecifyLocation && !__props.isCompare ? (openBlock(), createBlock(unref(TMagicPopover), {
143
- key: 3,
153
+ key: 2,
144
154
  trigger: "click",
145
155
  placement: "top",
146
156
  width: "200",
@@ -168,7 +178,7 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
168
178
  disabled: __props.disabled
169
179
  }, null, 8, ["modelValue", "disabled"]),
170
180
  _cache[11] || (_cache[11] = createTextVNode("行 ", -1))
171
- ]), createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
181
+ ]), createElementVNode("div", _hoisted_3, [createVNode(unref(TMagicButton), {
172
182
  size: "small",
173
183
  text: "",
174
184
  onClick: _cache[4] || (_cache[4] = ($event) => moveSpecifyLocationVisible.value = false)
@@ -186,10 +196,10 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
186
196
  _: 1
187
197
  }, 8, ["visible"])) : createCommentVNode("v-if", true),
188
198
  itemExtra.value ? (openBlock(), createElementBlock("span", {
189
- key: 4,
199
+ key: 3,
190
200
  innerHTML: itemExtra.value,
191
201
  class: "m-form-tip"
192
- }, null, 8, _hoisted_3)) : createCommentVNode("v-if", true)
202
+ }, null, 8, _hoisted_4)) : createCommentVNode("v-if", true)
193
203
  ])]),
194
204
  default: withCtx(() => [expand.value ? (openBlock(), createBlock(Container_default, {
195
205
  key: 0,
@@ -214,7 +224,7 @@ var GroupListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
214
224
  "disabled"
215
225
  ])) : createCommentVNode("v-if", true)]),
216
226
  _: 1
217
- }, 8, ["body-style"]);
227
+ }, 8, ["flat", "body-style"]);
218
228
  };
219
229
  }
220
230
  });