@shwfed/config 2.10.0 → 2.10.2

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/mcp.mjs +4125 -3183
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-CCaOWk_7.js → FieldGroup.vue_vue_type_script_setup_true_lang-DX5M_WNF.js} +1 -1
  4. package/dist/preview/assets/{badge-D9_7atSJ.js → badge-DFZBH8N6.js} +1 -1
  5. package/dist/preview/assets/{config-B2d8SiPi.js → config-BH2BmDoD.js} +1 -1
  6. package/dist/preview/assets/{config-Bk2VSNeu.js → config-Bg7a8Rid.js} +1 -1
  7. package/dist/preview/assets/{config-DYxMKhCU.js → config-BiOW8fS2.js} +1 -1
  8. package/dist/preview/assets/{config-CNKb25Qo.js → config-Bnp547Nm.js} +1 -1
  9. package/dist/preview/assets/{config-Bf5Vckj3.js → config-CSmHhOh2.js} +1 -1
  10. package/dist/preview/assets/{config-CQrqVV1U.js → config-CTF5-TTQ.js} +1 -1
  11. package/dist/preview/assets/{config-DWA385pD.js → config-CqeWJt_H.js} +1 -1
  12. package/dist/preview/assets/{config-BLEovXei.js → config-DBtEKoan.js} +1 -1
  13. package/dist/preview/assets/{config-DyPl6K2G.js → config-DeDCNzY_.js} +1 -1
  14. package/dist/preview/assets/{config-C9WPOoA7.js → config-Dj3w2JkF.js} +1 -1
  15. package/dist/preview/assets/{config-DZlaJUlF.js → config-XGJ9V32V.js} +1 -1
  16. package/dist/preview/assets/{config-C8lCItmz.js → config-uIHUHvNR.js} +1 -1
  17. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-CFzQ7icU.js → definition.vue_vue_type_script_setup_true_lang-Cu0CEKYT.js} +1 -1
  18. package/dist/preview/assets/index-CGChrBji.js +1 -0
  19. package/dist/preview/assets/{index-CXOEVGFP.js → index-CQA6q2ay.js} +1 -1
  20. package/dist/preview/assets/index-DX9_iE4h.js +743 -0
  21. package/dist/preview/assets/{index-BnJ5p1Mx.css → index-pkoEF5dC.css} +1 -1
  22. package/dist/preview/assets/{item-DCVX69_o.js → item-C4VJfiq8.js} +1 -1
  23. package/dist/preview/assets/{runtime-DEWGIyvr.js → runtime-6Zrje7Y1.js} +1 -1
  24. package/dist/preview/assets/{runtime-O6MNC3GA.js → runtime-BN-jMAt7.js} +1 -1
  25. package/dist/preview/assets/{runtime-BD1A-g1h.js → runtime-BQMnWueG.js} +1 -1
  26. package/dist/preview/assets/{runtime-BsNSI1XP.js → runtime-CBz5XstF.js} +1 -1
  27. package/dist/preview/assets/{runtime-BNk4EliL.js → runtime-CFb1tHwr.js} +1 -1
  28. package/dist/preview/assets/{runtime-Cbc5NH57.js → runtime-DQL6lCFp.js} +1 -1
  29. package/dist/preview/assets/{runtime-DSfMvph3.js → runtime-DcdmMgqL.js} +1 -1
  30. package/dist/preview/assets/{runtime-DJ9ElxWB.js → runtime-okYOTQd6.js} +1 -1
  31. package/dist/preview/assets/{runtime-BO-KY3T_.js → runtime-qPyuMgsh.js} +1 -1
  32. package/dist/preview/assets/{runtime-r1wbrr4k.js → runtime-yfWYeUh4.js} +1 -1
  33. package/dist/preview/assets/{schema-meta-ovcuERKg.js → schema-meta-6ZPO8dHv.js} +1 -1
  34. package/dist/preview/index.html +2 -2
  35. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/config.d.vue.ts +2 -2
  36. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/config.vue.d.ts +2 -2
  37. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/runtime.d.vue.ts +4 -4
  38. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/runtime.vue.d.ts +4 -4
  39. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.form/schema.d.ts +1 -1
  40. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.d.vue.ts +2 -2
  41. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.vue.d.ts +2 -2
  42. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.d.vue.ts +2 -2
  43. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.vue.d.ts +2 -2
  44. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/schema.d.ts +2 -2
  45. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.combobox.single/config.d.vue.ts +16 -16
  46. package/dist/runtime/components/form/fields/2026-04-24/com.shwfed.form.field.combobox.single/config.vue.d.ts +16 -16
  47. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.d.vue.ts +6 -6
  48. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.number/config.vue.d.ts +6 -6
  49. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.d.vue.ts +6 -6
  50. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.numberrange/config.vue.d.ts +6 -6
  51. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.switch/config.d.vue.ts +22 -22
  52. package/dist/runtime/components/form/fields/2026-04-28/com.shwfed.form.field.switch/config.vue.d.ts +22 -22
  53. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/config.d.vue.ts +16 -16
  54. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/config.vue.d.ts +16 -16
  55. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/config.d.vue.ts +8 -8
  56. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/config.vue.d.ts +8 -8
  57. package/dist/runtime/components/form/fields/2026-05-25/com.shwfed.form.field.combobox.multi/config.d.vue.ts +16 -16
  58. package/dist/runtime/components/form/fields/2026-05-25/com.shwfed.form.field.combobox.multi/config.vue.d.ts +16 -16
  59. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/config.d.vue.ts +8 -8
  60. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/config.vue.d.ts +8 -8
  61. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/config.d.vue.ts +8 -8
  62. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/config.vue.d.ts +8 -8
  63. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.d.vue.ts +8 -8
  64. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.vue.d.ts +8 -8
  65. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.d.vue.ts +8 -8
  66. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.vue.d.ts +8 -8
  67. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.d.vue.ts +8 -8
  68. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.vue.d.ts +8 -8
  69. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.d.vue.ts +8 -8
  70. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.vue.d.ts +8 -8
  71. package/dist/runtime/components/form/schema.d.ts +2 -2
  72. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  73. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/runtime.vue +16 -3
  74. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch/runtime.vue +5 -1
  75. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/runtime.vue +5 -1
  76. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/runtime.vue +17 -3
  77. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +4 -4
  78. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +4 -4
  79. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/runtime.vue +5 -1
  80. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/runtime.vue +5 -1
  81. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  82. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +4 -4
  83. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +4 -4
  84. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/runtime.vue +5 -1
  85. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/runtime.vue +5 -1
  86. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  87. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/runtime.vue +5 -1
  88. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  89. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/runtime.vue +5 -1
  90. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +10 -10
  91. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +10 -10
  92. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/runtime.vue +5 -1
  93. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +10 -10
  94. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +10 -10
  95. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/runtime.vue +5 -1
  96. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +5 -1
  97. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +5 -1
  98. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +10 -10
  99. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +10 -10
  100. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +5 -1
  101. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +10 -10
  102. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +10 -10
  103. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +5 -1
  104. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.d.vue.ts +179 -0
  105. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue +942 -0
  106. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue.d.ts +179 -0
  107. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.d.vue.ts +9 -0
  108. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue +499 -0
  109. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue.d.ts +9 -0
  110. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.d.ts +223 -0
  111. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.js +276 -0
  112. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.d.vue.ts +179 -0
  113. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue +942 -0
  114. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue.d.ts +179 -0
  115. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.d.vue.ts +9 -0
  116. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue +438 -0
  117. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue.d.ts +9 -0
  118. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.d.ts +223 -0
  119. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.js +276 -0
  120. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +123 -0
  121. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue +646 -0
  122. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +123 -0
  123. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.d.vue.ts +9 -0
  124. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue +500 -0
  125. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue.d.ts +9 -0
  126. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +83 -0
  127. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.js +179 -0
  128. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +121 -0
  129. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue +577 -0
  130. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +121 -0
  131. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.d.vue.ts +9 -0
  132. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue +465 -0
  133. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue.d.ts +9 -0
  134. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.d.ts +80 -0
  135. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.js +171 -0
  136. package/dist/runtime/components/table/columns/2026-06-14/combobox-migrate.d.ts +18 -0
  137. package/dist/runtime/components/table/columns/2026-06-14/combobox-migrate.js +36 -0
  138. package/dist/runtime/components/table/columns/2026-06-14/tree-combobox-shared.d.ts +35 -0
  139. package/dist/runtime/components/table/columns/2026-06-14/tree-combobox-shared.js +31 -0
  140. package/dist/runtime/components/table/config.vue +74 -8
  141. package/dist/runtime/components/table/index.d.vue.ts +2 -0
  142. package/dist/runtime/components/table/index.vue +24 -0
  143. package/dist/runtime/components/table/index.vue.d.ts +2 -0
  144. package/dist/runtime/components/table/schema.d.ts +3 -3
  145. package/dist/runtime/components/table/utils/shared.d.ts +1 -0
  146. package/dist/runtime/components/table/utils/shared.js +7 -13
  147. package/package.json +1 -1
  148. package/dist/preview/assets/index-7BE56IYF.js +0 -739
  149. package/dist/preview/assets/index-Bwv0Yz_L.js +0 -1
@@ -0,0 +1,942 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { Icon } from "@iconify/vue";
4
+ import { Button } from "../../../../ui/button";
5
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../../../../ui/dropdown-menu";
6
+ import { ExpressionEditor } from "../../../../ui/expression-editor";
7
+ import { Separator } from "../../../../ui/separator";
8
+ import { Field, FieldLabel } from "../../../../ui/field";
9
+ import { Locale } from "../../../../ui/locale";
10
+ import { Textarea } from "../../../../ui/textarea";
11
+ import {
12
+ InputGroup,
13
+ InputGroupAddon,
14
+ InputGroupButton,
15
+ InputGroupInput,
16
+ InputGroupNumberField
17
+ } from "../../../../ui/input-group";
18
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../../../ui/tabs";
19
+ import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
20
+ import { Markdown } from "../../../../ui/markdown";
21
+ import TriggersField from "../../../../actions/components/triggers-field.vue";
22
+ import { itemSchema, remoteOptionsSchema, schema, writeSchema } from "./schema";
23
+ defineOptions({ name: "ShwfedTableComboboxMultiConfig" });
24
+ const value = defineModel({ type: null, ...{ required: true } });
25
+ const fieldSchema = schema(() => {
26
+ });
27
+ const fieldTitle = (field) => getStructFieldTitle(fieldSchema, field) ?? field;
28
+ const fieldDescription = (field) => getStructFieldDescription(fieldSchema, field);
29
+ const itemFieldSchema = itemSchema(() => {
30
+ });
31
+ const itemFieldTitle = (f) => getStructFieldTitle(itemFieldSchema, f) ?? f;
32
+ const itemFieldDescription = (f) => getStructFieldDescription(itemFieldSchema, f);
33
+ const remoteSchema = remoteOptionsSchema(() => {
34
+ });
35
+ const remoteFieldTitle = (f) => getStructFieldTitle(remoteSchema, f) ?? f;
36
+ const remoteFieldDescription = (f) => getStructFieldDescription(remoteSchema, f);
37
+ const writeUnion = writeSchema(() => {
38
+ });
39
+ const writeMembers = (writeUnion.ast.types ?? []).map(
40
+ (ast) => (
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ { ast }
43
+ )
44
+ );
45
+ const writeFieldTitle = (f) => {
46
+ for (const m of writeMembers) {
47
+ const t = getStructFieldTitle(m, f);
48
+ if (t) return t;
49
+ }
50
+ return f;
51
+ };
52
+ const writeFieldDescription = (f) => {
53
+ for (const m of writeMembers) {
54
+ const d = getStructFieldDescription(m, f);
55
+ if (d) return d;
56
+ }
57
+ return void 0;
58
+ };
59
+ const ROW_VARS = {
60
+ row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
61
+ index: { type: "number", label: "\u884C\u7D22\u5F15" }
62
+ };
63
+ const ROW_JSON_VARS = {
64
+ ...ROW_VARS,
65
+ json: { type: "dyn", label: "HTTP \u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09" }
66
+ };
67
+ const ROW_OPTION_VARS = {
68
+ ...ROW_VARS,
69
+ option: { type: "dyn", label: "\u5F53\u524D\u9009\u9879" }
70
+ };
71
+ const ROW_VALUE_VARS = {
72
+ ...ROW_VARS,
73
+ value: { type: "dyn", label: "\u7528\u6237\u5F53\u524D\u9009\u4E2D\u9879 `value` \u7EC4\u6210\u7684\u6570\u7EC4\uFF08\u6E05\u7A7A\u65F6\u4E3A\u7A7A\u6570\u7EC4\uFF09" }
74
+ };
75
+ const JSON_VARS = {
76
+ json: { type: "dyn", label: "HTTP \u54CD\u5E94\u4F53" }
77
+ };
78
+ function celModel(field) {
79
+ return computed({
80
+ get: () => value.value[field] ?? "",
81
+ set: (v) => {
82
+ if (v === "") {
83
+ const { [field]: _omit, ...rest } = value.value;
84
+ value.value = rest;
85
+ } else {
86
+ value.value = { ...value.value, [field]: v };
87
+ }
88
+ }
89
+ });
90
+ }
91
+ const hiddenModel = celModel("hidden");
92
+ const disabledModel = celModel("disabled");
93
+ const readonlyModel = celModel("readonly");
94
+ const writeKind = computed(() => value.value.write.kind);
95
+ function setWriteKind(kind) {
96
+ if (value.value.write.kind === kind) return;
97
+ const write = kind === "binding" ? { kind: "binding", binding: "" } : { kind: "remote", accessor: "" };
98
+ value.value = { ...value.value, write };
99
+ }
100
+ function patchRemoteWrite(patch) {
101
+ if (value.value.write.kind !== "remote") return;
102
+ value.value = { ...value.value, write: { ...value.value.write, ...patch } };
103
+ }
104
+ function remoteWriteCelModel(field) {
105
+ return computed({
106
+ get: () => value.value.write.kind === "remote" ? value.value.write[field] ?? "" : "",
107
+ set: (v) => {
108
+ if (value.value.write.kind !== "remote") return;
109
+ if (v === "") {
110
+ const { [field]: _omit, ...rest } = value.value.write;
111
+ value.value = { ...value.value, write: rest };
112
+ } else {
113
+ patchRemoteWrite({ [field]: v });
114
+ }
115
+ }
116
+ });
117
+ }
118
+ const bindingModel = computed({
119
+ get: () => value.value.write.kind === "binding" ? value.value.write.binding : "",
120
+ set: (v) => {
121
+ if (value.value.write.kind !== "binding") return;
122
+ value.value = { ...value.value, write: { kind: "binding", binding: v.trim() } };
123
+ }
124
+ });
125
+ const accessorModel = computed({
126
+ get: () => value.value.write.kind === "remote" ? value.value.write.accessor : "",
127
+ set: (v) => patchRemoteWrite({ accessor: v })
128
+ });
129
+ const onChangeModel = remoteWriteCelModel("onChange");
130
+ const successMessageModel = remoteWriteCelModel("successMessage");
131
+ const triggers = computed(
132
+ () => value.value.write.kind === "remote" ? value.value.write.triggers ?? [] : []
133
+ );
134
+ function updateTriggers(next) {
135
+ if (value.value.write.kind !== "remote") return;
136
+ if (next.length === 0) {
137
+ const { triggers: _omit, ...rest } = value.value.write;
138
+ value.value = { ...value.value, write: rest };
139
+ } else {
140
+ value.value = { ...value.value, write: { ...value.value.write, triggers: [...next] } };
141
+ }
142
+ }
143
+ const optionsKind = computed(() => value.value.options.kind);
144
+ function emptyStatic() {
145
+ return { kind: "static", items: [] };
146
+ }
147
+ function emptyRemote() {
148
+ return {
149
+ kind: "remote",
150
+ request: "",
151
+ options: "",
152
+ optionValue: "option",
153
+ optionLabel: ""
154
+ };
155
+ }
156
+ function setKind(kind) {
157
+ if (value.value.options.kind === kind) return;
158
+ value.value = {
159
+ ...value.value,
160
+ options: kind === "static" ? emptyStatic() : emptyRemote()
161
+ };
162
+ }
163
+ const items = computed(() => {
164
+ return value.value.options.kind === "static" ? value.value.options.items : [];
165
+ });
166
+ function patchStatic(patch) {
167
+ if (value.value.options.kind !== "static") return;
168
+ value.value = {
169
+ ...value.value,
170
+ options: { ...value.value.options, ...patch }
171
+ };
172
+ }
173
+ function patchRemote(patch) {
174
+ if (value.value.options.kind !== "remote") return;
175
+ value.value = {
176
+ ...value.value,
177
+ options: { ...value.value.options, ...patch }
178
+ };
179
+ }
180
+ const requestModel = computed({
181
+ get: () => value.value.options.kind === "remote" ? value.value.options.request : "",
182
+ set: (v) => patchRemote({ request: v })
183
+ });
184
+ const optionsExprModel = computed({
185
+ get: () => value.value.options.kind === "remote" ? value.value.options.options : "",
186
+ set: (v) => patchRemote({ options: v })
187
+ });
188
+ const optionValueModel = computed({
189
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionValue : "option",
190
+ set: (v) => patchRemote({ optionValue: v })
191
+ });
192
+ const optionLabelModel = computed({
193
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionLabel : "",
194
+ set: (v) => patchRemote({ optionLabel: v })
195
+ });
196
+ const optionKeywordsModel = computed({
197
+ get: () => value.value.options.kind === "remote" ? value.value.options.optionKeywords ?? "" : "",
198
+ set: (v) => {
199
+ if (value.value.options.kind !== "remote") return;
200
+ if (v === "") {
201
+ const { optionKeywords: _omit, ...rest } = value.value.options;
202
+ value.value = { ...value.value, options: rest };
203
+ } else {
204
+ patchRemote({ optionKeywords: v });
205
+ }
206
+ }
207
+ });
208
+ function newId() {
209
+ return typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
210
+ const r = Math.random() * 16 | 0;
211
+ const v = c === "x" ? r : r & 3 | 8;
212
+ return v.toString(16);
213
+ });
214
+ }
215
+ function newItem() {
216
+ return {
217
+ id: newId(),
218
+ label: [{ locale: "zh", message: "" }],
219
+ value: { kind: "text", value: "" }
220
+ };
221
+ }
222
+ function patchItem(index, patch) {
223
+ if (value.value.options.kind !== "static") return;
224
+ const next = [...value.value.options.items];
225
+ const cur = next[index];
226
+ if (!cur) return;
227
+ next[index] = { ...cur, ...patch };
228
+ patchStatic({ items: next });
229
+ }
230
+ function addItem() {
231
+ if (value.value.options.kind !== "static") return;
232
+ patchStatic({ items: [...value.value.options.items, newItem()] });
233
+ }
234
+ function removeItem(index) {
235
+ if (value.value.options.kind !== "static") return;
236
+ const next = [...value.value.options.items];
237
+ next.splice(index, 1);
238
+ patchStatic({ items: next });
239
+ }
240
+ function setItemKind(index, kind) {
241
+ if (value.value.options.kind !== "static") return;
242
+ const cur = value.value.options.items[index];
243
+ if (!cur || cur.value.kind === kind) return;
244
+ patchItem(index, {
245
+ value: kind === "text" ? { kind: "text", value: "" } : { kind: "number", value: 0 }
246
+ });
247
+ }
248
+ function setItemTextValue(index, text) {
249
+ patchItem(index, { value: { kind: "text", value: text } });
250
+ }
251
+ function setItemNumberValue(index, n) {
252
+ patchItem(index, {
253
+ value: {
254
+ kind: "number",
255
+ value: typeof n === "number" && Number.isFinite(n) ? n : 0
256
+ }
257
+ });
258
+ }
259
+ function setItemLabel(index, label) {
260
+ patchItem(index, { label });
261
+ }
262
+ function setItemTooltip(index, tooltip) {
263
+ const isEmpty = !tooltip || tooltip.every((l) => l.message.trim().length === 0);
264
+ if (value.value.options.kind !== "static") return;
265
+ if (isEmpty) {
266
+ const cur = value.value.options.items[index];
267
+ if (!cur) return;
268
+ const { tooltip: _omit, ...rest } = cur;
269
+ const next = [...value.value.options.items];
270
+ next[index] = rest;
271
+ patchStatic({ items: next });
272
+ } else {
273
+ patchItem(index, { tooltip });
274
+ }
275
+ }
276
+ function keywordsText(item) {
277
+ return (item.keywords ?? []).join("\n");
278
+ }
279
+ function setItemKeywords(index, text) {
280
+ if (value.value.options.kind !== "static") return;
281
+ const list = text.split("\n").map((s) => s.trim()).filter((s) => s.length > 0);
282
+ const cur = value.value.options.items[index];
283
+ if (!cur) return;
284
+ const next = [...value.value.options.items];
285
+ if (list.length === 0) {
286
+ const { keywords: _omit, ...rest } = cur;
287
+ next[index] = rest;
288
+ } else {
289
+ next[index] = { ...cur, keywords: list };
290
+ }
291
+ patchStatic({ items: next });
292
+ }
293
+ </script>
294
+
295
+ <template>
296
+ <div class="space-y-5">
297
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4">
298
+ <Field orientation="vertical">
299
+ <FieldLabel class="text-xs text-zinc-500">
300
+ <template
301
+ v-if="fieldDescription('title')"
302
+ #tooltip
303
+ >
304
+ <Markdown
305
+ :source="fieldDescription('title')"
306
+ block
307
+ class="prose prose-sm prose-zinc"
308
+ />
309
+ </template>
310
+ {{ fieldTitle("title") }}
311
+ </FieldLabel>
312
+ <Locale v-model="value.title" />
313
+ </Field>
314
+ <Field orientation="vertical">
315
+ <FieldLabel class="text-xs text-zinc-500">
316
+ <template
317
+ v-if="fieldDescription('tooltip')"
318
+ #tooltip
319
+ >
320
+ <Markdown
321
+ :source="fieldDescription('tooltip')"
322
+ block
323
+ class="prose prose-sm prose-zinc"
324
+ />
325
+ </template>
326
+ {{ fieldTitle("tooltip") }}
327
+ </FieldLabel>
328
+ <Locale
329
+ v-model="value.tooltip"
330
+ markdown
331
+ />
332
+ </Field>
333
+ </div>
334
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4">
335
+ <Field orientation="vertical">
336
+ <FieldLabel class="text-xs text-zinc-500">
337
+ <template
338
+ v-if="fieldDescription('placeholder')"
339
+ #tooltip
340
+ >
341
+ <Markdown
342
+ :source="fieldDescription('placeholder')"
343
+ block
344
+ class="prose prose-sm prose-zinc"
345
+ />
346
+ </template>
347
+ {{ fieldTitle("placeholder") }}
348
+ </FieldLabel>
349
+ <Locale v-model="value.placeholder" />
350
+ </Field>
351
+ <Field orientation="vertical">
352
+ <FieldLabel class="text-xs text-zinc-500">
353
+ <template
354
+ v-if="fieldDescription('size')"
355
+ #tooltip
356
+ >
357
+ <Markdown
358
+ :source="fieldDescription('size')"
359
+ block
360
+ class="prose prose-sm prose-zinc"
361
+ />
362
+ </template>
363
+ {{ fieldTitle("size") }}
364
+ </FieldLabel>
365
+ <InputGroup>
366
+ <InputGroupNumberField
367
+ :model-value="value.size"
368
+ :disabled="value.grow"
369
+ :min="0"
370
+ @update:model-value="(v) => value = { ...value, size: v }"
371
+ />
372
+ <InputGroupAddon align="inline-end">
373
+ <InputGroupButton
374
+ :variant="value.grow ? 'primary' : 'ghost'"
375
+ size="xs"
376
+ @click="value = { ...value, grow: !value.grow }"
377
+ >
378
+ <Icon :icon="value.grow ? 'fluent:lock-closed-20-regular' : 'fluent:arrow-autofit-width-20-regular'" />
379
+ {{ fieldTitle("grow") }}
380
+ </InputGroupButton>
381
+ </InputGroupAddon>
382
+ </InputGroup>
383
+ </Field>
384
+ </div>
385
+
386
+ <Field orientation="vertical">
387
+ <FieldLabel class="text-xs text-zinc-500">
388
+ <template #tooltip>
389
+ <Markdown
390
+ source="选项可以是静态配置的固定列表,也可以由远程接口实时加载"
391
+ block
392
+ class="prose prose-sm prose-zinc"
393
+ />
394
+ </template>
395
+ 选项来源
396
+ </FieldLabel>
397
+
398
+ <Tabs
399
+ :model-value="optionsKind"
400
+ @update:model-value="(v) => {
401
+ if (v === 'static' || v === 'remote') setKind(v);
402
+ }"
403
+ >
404
+ <TabsList>
405
+ <TabsTrigger value="static">
406
+ 静态
407
+ </TabsTrigger>
408
+ <TabsTrigger value="remote">
409
+ 远程
410
+ </TabsTrigger>
411
+ </TabsList>
412
+ <TabsContent
413
+ value="static"
414
+ class="outline-none"
415
+ >
416
+ <div class="flex flex-col gap-3 pt-3">
417
+ <div
418
+ v-for="(item, index) in items"
419
+ :key="item.id"
420
+ data-slot="combobox-multi-item"
421
+ class="relative pt-8 grid grid-cols-2 gap-3 rounded border border-zinc-200 bg-zinc-50/40 p-3"
422
+ >
423
+ <InputGroupButton
424
+ variant="destructive"
425
+ size="icon-xs"
426
+ data-slot="combobox-multi-item-delete"
427
+ aria-label="删除选项"
428
+ class="absolute right-2 top-2 z-10"
429
+ @click="removeItem(index)"
430
+ >
431
+ <Icon icon="fluent:delete-20-regular" />
432
+ </InputGroupButton>
433
+
434
+ <Field orientation="vertical">
435
+ <FieldLabel class="text-xs text-zinc-500">
436
+ <template
437
+ v-if="itemFieldDescription('label')"
438
+ #tooltip
439
+ >
440
+ <Markdown
441
+ :source="itemFieldDescription('label')"
442
+ block
443
+ class="prose prose-sm prose-zinc"
444
+ />
445
+ </template>
446
+ {{ itemFieldTitle("label") }}
447
+ </FieldLabel>
448
+ <Locale
449
+ translate-hint="combobox option label"
450
+ :model-value="item.label"
451
+ @update:model-value="(v) => setItemLabel(index, v)"
452
+ />
453
+ </Field>
454
+
455
+ <Field orientation="vertical">
456
+ <FieldLabel class="text-xs text-zinc-500">
457
+ <template
458
+ v-if="itemFieldDescription('value')"
459
+ #tooltip
460
+ >
461
+ <Markdown
462
+ :source="itemFieldDescription('value')"
463
+ block
464
+ class="prose prose-sm prose-zinc"
465
+ />
466
+ </template>
467
+ {{ itemFieldTitle("value") }}
468
+ </FieldLabel>
469
+ <InputGroup>
470
+ <InputGroupAddon align="inline-start">
471
+ <DropdownMenu>
472
+ <DropdownMenuTrigger as-child>
473
+ <InputGroupButton
474
+ size="icon-sm"
475
+ as-child
476
+ >
477
+ <button
478
+ type="button"
479
+ data-slot="combobox-multi-item-kind-trigger"
480
+ class="text-zinc-500 transition-colors hover:text-zinc-700 [&_svg:not([class*='size-'])]:size-3.5"
481
+ aria-label="切换值类型"
482
+ >
483
+ <Icon
484
+ :icon="item.value.kind === 'number' ? 'fluent:number-symbol-20-regular' : 'fluent:textbox-20-regular'"
485
+ />
486
+ </button>
487
+ </InputGroupButton>
488
+ </DropdownMenuTrigger>
489
+ <DropdownMenuContent align="start">
490
+ <DropdownMenuItem @select="setItemKind(index, 'text')">
491
+ <Icon icon="fluent:textbox-20-regular" />
492
+ <span>文本</span>
493
+ </DropdownMenuItem>
494
+ <DropdownMenuItem @select="setItemKind(index, 'number')">
495
+ <Icon icon="fluent:number-symbol-20-regular" />
496
+ <span>数字</span>
497
+ </DropdownMenuItem>
498
+ </DropdownMenuContent>
499
+ </DropdownMenu>
500
+ </InputGroupAddon>
501
+
502
+ <InputGroupInput
503
+ v-if="item.value.kind === 'text'"
504
+ :model-value="item.value.value"
505
+ placeholder="例:admin"
506
+ @update:model-value="(v) => setItemTextValue(index, String(v ?? ''))"
507
+ />
508
+ <InputGroupNumberField
509
+ v-else
510
+ :model-value="item.value.value"
511
+ @update:model-value="(v) => setItemNumberValue(index, v)"
512
+ />
513
+ </InputGroup>
514
+ </Field>
515
+
516
+ <Field orientation="vertical">
517
+ <FieldLabel class="text-xs text-zinc-500">
518
+ <template
519
+ v-if="itemFieldDescription('tooltip')"
520
+ #tooltip
521
+ >
522
+ <Markdown
523
+ :source="itemFieldDescription('tooltip')"
524
+ block
525
+ class="prose prose-sm prose-zinc"
526
+ />
527
+ </template>
528
+ {{ itemFieldTitle("tooltip") }}
529
+ </FieldLabel>
530
+ <Locale
531
+ markdown
532
+ translate-hint="combobox option tooltip"
533
+ :model-value="item.tooltip"
534
+ @update:model-value="(v) => setItemTooltip(index, v)"
535
+ />
536
+ </Field>
537
+
538
+ <Field orientation="vertical">
539
+ <FieldLabel class="text-xs text-zinc-500">
540
+ <template
541
+ v-if="itemFieldDescription('keywords')"
542
+ #tooltip
543
+ >
544
+ <Markdown
545
+ :source="itemFieldDescription('keywords')"
546
+ block
547
+ class="prose prose-sm prose-zinc"
548
+ />
549
+ </template>
550
+ {{ itemFieldTitle("keywords") }}
551
+ </FieldLabel>
552
+ <Textarea
553
+ data-slot="combobox-multi-item-keywords"
554
+ :model-value="keywordsText(item)"
555
+ placeholder="每行一个关键词"
556
+ :rows="2"
557
+ @update:model-value="(v) => setItemKeywords(index, String(v ?? ''))"
558
+ />
559
+ </Field>
560
+ </div>
561
+
562
+ <Button
563
+ type="button"
564
+ data-slot="combobox-multi-add-item"
565
+ class="w-full justify-center"
566
+ @click="addItem"
567
+ >
568
+ <Icon icon="fluent:add-20-regular" />
569
+ <span>增加选项</span>
570
+ </Button>
571
+ </div>
572
+ </TabsContent>
573
+ <TabsContent
574
+ value="remote"
575
+ class="outline-none"
576
+ >
577
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4 pt-3">
578
+ <Field orientation="vertical">
579
+ <FieldLabel class="text-xs text-zinc-500">
580
+ <template
581
+ v-if="remoteFieldDescription('request')"
582
+ #tooltip
583
+ >
584
+ <Markdown
585
+ :source="remoteFieldDescription('request')"
586
+ block
587
+ class="prose prose-sm prose-zinc"
588
+ />
589
+ </template>
590
+ {{ remoteFieldTitle("request") }}
591
+ </FieldLabel>
592
+ <ExpressionEditor
593
+ v-model="requestModel"
594
+ placeholder="如 http.get('/api/roles')"
595
+ result-type="HttpRequest"
596
+ :extra-vars="ROW_VARS"
597
+ multiline
598
+ />
599
+ </Field>
600
+ <Field orientation="vertical">
601
+ <FieldLabel class="text-xs text-zinc-500">
602
+ <template
603
+ v-if="remoteFieldDescription('options')"
604
+ #tooltip
605
+ >
606
+ <Markdown
607
+ :source="remoteFieldDescription('options')"
608
+ block
609
+ class="prose prose-sm prose-zinc"
610
+ />
611
+ </template>
612
+ {{ remoteFieldTitle("options") }}
613
+ </FieldLabel>
614
+ <ExpressionEditor
615
+ v-model="optionsExprModel"
616
+ placeholder="如 json.data"
617
+ result-type="dyn"
618
+ :extra-vars="ROW_JSON_VARS"
619
+ multiline
620
+ />
621
+ </Field>
622
+ <Field orientation="vertical">
623
+ <FieldLabel class="text-xs text-zinc-500">
624
+ <template
625
+ v-if="remoteFieldDescription('optionValue')"
626
+ #tooltip
627
+ >
628
+ <Markdown
629
+ :source="remoteFieldDescription('optionValue')"
630
+ block
631
+ class="prose prose-sm prose-zinc"
632
+ />
633
+ </template>
634
+ {{ remoteFieldTitle("optionValue") }}
635
+ </FieldLabel>
636
+ <ExpressionEditor
637
+ v-model="optionValueModel"
638
+ placeholder="如 option.id"
639
+ result-type="dyn"
640
+ :extra-vars="ROW_OPTION_VARS"
641
+ />
642
+ </Field>
643
+ <Field orientation="vertical">
644
+ <FieldLabel class="text-xs text-zinc-500">
645
+ <template
646
+ v-if="remoteFieldDescription('optionLabel')"
647
+ #tooltip
648
+ >
649
+ <Markdown
650
+ :source="remoteFieldDescription('optionLabel')"
651
+ block
652
+ class="prose prose-sm prose-zinc"
653
+ />
654
+ </template>
655
+ {{ remoteFieldTitle("optionLabel") }}
656
+ </FieldLabel>
657
+ <ExpressionEditor
658
+ v-model="optionLabelModel"
659
+ placeholder="如 option.name"
660
+ result-type="dyn"
661
+ :extra-vars="ROW_OPTION_VARS"
662
+ />
663
+ </Field>
664
+ <Field orientation="vertical">
665
+ <FieldLabel class="text-xs text-zinc-500">
666
+ <template
667
+ v-if="remoteFieldDescription('optionKeywords')"
668
+ #tooltip
669
+ >
670
+ <Markdown
671
+ :source="remoteFieldDescription('optionKeywords')"
672
+ block
673
+ class="prose prose-sm prose-zinc"
674
+ />
675
+ </template>
676
+ {{ remoteFieldTitle("optionKeywords") }}
677
+ </FieldLabel>
678
+ <ExpressionEditor
679
+ v-model="optionKeywordsModel"
680
+ placeholder="如 option.aliases"
681
+ result-type="dyn"
682
+ :extra-vars="ROW_OPTION_VARS"
683
+ />
684
+ </Field>
685
+ </div>
686
+ </TabsContent>
687
+ </Tabs>
688
+ </Field>
689
+
690
+ <Field orientation="vertical">
691
+ <FieldLabel class="text-xs text-zinc-500">
692
+ <template #tooltip>
693
+ <Markdown
694
+ source="**绑定**:单元格行内可编辑,读写同一 dot-prop 路径;**远程**:只读回显行数据,选择后发起请求写入服务端"
695
+ block
696
+ class="prose prose-sm prose-zinc"
697
+ />
698
+ </template>
699
+ 写入方式
700
+ </FieldLabel>
701
+
702
+ <Tabs
703
+ :model-value="writeKind"
704
+ @update:model-value="(v) => {
705
+ if (v === 'binding' || v === 'remote') setWriteKind(v);
706
+ }"
707
+ >
708
+ <TabsList>
709
+ <TabsTrigger value="binding">
710
+ 绑定
711
+ </TabsTrigger>
712
+ <TabsTrigger value="remote">
713
+ 远程
714
+ </TabsTrigger>
715
+ </TabsList>
716
+ <TabsContent
717
+ value="binding"
718
+ class="outline-none"
719
+ >
720
+ <div class="pt-3">
721
+ <Field orientation="vertical">
722
+ <FieldLabel class="text-xs text-zinc-500">
723
+ <template
724
+ v-if="writeFieldDescription('binding')"
725
+ #tooltip
726
+ >
727
+ <Markdown
728
+ :source="writeFieldDescription('binding')"
729
+ block
730
+ class="prose prose-sm prose-zinc"
731
+ />
732
+ </template>
733
+ {{ writeFieldTitle("binding") }}
734
+ </FieldLabel>
735
+ <InputGroup>
736
+ <InputGroupInput
737
+ v-model="bindingModel"
738
+ placeholder="例:roles"
739
+ class="font-mono"
740
+ />
741
+ </InputGroup>
742
+ </Field>
743
+ </div>
744
+ </TabsContent>
745
+ <TabsContent
746
+ value="remote"
747
+ class="outline-none"
748
+ >
749
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4 pt-3">
750
+ <Field orientation="vertical">
751
+ <FieldLabel class="text-xs text-zinc-500">
752
+ <template
753
+ v-if="writeFieldDescription('accessor')"
754
+ #tooltip
755
+ >
756
+ <Markdown
757
+ :source="writeFieldDescription('accessor')"
758
+ block
759
+ class="prose prose-sm prose-zinc"
760
+ />
761
+ </template>
762
+ {{ writeFieldTitle("accessor") }}
763
+ </FieldLabel>
764
+ <ExpressionEditor
765
+ v-model="accessorModel"
766
+ placeholder="如 row.roles"
767
+ result-type="dyn"
768
+ :extra-vars="ROW_VARS"
769
+ />
770
+ </Field>
771
+ <Field orientation="vertical">
772
+ <FieldLabel class="text-xs text-zinc-500">
773
+ <template
774
+ v-if="writeFieldDescription('onChange')"
775
+ #tooltip
776
+ >
777
+ <Markdown
778
+ :source="writeFieldDescription('onChange')"
779
+ block
780
+ class="prose prose-sm prose-zinc"
781
+ />
782
+ </template>
783
+ {{ writeFieldTitle("onChange") }}
784
+ </FieldLabel>
785
+ <ExpressionEditor
786
+ v-model="onChangeModel"
787
+ placeholder="如 http.patch('/api/items/' + row.id).body({ roles: value })"
788
+ result-type="HttpRequest"
789
+ :extra-vars="ROW_VALUE_VARS"
790
+ multiline
791
+ />
792
+ </Field>
793
+ <Field orientation="vertical">
794
+ <FieldLabel class="text-xs text-zinc-500">
795
+ <template
796
+ v-if="writeFieldDescription('successMessage')"
797
+ #tooltip
798
+ >
799
+ <Markdown
800
+ :source="writeFieldDescription('successMessage')"
801
+ block
802
+ class="prose prose-sm prose-zinc"
803
+ />
804
+ </template>
805
+ {{ writeFieldTitle("successMessage") }}
806
+ </FieldLabel>
807
+ <ExpressionEditor
808
+ v-model="successMessageModel"
809
+ placeholder="如 '已更新'"
810
+ result-type="string"
811
+ :extra-vars="JSON_VARS"
812
+ />
813
+ </Field>
814
+ <Field orientation="vertical">
815
+ <FieldLabel class="text-xs text-zinc-500">
816
+ <template
817
+ v-if="writeFieldDescription('triggers')"
818
+ #tooltip
819
+ >
820
+ <Markdown
821
+ :source="writeFieldDescription('triggers')"
822
+ block
823
+ class="prose prose-sm prose-zinc"
824
+ />
825
+ </template>
826
+ {{ writeFieldTitle("triggers") }}
827
+ </FieldLabel>
828
+ <TriggersField
829
+ :triggers="triggers"
830
+ @update:triggers="updateTriggers"
831
+ />
832
+ </Field>
833
+ </div>
834
+ </TabsContent>
835
+ </Tabs>
836
+ </Field>
837
+
838
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4">
839
+ <Field orientation="vertical">
840
+ <FieldLabel class="text-xs text-zinc-500">
841
+ <template
842
+ v-if="fieldDescription('hidden')"
843
+ #tooltip
844
+ >
845
+ <Markdown
846
+ :source="fieldDescription('hidden')"
847
+ block
848
+ class="prose prose-sm prose-zinc"
849
+ />
850
+ </template>
851
+ {{ fieldTitle("hidden") }}
852
+ </FieldLabel>
853
+ <ExpressionEditor
854
+ v-model="hiddenModel"
855
+ placeholder="例:row.archived"
856
+ result-type="bool"
857
+ :extra-vars="ROW_VARS"
858
+ />
859
+ </Field>
860
+ <Field orientation="vertical">
861
+ <FieldLabel class="text-xs text-zinc-500">
862
+ <template
863
+ v-if="fieldDescription('disabled')"
864
+ #tooltip
865
+ >
866
+ <Markdown
867
+ :source="fieldDescription('disabled')"
868
+ block
869
+ class="prose prose-sm prose-zinc"
870
+ />
871
+ </template>
872
+ {{ fieldTitle("disabled") }}
873
+ </FieldLabel>
874
+ <ExpressionEditor
875
+ v-model="disabledModel"
876
+ placeholder="例:row.locked"
877
+ result-type="bool"
878
+ :extra-vars="ROW_VARS"
879
+ />
880
+ </Field>
881
+ <Field orientation="vertical">
882
+ <FieldLabel class="text-xs text-zinc-500">
883
+ <template
884
+ v-if="fieldDescription('readonly')"
885
+ #tooltip
886
+ >
887
+ <Markdown
888
+ :source="fieldDescription('readonly')"
889
+ block
890
+ class="prose prose-sm prose-zinc"
891
+ />
892
+ </template>
893
+ {{ fieldTitle("readonly") }}
894
+ </FieldLabel>
895
+ <ExpressionEditor
896
+ v-model="readonlyModel"
897
+ placeholder="例:row.id == null"
898
+ result-type="bool"
899
+ :extra-vars="ROW_VARS"
900
+ />
901
+ </Field>
902
+ </div>
903
+ <Separator />
904
+ <div class="flex flex-wrap gap-x-8 gap-y-3">
905
+ <Field
906
+ orientation="vertical"
907
+ class="w-full max-w-xs"
908
+ >
909
+ <FieldLabel class="text-xs text-zinc-500">
910
+ <template
911
+ v-if="fieldDescription('enableSorting')"
912
+ #tooltip
913
+ >
914
+ <Markdown
915
+ :source="fieldDescription('enableSorting')"
916
+ block
917
+ class="prose prose-sm prose-zinc"
918
+ />
919
+ </template>
920
+ {{ fieldTitle("enableSorting") }}
921
+ </FieldLabel>
922
+ <InputGroup>
923
+ <InputGroupInput
924
+ :model-value="value.sortKey"
925
+ placeholder="例:created_at"
926
+ @update:model-value="(v) => value = { ...value, sortKey: v || void 0 }"
927
+ />
928
+ <InputGroupAddon align="inline-end">
929
+ <InputGroupButton
930
+ :variant="value.enableSorting ? 'primary' : 'ghost'"
931
+ size="xs"
932
+ @click="value = { ...value, enableSorting: !value.enableSorting }"
933
+ >
934
+ <Icon :icon="value.enableSorting ? 'fluent:arrow-sort-up-16-regular' : 'fluent:arrow-sort-16-regular'" />
935
+ {{ fieldTitle("enableSorting") }}
936
+ </InputGroupButton>
937
+ </InputGroupAddon>
938
+ </InputGroup>
939
+ </Field>
940
+ </div>
941
+ </div>
942
+ </template>