@shwfed/config 2.3.28 → 2.4.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 (146) hide show
  1. package/dist/mcp.mjs +3128 -1272
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{config-CQHS6cZe.js → config-BcQQl4v6.js} +1 -1
  4. package/dist/preview/assets/{config-fvkC2rB8.js → config-BdFIFUa_.js} +1 -1
  5. package/dist/preview/assets/{config-DDfTl9Cs.js → config-Bi9F-Jdh.js} +1 -1
  6. package/dist/preview/assets/{config-CJHPt8Gx.js → config-Bxkq2ZRm.js} +1 -1
  7. package/dist/preview/assets/{config-D0_1yZdF.js → config-C32yfrlg.js} +1 -1
  8. package/dist/preview/assets/{config--PcXQV_r.js → config-CHHX7vhb.js} +1 -1
  9. package/dist/preview/assets/{config-5KVDXgUF.js → config-CZ0f5xdI.js} +1 -1
  10. package/dist/preview/assets/{config-B5avpKJE.js → config-D9xGgFnF.js} +1 -1
  11. package/dist/preview/assets/{config-CNo3isHa.js → config-Ddh8pxIi.js} +1 -1
  12. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-RM-qDh0R.js → definition.vue_vue_type_script_setup_true_lang-C_cjxvm1.js} +1 -1
  13. package/dist/preview/assets/{index-a2QwAots.css → index-BqOX70Hd.css} +1 -1
  14. package/dist/preview/assets/index-D-VR1i8D.js +659 -0
  15. package/dist/preview/assets/index-ihZGlPdX.js +1 -0
  16. package/dist/preview/assets/{runtime-BPjZQmcY.js → runtime-Bn8mqeDH.js} +1 -1
  17. package/dist/preview/assets/{runtime-DcrzodsN.js → runtime-Cc_Wk3o-.js} +1 -1
  18. package/dist/preview/assets/{runtime-BGTWf-O7.js → runtime-CttAjIgg.js} +1 -1
  19. package/dist/preview/assets/{runtime-Dy4ZmQ-n.js → runtime-Cx4f2UTl.js} +1 -1
  20. package/dist/preview/assets/{runtime-CCbyrqQT.js → runtime-D1dESjXR.js} +1 -1
  21. package/dist/preview/assets/{runtime-C_XX6a0C.js → runtime-DIEP1Xbh.js} +1 -1
  22. package/dist/preview/assets/{runtime-CtqwtTE_.js → runtime-DKceWuBx.js} +1 -1
  23. package/dist/preview/assets/{runtime-Dr_10emf.js → runtime-Dhid9O5c.js} +1 -1
  24. package/dist/preview/assets/{runtime-Bq3fmxeF.js → runtime-YMiqi6WY.js} +1 -1
  25. package/dist/preview/index.html +2 -2
  26. package/dist/runtime/components/block-layout-editor/index.d.vue.ts +10 -2
  27. package/dist/runtime/components/block-layout-editor/index.vue +44 -8
  28. package/dist/runtime/components/block-layout-editor/index.vue.d.ts +10 -2
  29. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/config.d.vue.ts +2 -0
  30. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/config.vue.d.ts +2 -0
  31. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/runtime.d.vue.ts +2 -0
  32. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/runtime.vue.d.ts +2 -0
  33. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/schema.d.ts +2 -0
  34. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.d.vue.ts +2 -0
  35. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.vue.d.ts +2 -0
  36. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.d.vue.ts +2 -0
  37. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.vue.d.ts +2 -0
  38. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/schema.d.ts +3 -0
  39. package/dist/runtime/components/config/config.vue +35 -0
  40. package/dist/runtime/components/config/use-editor.d.ts +11 -1
  41. package/dist/runtime/components/config/use-editor.js +27 -1
  42. package/dist/runtime/components/form/config.vue +32 -0
  43. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/config.d.vue.ts +163 -0
  44. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/config.vue +745 -0
  45. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/config.vue.d.ts +163 -0
  46. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.d.vue.ts +8 -0
  47. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue +383 -0
  48. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue.d.ts +8 -0
  49. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/schema.d.ts +264 -0
  50. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/schema.js +183 -0
  51. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/config.d.vue.ts +163 -0
  52. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/config.vue +745 -0
  53. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/config.vue.d.ts +163 -0
  54. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.d.vue.ts +8 -0
  55. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue +402 -0
  56. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue.d.ts +8 -0
  57. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/schema.d.ts +264 -0
  58. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/schema.js +209 -0
  59. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.d.vue.ts +129 -0
  60. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.vue +618 -0
  61. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.vue.d.ts +129 -0
  62. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.d.vue.ts +8 -0
  63. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue +501 -0
  64. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue.d.ts +8 -0
  65. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/schema.d.ts +99 -0
  66. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/schema.js +133 -0
  67. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.d.vue.ts +127 -0
  68. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.vue +550 -0
  69. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.vue.d.ts +127 -0
  70. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.d.vue.ts +8 -0
  71. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue +496 -0
  72. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue.d.ts +8 -0
  73. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/schema.d.ts +96 -0
  74. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/schema.js +125 -0
  75. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.d.vue.ts +133 -0
  76. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.vue +605 -0
  77. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.vue.d.ts +133 -0
  78. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.d.vue.ts +8 -0
  79. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue +401 -0
  80. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue.d.ts +8 -0
  81. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/schema.d.ts +102 -0
  82. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/schema.js +142 -0
  83. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.d.vue.ts +131 -0
  84. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.vue +560 -0
  85. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.vue.d.ts +131 -0
  86. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.d.vue.ts +8 -0
  87. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue +395 -0
  88. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue.d.ts +8 -0
  89. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/schema.d.ts +96 -0
  90. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/schema.js +118 -0
  91. package/dist/runtime/components/form/fields/2026-05-28/tree-combobox-shared.d.ts +35 -0
  92. package/dist/runtime/components/form/fields/2026-05-28/tree-combobox-shared.js +31 -0
  93. package/dist/runtime/components/form/index.vue +7 -5
  94. package/dist/runtime/components/form/schema.d.ts +4 -0
  95. package/dist/runtime/components/form/schema.js +4 -0
  96. package/dist/runtime/components/form/unit-config.vue +45 -1
  97. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.select/config.vue +0 -22
  98. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.select/header.vue +3 -15
  99. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.select/schema.d.ts +0 -1
  100. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.select/schema.js +0 -4
  101. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.d.vue.ts +183 -0
  102. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue +931 -0
  103. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue.d.ts +183 -0
  104. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.d.vue.ts +9 -0
  105. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +463 -0
  106. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue.d.ts +9 -0
  107. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.d.ts +283 -0
  108. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.js +275 -0
  109. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.d.vue.ts +183 -0
  110. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue +931 -0
  111. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue.d.ts +183 -0
  112. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.d.vue.ts +9 -0
  113. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +414 -0
  114. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue.d.ts +9 -0
  115. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.d.ts +283 -0
  116. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.js +275 -0
  117. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +133 -0
  118. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/config.vue +632 -0
  119. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +133 -0
  120. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.d.vue.ts +9 -0
  121. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +461 -0
  122. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue.d.ts +9 -0
  123. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +93 -0
  124. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/schema.js +161 -0
  125. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +131 -0
  126. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/config.vue +563 -0
  127. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +131 -0
  128. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.d.vue.ts +9 -0
  129. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +443 -0
  130. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue.d.ts +9 -0
  131. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/schema.d.ts +90 -0
  132. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/schema.js +153 -0
  133. package/dist/runtime/components/table/columns/2026-05-28/tree-combobox-shared.d.ts +35 -0
  134. package/dist/runtime/components/table/columns/2026-05-28/tree-combobox-shared.js +31 -0
  135. package/dist/runtime/components/table/config.vue +55 -82
  136. package/dist/runtime/components/table/schema.d.ts +4 -0
  137. package/dist/runtime/components/ui/command/CommandItem.d.vue.ts +7 -0
  138. package/dist/runtime/components/ui/command/CommandItem.vue +13 -4
  139. package/dist/runtime/components/ui/command/CommandItem.vue.d.ts +7 -0
  140. package/dist/runtime/share/clipboard.d.ts +26 -0
  141. package/dist/runtime/share/clipboard.js +82 -0
  142. package/dist/runtime/share/layout.d.ts +4 -0
  143. package/dist/runtime/share/layout.js +35 -0
  144. package/package.json +1 -1
  145. package/dist/preview/assets/index-DNd8J9Zv.js +0 -643
  146. package/dist/preview/assets/index-DrIMqXAa.js +0 -1
@@ -0,0 +1,605 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { ExpressionEditor } from "../../../../ui/expression-editor";
4
+ import DerivedValueEditor from "../../../DerivedValueEditor.vue";
5
+ import { Field, FieldLabel } from "../../../../ui/field";
6
+ import { InputGroup, InputGroupInput } from "../../../../ui/input-group";
7
+ import { Locale as LocaleField } from "../../../../ui/locale";
8
+ import { Markdown } from "../../../../ui/markdown";
9
+ import {
10
+ Select,
11
+ SelectContent,
12
+ SelectItem,
13
+ SelectTrigger,
14
+ SelectValue
15
+ } from "../../../../ui/select";
16
+ import { Switch } from "../../../../ui/switch";
17
+ import { getStructFieldDescription, getStructFieldTitle } from "../../../schema";
18
+ import { DataSource } from "../../../../table/schema";
19
+ import { schema } from "./schema";
20
+ defineOptions({ name: "ShwfedTreeMultiFieldConfig" });
21
+ const value = defineModel({ type: null, ...{ required: true } });
22
+ const fieldSchema = schema(() => {
23
+ });
24
+ const fieldTitle = (f) => getStructFieldTitle(fieldSchema, f) ?? f;
25
+ const fieldDescription = (f) => getStructFieldDescription(fieldSchema, f);
26
+ const dataSourceSchema = DataSource(() => {
27
+ });
28
+ const dataSourceFieldTitle = (f) => getStructFieldTitle(dataSourceSchema, f) ?? f;
29
+ const dataSourceFieldDescription = (f) => getStructFieldDescription(dataSourceSchema, f);
30
+ const filterSchema = fieldSchema.fields.filter.from;
31
+ const filterFieldTitle = (f) => getStructFieldTitle(filterSchema, f) ?? f;
32
+ const filterFieldDescription = (f) => getStructFieldDescription(filterSchema, f);
33
+ const nodeExtraVars = {
34
+ node: {
35
+ type: "dyn",
36
+ label: "\u5F53\u524D\u8282\u70B9",
37
+ description: "\u7531 `\u6570\u636E` \u8868\u8FBE\u5F0F\u8FD4\u56DE\u7684\u6BCF\u4E00\u9879\uFF1B\u7C7B\u578B\u5728\u914D\u7F6E\u65F6\u672A\u77E5\uFF08`dyn`\uFF09"
38
+ }
39
+ };
40
+ const jsonExtraVars = {
41
+ json: {
42
+ type: "optional<dyn>",
43
+ label: "HTTP \u54CD\u5E94\u4F53",
44
+ description: "\u5DF2\u89E3\u6790\u7684 JSON \u54CD\u5E94\uFF1B\u672A\u914D\u7F6E `request` \u65F6\u4E3A `none`"
45
+ }
46
+ };
47
+ const bindingText = computed({
48
+ get: () => value.value.binding ?? "",
49
+ set: (next) => {
50
+ const trimmed = next.trim();
51
+ if (trimmed.length === 0) {
52
+ const { binding: _omit, ...rest } = value.value;
53
+ value.value = rest;
54
+ } else {
55
+ value.value = { ...value.value, binding: trimmed };
56
+ }
57
+ }
58
+ });
59
+ const CASCADE_OPTIONS = [
60
+ { value: "independent", label: "\u72EC\u7ACB" },
61
+ { value: "cascade-down", label: "\u5411\u4E0B\u7EA7\u8054" },
62
+ { value: "cascade-both", label: "\u53CC\u5411\u7EA7\u8054" }
63
+ ];
64
+ function setDataSourceData(next) {
65
+ value.value = {
66
+ ...value.value,
67
+ dataSource: { ...value.value.dataSource, data: next }
68
+ };
69
+ }
70
+ function setDataSourceRequest(next) {
71
+ const trimmed = next.trim();
72
+ if (trimmed.length === 0) {
73
+ const { request: _omit, ...rest } = value.value.dataSource;
74
+ value.value = { ...value.value, dataSource: rest };
75
+ } else {
76
+ value.value = {
77
+ ...value.value,
78
+ dataSource: { ...value.value.dataSource, request: next }
79
+ };
80
+ }
81
+ }
82
+ function setOptionalExpression(key, next) {
83
+ if (next.length === 0) {
84
+ const { [key]: _omit, ...rest } = value.value;
85
+ value.value = rest;
86
+ } else {
87
+ value.value = { ...value.value, [key]: next };
88
+ }
89
+ }
90
+ const filter = computed(() => value.value.filter);
91
+ function setFilterEnabled(next) {
92
+ if (next) {
93
+ value.value = {
94
+ ...value.value,
95
+ filter: { ...value.value.filter ?? {}, enabled: true }
96
+ };
97
+ } else {
98
+ const { filter: _omit, ...rest } = value.value;
99
+ value.value = rest;
100
+ }
101
+ }
102
+ function setFilterLabel(label) {
103
+ const cur = value.value.filter;
104
+ if (!cur) return;
105
+ const isEmpty = !label || label.every((l) => l.message.trim().length === 0);
106
+ if (isEmpty) {
107
+ const { label: _omit, ...rest } = cur;
108
+ value.value = { ...value.value, filter: rest };
109
+ } else {
110
+ value.value = { ...value.value, filter: { ...cur, label } };
111
+ }
112
+ }
113
+ function setFilterKeywords(next) {
114
+ const cur = value.value.filter;
115
+ if (!cur) return;
116
+ if (next.length === 0) {
117
+ const { keywords: _omit, ...rest } = cur;
118
+ value.value = { ...value.value, filter: rest };
119
+ } else {
120
+ value.value = { ...value.value, filter: { ...cur, keywords: next } };
121
+ }
122
+ }
123
+ </script>
124
+
125
+ <template>
126
+ <div class="flex flex-col gap-3">
127
+ <!-- Row 1: 内部名称 + 绑定路径 -->
128
+ <div class="grid grid-cols-2 gap-3">
129
+ <Field orientation="vertical">
130
+ <FieldLabel class="text-xs text-zinc-500">
131
+ <template
132
+ v-if="fieldDescription('displayName')"
133
+ #tooltip
134
+ >
135
+ <Markdown
136
+ :source="fieldDescription('displayName')"
137
+ block
138
+ class="prose prose-sm prose-zinc"
139
+ />
140
+ </template>
141
+ {{ fieldTitle("displayName") }}
142
+ </FieldLabel>
143
+ <InputGroup>
144
+ <InputGroupInput
145
+ :model-value="value.displayName ?? ''"
146
+ placeholder="例:所属部门"
147
+ @update:model-value="(v) => {
148
+ const s = String(v ?? '');
149
+ value = { ...value, displayName: s.length > 0 ? s : void 0 };
150
+ }"
151
+ />
152
+ </InputGroup>
153
+ </Field>
154
+
155
+ <Field orientation="vertical">
156
+ <FieldLabel class="text-xs text-zinc-500">
157
+ <template
158
+ v-if="fieldDescription('binding')"
159
+ #tooltip
160
+ >
161
+ <Markdown
162
+ :source="fieldDescription('binding')"
163
+ block
164
+ class="prose prose-sm prose-zinc"
165
+ />
166
+ </template>
167
+ {{ fieldTitle("binding") }}
168
+ </FieldLabel>
169
+ <InputGroup>
170
+ <InputGroupInput
171
+ v-model="bindingText"
172
+ placeholder="例:user.departmentIds"
173
+ class="font-mono"
174
+ />
175
+ </InputGroup>
176
+ </Field>
177
+ </div>
178
+
179
+ <!-- Row 2: 标签 + 提示 -->
180
+ <div class="grid grid-cols-2 gap-3">
181
+ <Field orientation="vertical">
182
+ <FieldLabel class="text-xs text-zinc-500">
183
+ <template
184
+ v-if="fieldDescription('label')"
185
+ #tooltip
186
+ >
187
+ <Markdown
188
+ :source="fieldDescription('label')"
189
+ block
190
+ class="prose prose-sm prose-zinc"
191
+ />
192
+ </template>
193
+ {{ fieldTitle("label") }}
194
+ </FieldLabel>
195
+ <LocaleField
196
+ translate-hint="form field label"
197
+ :model-value="value.label"
198
+ @update:model-value="(v) => value = { ...value, label: v }"
199
+ />
200
+ </Field>
201
+
202
+ <Field orientation="vertical">
203
+ <FieldLabel class="text-xs text-zinc-500">
204
+ <template
205
+ v-if="fieldDescription('tooltip')"
206
+ #tooltip
207
+ >
208
+ <Markdown
209
+ :source="fieldDescription('tooltip')"
210
+ block
211
+ class="prose prose-sm prose-zinc"
212
+ />
213
+ </template>
214
+ {{ fieldTitle("tooltip") }}
215
+ </FieldLabel>
216
+ <LocaleField
217
+ markdown
218
+ translate-hint="form field tooltip"
219
+ :model-value="value.tooltip"
220
+ @update:model-value="(v) => value = { ...value, tooltip: v }"
221
+ />
222
+ </Field>
223
+ </div>
224
+
225
+ <!-- 数据源: request (optional) + data -->
226
+ <h3 class="text-xs font-medium text-zinc-500">
227
+ {{ fieldTitle("dataSource") }}
228
+ </h3>
229
+
230
+ <Field orientation="vertical">
231
+ <FieldLabel class="text-xs text-zinc-500">
232
+ <template
233
+ v-if="dataSourceFieldDescription('request')"
234
+ #tooltip
235
+ >
236
+ <Markdown
237
+ :source="dataSourceFieldDescription('request')"
238
+ block
239
+ class="prose prose-sm prose-zinc"
240
+ />
241
+ </template>
242
+ {{ dataSourceFieldTitle("request") }}
243
+ </FieldLabel>
244
+ <ExpressionEditor
245
+ :model-value="value.dataSource.request ?? ''"
246
+ placeholder="如 http.get('/api/departments/tree')"
247
+ result-type="HttpRequest"
248
+ multiline
249
+ class="min-h-20"
250
+ @update:model-value="setDataSourceRequest"
251
+ />
252
+ </Field>
253
+
254
+ <Field orientation="vertical">
255
+ <FieldLabel class="text-xs text-zinc-500">
256
+ <template
257
+ v-if="dataSourceFieldDescription('data')"
258
+ #tooltip
259
+ >
260
+ <Markdown
261
+ :source="dataSourceFieldDescription('data')"
262
+ block
263
+ class="prose prose-sm prose-zinc"
264
+ />
265
+ </template>
266
+ {{ dataSourceFieldTitle("data") }}
267
+ </FieldLabel>
268
+ <ExpressionEditor
269
+ :model-value="value.dataSource.data"
270
+ placeholder="如 json.?value.roots.orValue([])"
271
+ result-type="list"
272
+ :extra-vars="jsonExtraVars"
273
+ @update:model-value="setDataSourceData"
274
+ />
275
+ </Field>
276
+
277
+ <!-- 节点表达式 -->
278
+ <h3 class="text-xs font-medium text-zinc-500">
279
+ 节点
280
+ </h3>
281
+
282
+ <div class="grid grid-cols-2 gap-3">
283
+ <Field orientation="vertical">
284
+ <FieldLabel class="text-xs text-zinc-500">
285
+ <template
286
+ v-if="fieldDescription('nodeKey')"
287
+ #tooltip
288
+ >
289
+ <Markdown
290
+ :source="fieldDescription('nodeKey')"
291
+ block
292
+ class="prose prose-sm prose-zinc"
293
+ />
294
+ </template>
295
+ {{ fieldTitle("nodeKey") }}
296
+ </FieldLabel>
297
+ <ExpressionEditor
298
+ :model-value="value.nodeKey"
299
+ placeholder="例:string(node.id)"
300
+ :result-type="['string', 'number', 'dyn']"
301
+ :extra-vars="nodeExtraVars"
302
+ class="min-h-10"
303
+ @update:model-value="(v) => value = { ...value, nodeKey: v }"
304
+ />
305
+ </Field>
306
+
307
+ <Field orientation="vertical">
308
+ <FieldLabel class="text-xs text-zinc-500">
309
+ <template
310
+ v-if="fieldDescription('nodeChildren')"
311
+ #tooltip
312
+ >
313
+ <Markdown
314
+ :source="fieldDescription('nodeChildren')"
315
+ block
316
+ class="prose prose-sm prose-zinc"
317
+ />
318
+ </template>
319
+ {{ fieldTitle("nodeChildren") }}
320
+ </FieldLabel>
321
+ <ExpressionEditor
322
+ :model-value="value.nodeChildren"
323
+ placeholder="例:has(node.children) ? node.children : null"
324
+ result-type="list"
325
+ :extra-vars="nodeExtraVars"
326
+ class="min-h-10"
327
+ @update:model-value="(v) => value = { ...value, nodeChildren: v }"
328
+ />
329
+ </Field>
330
+ </div>
331
+
332
+ <div class="grid grid-cols-2 gap-3">
333
+ <Field orientation="vertical">
334
+ <FieldLabel class="text-xs text-zinc-500">
335
+ <template
336
+ v-if="fieldDescription('nodeLabel')"
337
+ #tooltip
338
+ >
339
+ <Markdown
340
+ :source="fieldDescription('nodeLabel')"
341
+ block
342
+ class="prose prose-sm prose-zinc"
343
+ />
344
+ </template>
345
+ {{ fieldTitle("nodeLabel") }}
346
+ </FieldLabel>
347
+ <LocaleField
348
+ markdown
349
+ translate-hint="tree node label"
350
+ :model-value="value.nodeLabel"
351
+ @update:model-value="(v) => value = { ...value, nodeLabel: v }"
352
+ />
353
+ </Field>
354
+
355
+ <Field orientation="vertical">
356
+ <FieldLabel class="text-xs text-zinc-500">
357
+ <template
358
+ v-if="fieldDescription('nodeTooltip')"
359
+ #tooltip
360
+ >
361
+ <Markdown
362
+ :source="fieldDescription('nodeTooltip')"
363
+ block
364
+ class="prose prose-sm prose-zinc"
365
+ />
366
+ </template>
367
+ {{ fieldTitle("nodeTooltip") }}
368
+ </FieldLabel>
369
+ <LocaleField
370
+ markdown
371
+ translate-hint="tree node tooltip"
372
+ :model-value="value.nodeTooltip"
373
+ @update:model-value="(v) => value = { ...value, nodeTooltip: v }"
374
+ />
375
+ </Field>
376
+ </div>
377
+
378
+ <!-- 行为: 节点可选条件 + 级联模式 + 默认全部展开 -->
379
+ <div class="grid grid-cols-3 gap-3">
380
+ <Field orientation="vertical">
381
+ <FieldLabel class="text-xs text-zinc-500">
382
+ <template
383
+ v-if="fieldDescription('nodeSelectable')"
384
+ #tooltip
385
+ >
386
+ <Markdown
387
+ :source="fieldDescription('nodeSelectable')"
388
+ block
389
+ class="prose prose-sm prose-zinc"
390
+ />
391
+ </template>
392
+ {{ fieldTitle("nodeSelectable") }}
393
+ </FieldLabel>
394
+ <ExpressionEditor
395
+ :model-value="value.nodeSelectable ?? ''"
396
+ placeholder="例:node.kind == 'leaf'"
397
+ result-type="bool"
398
+ :extra-vars="nodeExtraVars"
399
+ class="min-h-10"
400
+ @update:model-value="(v) => setOptionalExpression('nodeSelectable', v)"
401
+ />
402
+ </Field>
403
+
404
+ <Field orientation="vertical">
405
+ <FieldLabel class="text-xs text-zinc-500">
406
+ <template
407
+ v-if="fieldDescription('cascade')"
408
+ #tooltip
409
+ >
410
+ <Markdown
411
+ :source="fieldDescription('cascade')"
412
+ block
413
+ class="prose prose-sm prose-zinc"
414
+ />
415
+ </template>
416
+ {{ fieldTitle("cascade") }}
417
+ </FieldLabel>
418
+ <Select
419
+ :model-value="value.cascade ?? 'cascade-both'"
420
+ @update:model-value="(v) => value = { ...value, cascade: v }"
421
+ >
422
+ <SelectTrigger class="w-full">
423
+ <SelectValue />
424
+ </SelectTrigger>
425
+ <SelectContent>
426
+ <SelectItem
427
+ v-for="opt in CASCADE_OPTIONS"
428
+ :key="opt.value"
429
+ :value="opt.value"
430
+ >
431
+ {{ opt.label }}
432
+ </SelectItem>
433
+ </SelectContent>
434
+ </Select>
435
+ </Field>
436
+
437
+ <Field orientation="vertical">
438
+ <FieldLabel class="text-xs text-zinc-500">
439
+ <template
440
+ v-if="fieldDescription('expandAll')"
441
+ #tooltip
442
+ >
443
+ <Markdown
444
+ :source="fieldDescription('expandAll')"
445
+ block
446
+ class="prose prose-sm prose-zinc"
447
+ />
448
+ </template>
449
+ {{ fieldTitle("expandAll") }}
450
+ </FieldLabel>
451
+ <div>
452
+ <Switch
453
+ :model-value="value.expandAll ?? false"
454
+ @update:model-value="(v) => value = { ...value, expandAll: v }"
455
+ />
456
+ </div>
457
+ </Field>
458
+ </div>
459
+
460
+ <!-- 过滤 (collapsible optional): toggle inlined with the section heading -->
461
+ <div class="flex items-center gap-2">
462
+ <h3 class="text-xs font-medium text-zinc-500">
463
+ {{ fieldTitle("filter") }}
464
+ </h3>
465
+ <Switch
466
+ size="sm"
467
+ :model-value="filter?.enabled ?? false"
468
+ :aria-label="filterFieldTitle('enabled')"
469
+ @update:model-value="setFilterEnabled"
470
+ />
471
+ </div>
472
+
473
+ <div
474
+ v-if="filter?.enabled"
475
+ class="grid grid-cols-2 gap-3"
476
+ >
477
+ <Field orientation="vertical">
478
+ <FieldLabel class="text-xs text-zinc-500">
479
+ <template
480
+ v-if="filterFieldDescription('label')"
481
+ #tooltip
482
+ >
483
+ <Markdown
484
+ :source="filterFieldDescription('label')"
485
+ block
486
+ class="prose prose-sm prose-zinc"
487
+ />
488
+ </template>
489
+ {{ filterFieldTitle("label") }}
490
+ </FieldLabel>
491
+ <LocaleField
492
+ translate-hint="tree filter input label"
493
+ :model-value="filter.label"
494
+ @update:model-value="setFilterLabel"
495
+ />
496
+ </Field>
497
+
498
+ <Field orientation="vertical">
499
+ <FieldLabel class="text-xs text-zinc-500">
500
+ <template
501
+ v-if="filterFieldDescription('keywords')"
502
+ #tooltip
503
+ >
504
+ <Markdown
505
+ :source="filterFieldDescription('keywords')"
506
+ block
507
+ class="prose prose-sm prose-zinc"
508
+ />
509
+ </template>
510
+ {{ filterFieldTitle("keywords") }}
511
+ </FieldLabel>
512
+ <ExpressionEditor
513
+ :model-value="filter.keywords ?? ''"
514
+ placeholder="例:[node.code, node.alias]"
515
+ result-type="list"
516
+ :extra-vars="nodeExtraVars"
517
+ class="min-h-10"
518
+ @update:model-value="setFilterKeywords"
519
+ />
520
+ </Field>
521
+ </div>
522
+
523
+ <!-- 通用:隐藏 / 禁用 / 只读 + 派生值 — conventionally last -->
524
+ <div class="grid grid-cols-3 gap-3">
525
+ <Field orientation="vertical">
526
+ <FieldLabel class="text-xs text-zinc-500">
527
+ <template #tooltip>
528
+ <Markdown
529
+ :source="fieldDescription('hidden') ?? '\u8FD4\u56DE `true` \u65F6\u5B57\u6BB5\u5728\u6240\u6709\u5E03\u5C40\u4E2D\u90FD\u4E0D\u6E32\u67D3'"
530
+ block
531
+ class="prose prose-sm prose-zinc"
532
+ />
533
+ </template>
534
+ {{ fieldTitle("hidden") }}
535
+ </FieldLabel>
536
+ <ExpressionEditor
537
+ :model-value="value.hidden ?? ''"
538
+ placeholder="例:form.role == 'guest'"
539
+ result-type="bool"
540
+ class="min-h-10"
541
+ @update:model-value="(v) => setOptionalExpression('hidden', v)"
542
+ />
543
+ </Field>
544
+
545
+ <Field orientation="vertical">
546
+ <FieldLabel class="text-xs text-zinc-500">
547
+ <template #tooltip>
548
+ <Markdown
549
+ :source="fieldDescription('disabled') ?? '\u8FD4\u56DE `true` \u65F6\u4ECD\u6E32\u67D3\u4F46\u4E0D\u53EF\u52FE\u9009'"
550
+ block
551
+ class="prose prose-sm prose-zinc"
552
+ />
553
+ </template>
554
+ {{ fieldTitle("disabled") }}
555
+ </FieldLabel>
556
+ <ExpressionEditor
557
+ :model-value="value.disabled ?? ''"
558
+ placeholder="例:form.status == 'locked'"
559
+ result-type="bool"
560
+ class="min-h-10"
561
+ @update:model-value="(v) => setOptionalExpression('disabled', v)"
562
+ />
563
+ </Field>
564
+
565
+ <Field orientation="vertical">
566
+ <FieldLabel class="text-xs text-zinc-500">
567
+ <template #tooltip>
568
+ <Markdown
569
+ :source="fieldDescription('readonly') ?? '\u8FD4\u56DE `true` \u65F6\u4EC5\u4EE5\u7EAF\u6587\u672C\u5C55\u793A\u5F53\u524D\u5DF2\u52FE\u9009\u8282\u70B9\u7684\u6807\u7B7E'"
570
+ block
571
+ class="prose prose-sm prose-zinc"
572
+ />
573
+ </template>
574
+ {{ fieldTitle("readonly") }}
575
+ </FieldLabel>
576
+ <ExpressionEditor
577
+ :model-value="value.readonly ?? ''"
578
+ placeholder="例:form.id != null"
579
+ result-type="bool"
580
+ class="min-h-10"
581
+ @update:model-value="(v) => setOptionalExpression('readonly', v)"
582
+ />
583
+ </Field>
584
+ </div>
585
+
586
+ <Field orientation="vertical">
587
+ <FieldLabel class="text-xs text-zinc-500">
588
+ <template #tooltip>
589
+ <Markdown
590
+ :source="fieldDescription('derived')"
591
+ block
592
+ class="prose prose-sm prose-zinc"
593
+ />
594
+ </template>
595
+ {{ fieldTitle("derived") }}
596
+ </FieldLabel>
597
+ <DerivedValueEditor
598
+ :model-value="value.derived"
599
+ result-type="dyn"
600
+ placeholder="例:form.defaultDepartmentIds"
601
+ @update:model-value="(v) => value = { ...value, derived: v }"
602
+ />
603
+ </Field>
604
+ </div>
605
+ </template>