@shwfed/config 2.10.11 → 2.11.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 (155) hide show
  1. package/dist/mcp.mjs +1085 -925
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-DSupaUBQ.js → FieldGroup.vue_vue_type_script_setup_true_lang-UfhMyymD.js} +1 -1
  4. package/dist/preview/assets/{badge-BpMIBZb2.js → badge-CJ9IQ3Jx.js} +1 -1
  5. package/dist/preview/assets/{config-CM4nX_7y.js → config--Vx4fL61.js} +1 -1
  6. package/dist/preview/assets/{config-CujkaO8S.js → config-5PPug5mk.js} +1 -1
  7. package/dist/preview/assets/{config-c2iiXckz.js → config-7V1qHjUk.js} +1 -1
  8. package/dist/preview/assets/{config-DrkDnICQ.js → config-BYktCefJ.js} +1 -1
  9. package/dist/preview/assets/{config-Cc1ThF9T.js → config-BeRYF_cz.js} +1 -1
  10. package/dist/preview/assets/{config-DbtYnaaf.js → config-BldsYfGM.js} +1 -1
  11. package/dist/preview/assets/{config-BCCT-UCw.js → config-CQrDCzYN.js} +1 -1
  12. package/dist/preview/assets/{config-CY9L8__h.js → config-C_g-FYCR.js} +1 -1
  13. package/dist/preview/assets/{config-Bz643_RE.js → config-DIsAIc7H.js} +1 -1
  14. package/dist/preview/assets/{config-CNJS9Ncm.js → config-DPX7vGqV.js} +1 -1
  15. package/dist/preview/assets/{config-C7nJ8jl6.js → config-DpLMetys.js} +1 -1
  16. package/dist/preview/assets/{config-Bx4-IdW5.js → config-IMd4FZi8.js} +1 -1
  17. package/dist/preview/assets/{config-v7UFMF25.js → config-N-FdgfwK.js} +1 -1
  18. package/dist/preview/assets/{config-agH4hNej.js → config-uUF-UHPt.js} +1 -1
  19. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-B1dZHF9Z.js → definition.vue_vue_type_script_setup_true_lang-B_PKfe3G.js} +1 -1
  20. package/dist/preview/assets/index-8Ph-sFDI.css +1 -0
  21. package/dist/preview/assets/index-BCl1NN6k.js +763 -0
  22. package/dist/preview/assets/index-Core7vRW.js +1 -0
  23. package/dist/preview/assets/{index-B10aTz32.js → index-DKWp47QP.js} +1 -1
  24. package/dist/preview/assets/{item-DxWeqOxe.js → item-XsW7swFt.js} +1 -1
  25. package/dist/preview/assets/{runtime-CeItNJdF.js → runtime-B-ABO0r0.js} +1 -1
  26. package/dist/preview/assets/{runtime-C6oMTKIZ.js → runtime-BeHohaOZ.js} +1 -1
  27. package/dist/preview/assets/{runtime-rpKOBs2Q.js → runtime-BiFFwOIl.js} +1 -1
  28. package/dist/preview/assets/{runtime-BO_Ak4ly.js → runtime-ByArW-jJ.js} +1 -1
  29. package/dist/preview/assets/{runtime-3VPnK4Ve.js → runtime-CpVTGNFZ.js} +1 -1
  30. package/dist/preview/assets/{runtime-DQK6Vajf.js → runtime-DQ1TnQ7n.js} +1 -1
  31. package/dist/preview/assets/{runtime-P58D1JCj.js → runtime-DY7hr7v1.js} +1 -1
  32. package/dist/preview/assets/{runtime-BcWQ55Ub.js → runtime-Dn172S7t.js} +1 -1
  33. package/dist/preview/assets/{runtime-DwgCzoDf.js → runtime-JxBzvGnw.js} +1 -1
  34. package/dist/preview/assets/{runtime-D6jswLOt.js → runtime-bq0hmEXY.js} +1 -1
  35. package/dist/preview/assets/{schema-meta-BtDKldOy.js → schema-meta-CZ9yXnsa.js} +1 -1
  36. package/dist/preview/index.html +2 -2
  37. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/config.d.vue.ts +22 -22
  38. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/config.vue.d.ts +22 -22
  39. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/config.d.vue.ts +22 -22
  40. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/config.vue.d.ts +22 -22
  41. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/config.d.vue.ts +22 -22
  42. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/config.vue.d.ts +22 -22
  43. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.d.vue.ts +22 -22
  44. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/config.vue.d.ts +22 -22
  45. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.d.vue.ts +22 -22
  46. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/config.vue.d.ts +22 -22
  47. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.d.vue.ts +22 -22
  48. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/config.vue.d.ts +22 -22
  49. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.d.vue.ts +22 -22
  50. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/config.vue.d.ts +22 -22
  51. package/dist/runtime/components/form/fields/2026-06-09/com.shwfed.form.field.upload/runtime.vue +23 -1
  52. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/config.vue +30 -0
  53. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.d.ts +2 -1
  54. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.js +1 -1
  55. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/config.vue +30 -0
  56. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.d.ts +2 -1
  57. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.js +7 -4
  58. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/config.vue +30 -0
  59. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.d.ts +2 -1
  60. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.js +1 -1
  61. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/config.vue +30 -0
  62. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.d.ts +2 -1
  63. package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.js +1 -1
  64. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.d.ts +2 -1
  65. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.js +1 -0
  66. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/config.vue +30 -0
  67. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.d.ts +2 -1
  68. package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.js +1 -1
  69. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/config.vue +143 -35
  70. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/runtime.vue +35 -9
  71. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.d.ts +136 -1
  72. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.js +20 -6
  73. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/config.vue +67 -32
  74. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/runtime.vue +6 -9
  75. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.d.ts +4 -1
  76. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.js +2 -5
  77. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/config.vue +148 -33
  78. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/runtime.vue +35 -9
  79. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.d.ts +136 -1
  80. package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.js +20 -6
  81. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
  82. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
  83. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.d.ts +1 -1
  84. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +1 -0
  85. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
  86. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
  87. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.d.ts +1 -1
  88. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.js +1 -0
  89. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
  90. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
  91. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.d.ts +1 -1
  92. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +1 -0
  93. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
  94. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
  95. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.d.ts +1 -1
  96. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.js +1 -0
  97. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
  98. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
  99. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.d.ts +1 -1
  100. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +1 -0
  101. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
  102. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
  103. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.d.ts +1 -1
  104. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +1 -0
  105. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.d.vue.ts +4 -2
  106. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue +61 -22
  107. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue.d.ts +4 -2
  108. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue +6 -9
  109. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.d.ts +4 -1
  110. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.js +3 -4
  111. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.d.vue.ts +4 -2
  112. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue +61 -22
  113. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue.d.ts +4 -2
  114. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue +6 -9
  115. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.d.ts +4 -1
  116. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.js +3 -4
  117. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +4 -2
  118. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue +67 -23
  119. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +4 -2
  120. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue +6 -9
  121. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +4 -1
  122. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -4
  123. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +4 -2
  124. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue +67 -23
  125. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +4 -2
  126. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue +6 -9
  127. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.d.ts +4 -1
  128. package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.js +2 -4
  129. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/config.vue +67 -32
  130. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/runtime.vue +14 -8
  131. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.d.ts +4 -1
  132. package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.js +2 -5
  133. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/config.d.vue.ts +10 -0
  134. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/config.vue +752 -0
  135. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/config.vue.d.ts +10 -0
  136. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/runtime.d.vue.ts +9 -0
  137. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/runtime.vue +149 -0
  138. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/runtime.vue.d.ts +9 -0
  139. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.d.ts +90 -0
  140. package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.js +119 -0
  141. package/dist/runtime/components/table/index.vue +46 -7
  142. package/dist/runtime/components/table/utils/runtime.d.ts +1 -0
  143. package/dist/runtime/components/table/utils/runtime.js +5 -0
  144. package/dist/runtime/components/table/utils/shared.d.ts +3 -1
  145. package/dist/runtime/components/table/utils/shared.js +17 -5
  146. package/dist/runtime/components/ui/date-picker/DatePicker.d.vue.ts +1 -0
  147. package/dist/runtime/components/ui/date-picker/DatePicker.vue +3 -0
  148. package/dist/runtime/components/ui/date-picker/DatePicker.vue.d.ts +1 -0
  149. package/dist/runtime/components/ui/date-range-picker/DateRangePicker.d.vue.ts +1 -0
  150. package/dist/runtime/components/ui/date-range-picker/DateRangePicker.vue +2 -0
  151. package/dist/runtime/components/ui/date-range-picker/DateRangePicker.vue.d.ts +1 -0
  152. package/package.json +1 -1
  153. package/dist/preview/assets/index-Cc4BT5dc.css +0 -1
  154. package/dist/preview/assets/index-DdySlgoq.js +0 -763
  155. package/dist/preview/assets/index-j5Pri4vN.js +0 -1
@@ -0,0 +1,752 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { Icon } from "@iconify/vue";
4
+ import { format as formatDate } from "date-fns";
5
+ import { ExpressionEditor } from "../../../../ui/expression-editor";
6
+ import { Separator } from "../../../../ui/separator";
7
+ import { Switch } from "../../../../ui/switch";
8
+ import { Button } from "../../../../ui/button";
9
+ import { Field, FieldLabel } from "../../../../ui/field";
10
+ import { IconPicker } from "../../../../ui/icon-picker";
11
+ import { Locale } from "../../../../ui/locale";
12
+ import {
13
+ InputGroup,
14
+ InputGroupAddon,
15
+ InputGroupButton,
16
+ InputGroupInput,
17
+ InputGroupNumberField,
18
+ InputGroupText
19
+ } from "../../../../ui/input-group";
20
+ import {
21
+ DropdownMenu,
22
+ DropdownMenuContent,
23
+ DropdownMenuItem,
24
+ DropdownMenuTrigger
25
+ } from "../../../../ui/dropdown-menu";
26
+ import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
27
+ import { Markdown } from "../../../../ui/markdown";
28
+ import DerivedValueEditor from "../../../../form/DerivedValueEditor.vue";
29
+ import { presetSchema, schema } from "./schema";
30
+ defineOptions({ name: "ShwfedTableDateRangeInputRendererConfig" });
31
+ const value = defineModel({ type: Object, ...{ required: true } });
32
+ const fieldSchema = schema(() => {
33
+ });
34
+ const fieldTitle = (field) => getStructFieldTitle(fieldSchema, field) ?? field;
35
+ const fieldDescription = (field) => getStructFieldDescription(fieldSchema, field);
36
+ const presetFieldSchema = presetSchema(() => {
37
+ });
38
+ const presetFieldTitle = (field) => getStructFieldTitle(presetFieldSchema, field) ?? field;
39
+ const presetFieldDescription = (field) => getStructFieldDescription(presetFieldSchema, field);
40
+ const ALIGN_OPTIONS = [
41
+ { value: "left", label: "\u5DE6\u5BF9\u9F50", icon: "fluent:text-align-left-20-regular" },
42
+ { value: "center", label: "\u5C45\u4E2D", icon: "fluent:text-align-center-20-regular" },
43
+ { value: "right", label: "\u53F3\u5BF9\u9F50", icon: "fluent:text-align-right-20-regular" }
44
+ ];
45
+ const currentAlignIcon = computed(
46
+ () => (ALIGN_OPTIONS.find((o) => o.value === (value.value.align ?? "left")) ?? ALIGN_OPTIONS[0]).icon
47
+ );
48
+ const ROW_VARS = {
49
+ row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
50
+ index: { type: "number", label: "\u884C\u7D22\u5F15" }
51
+ };
52
+ const presets = computed(() => value.value.presets ?? []);
53
+ function newId() {
54
+ return typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
55
+ const r = Math.random() * 16 | 0;
56
+ const v = c === "x" ? r : r & 3 | 8;
57
+ return v.toString(16);
58
+ });
59
+ }
60
+ function newPreset() {
61
+ return { id: newId(), label: [{ locale: "zh", message: "" }], start: "", end: "" };
62
+ }
63
+ function patchPreset(index, patch) {
64
+ const next = [...value.value.presets ?? []];
65
+ const cur = next[index];
66
+ if (!cur) return;
67
+ next[index] = { ...cur, ...patch };
68
+ value.value = { ...value.value, presets: next };
69
+ }
70
+ function addPreset() {
71
+ value.value = { ...value.value, presets: [...value.value.presets ?? [], newPreset()] };
72
+ }
73
+ function removePreset(index) {
74
+ const next = [...value.value.presets ?? []];
75
+ next.splice(index, 1);
76
+ value.value = { ...value.value, presets: next };
77
+ }
78
+ function setPresetLabel(index, label) {
79
+ patchPreset(index, { label });
80
+ }
81
+ function setPresetStart(index, expr) {
82
+ patchPreset(index, { start: expr });
83
+ }
84
+ function setPresetEnd(index, expr) {
85
+ patchPreset(index, { end: expr });
86
+ }
87
+ const bindingMode = computed(
88
+ () => Array.isArray(value.value.binding) ? "split" : "single"
89
+ );
90
+ const singlePathText = computed({
91
+ get: () => typeof value.value.binding === "string" ? value.value.binding : "",
92
+ set: (next) => {
93
+ const trimmed = next.trim();
94
+ if (trimmed.length === 0) {
95
+ const { binding: _drop, ...rest } = value.value;
96
+ value.value = rest;
97
+ } else {
98
+ value.value = { ...value.value, binding: trimmed };
99
+ }
100
+ }
101
+ });
102
+ const splitStartText = computed(
103
+ () => Array.isArray(value.value.binding) ? value.value.binding[0] : ""
104
+ );
105
+ const splitEndText = computed(
106
+ () => Array.isArray(value.value.binding) ? value.value.binding[1] : ""
107
+ );
108
+ function setSplitStart(next) {
109
+ const cur = Array.isArray(value.value.binding) ? value.value.binding : ["", ""];
110
+ value.value = { ...value.value, binding: [next.trim(), cur[1]] };
111
+ }
112
+ function setSplitEnd(next) {
113
+ const cur = Array.isArray(value.value.binding) ? value.value.binding : ["", ""];
114
+ value.value = { ...value.value, binding: [cur[0], next.trim()] };
115
+ }
116
+ function toggleBindingMode() {
117
+ if (bindingMode.value === "single") {
118
+ value.value = { ...value.value, binding: ["", ""] };
119
+ } else {
120
+ value.value = { ...value.value, binding: "" };
121
+ }
122
+ }
123
+ const formatText = computed({
124
+ get: () => value.value.format ?? "",
125
+ set: (v) => {
126
+ const trimmed = v.trim();
127
+ if (trimmed === "") {
128
+ const { format: _drop, ...rest } = value.value;
129
+ value.value = rest;
130
+ } else {
131
+ value.value = { ...value.value, format: trimmed };
132
+ }
133
+ }
134
+ });
135
+ const valueFormatText = computed({
136
+ get: () => value.value.valueFormat ?? "",
137
+ set: (v) => {
138
+ const trimmed = v.trim();
139
+ if (trimmed === "") {
140
+ const { valueFormat: _drop, ...rest } = value.value;
141
+ value.value = rest;
142
+ } else {
143
+ value.value = { ...value.value, valueFormat: trimmed };
144
+ }
145
+ }
146
+ });
147
+ function setSeparatorIcon(next) {
148
+ const trimmed = next.trim();
149
+ if (trimmed.length === 0) {
150
+ const { rangeSeparatorIcon: _drop, ...rest } = value.value;
151
+ value.value = rest;
152
+ } else {
153
+ value.value = { ...value.value, rangeSeparatorIcon: trimmed };
154
+ }
155
+ }
156
+ function setNumberOfMonths(next) {
157
+ if (next == null || !Number.isInteger(next) || next <= 0) {
158
+ const { numberOfMonths: _drop, ...rest } = value.value;
159
+ value.value = rest;
160
+ return;
161
+ }
162
+ value.value = { ...value.value, numberOfMonths: next };
163
+ }
164
+ function previewFormat(fmt) {
165
+ if (!fmt) return "";
166
+ try {
167
+ return formatDate(/* @__PURE__ */ new Date(), fmt);
168
+ } catch {
169
+ return "(\u65E0\u6548\u683C\u5F0F)";
170
+ }
171
+ }
172
+ const formatExample = computed(() => previewFormat(value.value.format ?? ""));
173
+ const valueFormatExample = computed(() => previewFormat(value.value.valueFormat ?? ""));
174
+ function onHiddenChange(v) {
175
+ if (v) {
176
+ value.value = { ...value.value, hidden: true };
177
+ } else {
178
+ const { hidden: _drop, ...rest } = value.value;
179
+ value.value = rest;
180
+ }
181
+ }
182
+ const disabledModel = computed({
183
+ get: () => value.value.disabled ?? "",
184
+ set: (v) => {
185
+ if (v === "") {
186
+ const { disabled: _drop, ...rest } = value.value;
187
+ value.value = rest;
188
+ } else {
189
+ value.value = { ...value.value, disabled: v };
190
+ }
191
+ }
192
+ });
193
+ const readonlyModel = computed({
194
+ get: () => value.value.readonly ?? "",
195
+ set: (v) => {
196
+ if (v === "") {
197
+ const { readonly: _drop, ...rest } = value.value;
198
+ value.value = rest;
199
+ } else {
200
+ value.value = { ...value.value, readonly: v };
201
+ }
202
+ }
203
+ });
204
+ const derivedModel = computed({
205
+ get: () => value.value.derived,
206
+ set: (v) => {
207
+ if (v == null) {
208
+ const { derived: _drop, ...rest } = value.value;
209
+ value.value = rest;
210
+ } else {
211
+ value.value = { ...value.value, derived: v };
212
+ }
213
+ }
214
+ });
215
+ </script>
216
+
217
+ <template>
218
+ <div class="space-y-5">
219
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4">
220
+ <Field orientation="vertical">
221
+ <FieldLabel class="text-xs text-zinc-500">
222
+ <template
223
+ v-if="fieldDescription('title')"
224
+ #tooltip
225
+ >
226
+ <Markdown
227
+ :source="fieldDescription('title')"
228
+ block
229
+ class="prose prose-sm prose-zinc"
230
+ />
231
+ </template>
232
+ {{ fieldTitle("title") }}
233
+ </FieldLabel>
234
+ <Locale
235
+ :model-value="value.title"
236
+ @update:model-value="(v) => value = { ...value, title: v }"
237
+ />
238
+ </Field>
239
+ <Field orientation="vertical">
240
+ <FieldLabel class="text-xs text-zinc-500">
241
+ <template
242
+ v-if="fieldDescription('tooltip')"
243
+ #tooltip
244
+ >
245
+ <Markdown
246
+ :source="fieldDescription('tooltip')"
247
+ block
248
+ class="prose prose-sm prose-zinc"
249
+ />
250
+ </template>
251
+ {{ fieldTitle("tooltip") }}
252
+ </FieldLabel>
253
+ <Locale
254
+ :model-value="value.tooltip"
255
+ markdown
256
+ @update:model-value="(v) => value = { ...value, tooltip: v }"
257
+ />
258
+ </Field>
259
+ </div>
260
+ <div class="grid grid-cols-2 gap-x-6 gap-y-4">
261
+ <Field
262
+ orientation="vertical"
263
+ class="col-span-2"
264
+ >
265
+ <FieldLabel class="text-xs text-zinc-500">
266
+ <template #tooltip>
267
+ <Markdown
268
+ source="单元格读写的 `dot-prop` 路径。单路径模式读写 `[start, end]` 字符串数组;拆分模式分别读写起始与结束两端"
269
+ block
270
+ class="prose prose-sm prose-zinc"
271
+ />
272
+ </template>
273
+ {{ fieldTitle("binding") }}
274
+ </FieldLabel>
275
+ <template v-if="bindingMode === 'single'">
276
+ <InputGroup>
277
+ <InputGroupInput
278
+ v-model="singlePathText"
279
+ placeholder="例:event.range"
280
+ class="font-mono"
281
+ />
282
+ <InputGroupAddon align="inline-end">
283
+ <InputGroupButton
284
+ size="icon-xs"
285
+ aria-label="拆分起止绑定路径"
286
+ @click="toggleBindingMode"
287
+ >
288
+ <Icon icon="fluent:split-horizontal-20-regular" />
289
+ </InputGroupButton>
290
+ </InputGroupAddon>
291
+ </InputGroup>
292
+ </template>
293
+ <template v-else>
294
+ <div class="grid grid-cols-2 gap-2">
295
+ <InputGroup>
296
+ <InputGroupAddon align="inline-start">
297
+ <InputGroupText class="text-xs text-zinc-400">
298
+
299
+ </InputGroupText>
300
+ </InputGroupAddon>
301
+ <InputGroupInput
302
+ :model-value="splitStartText"
303
+ placeholder="例:event.start"
304
+ class="font-mono"
305
+ @update:model-value="(v) => setSplitStart(String(v ?? ''))"
306
+ />
307
+ </InputGroup>
308
+ <InputGroup>
309
+ <InputGroupAddon align="inline-start">
310
+ <InputGroupText class="text-xs text-zinc-400">
311
+
312
+ </InputGroupText>
313
+ </InputGroupAddon>
314
+ <InputGroupInput
315
+ :model-value="splitEndText"
316
+ placeholder="例:event.end"
317
+ class="font-mono"
318
+ @update:model-value="(v) => setSplitEnd(String(v ?? ''))"
319
+ />
320
+ <InputGroupAddon align="inline-end">
321
+ <InputGroupButton
322
+ size="icon-xs"
323
+ aria-label="合并起止绑定路径"
324
+ @click="toggleBindingMode"
325
+ >
326
+ <Icon icon="fluent:merge-vertical-20-regular" />
327
+ </InputGroupButton>
328
+ </InputGroupAddon>
329
+ </InputGroup>
330
+ </div>
331
+ </template>
332
+ </Field>
333
+ <Field orientation="vertical">
334
+ <FieldLabel class="text-xs text-zinc-500">
335
+ <template
336
+ v-if="fieldDescription('startPlaceholder')"
337
+ #tooltip
338
+ >
339
+ <Markdown
340
+ :source="fieldDescription('startPlaceholder')"
341
+ block
342
+ class="prose prose-sm prose-zinc"
343
+ />
344
+ </template>
345
+ {{ fieldTitle("startPlaceholder") }}
346
+ </FieldLabel>
347
+ <Locale
348
+ :model-value="value.startPlaceholder"
349
+ @update:model-value="(v) => value = { ...value, startPlaceholder: v }"
350
+ />
351
+ </Field>
352
+ <Field orientation="vertical">
353
+ <FieldLabel class="text-xs text-zinc-500">
354
+ <template
355
+ v-if="fieldDescription('endPlaceholder')"
356
+ #tooltip
357
+ >
358
+ <Markdown
359
+ :source="fieldDescription('endPlaceholder')"
360
+ block
361
+ class="prose prose-sm prose-zinc"
362
+ />
363
+ </template>
364
+ {{ fieldTitle("endPlaceholder") }}
365
+ </FieldLabel>
366
+ <Locale
367
+ :model-value="value.endPlaceholder"
368
+ @update:model-value="(v) => value = { ...value, endPlaceholder: v }"
369
+ />
370
+ </Field>
371
+ <Field orientation="vertical">
372
+ <FieldLabel class="text-xs text-zinc-500">
373
+ <template #tooltip>
374
+ <Markdown
375
+ :source="fieldDescription('format') ?? '\u8F93\u5165\u6846\u4E2D\u5C55\u793A\u65E5\u671F\u7684 `date-fns` \u683C\u5F0F\u4E32'"
376
+ block
377
+ class="prose prose-sm prose-zinc"
378
+ />
379
+ </template>
380
+ {{ fieldTitle("format") }}
381
+ </FieldLabel>
382
+ <InputGroup>
383
+ <InputGroupInput
384
+ v-model="formatText"
385
+ placeholder="例:yyyy-MM-dd"
386
+ class="font-mono"
387
+ />
388
+ <InputGroupAddon
389
+ v-if="formatExample"
390
+ align="inline-end"
391
+ >
392
+ <InputGroupText class="text-xs text-zinc-400">
393
+ {{ formatExample }}
394
+ </InputGroupText>
395
+ </InputGroupAddon>
396
+ </InputGroup>
397
+ </Field>
398
+ <Field orientation="vertical">
399
+ <FieldLabel class="text-xs text-zinc-500">
400
+ <template #tooltip>
401
+ <Markdown
402
+ :source="fieldDescription('valueFormat') ?? '\u5199\u5165\u884C\u6570\u636E\u7684 `date-fns` \u683C\u5F0F\u4E32'"
403
+ block
404
+ class="prose prose-sm prose-zinc"
405
+ />
406
+ </template>
407
+ {{ fieldTitle("valueFormat") }}
408
+ </FieldLabel>
409
+ <InputGroup>
410
+ <InputGroupInput
411
+ v-model="valueFormatText"
412
+ placeholder="例:yyyy-MM-dd"
413
+ class="font-mono"
414
+ />
415
+ <InputGroupAddon
416
+ v-if="valueFormatExample"
417
+ align="inline-end"
418
+ >
419
+ <InputGroupText class="text-xs text-zinc-400">
420
+ {{ valueFormatExample }}
421
+ </InputGroupText>
422
+ </InputGroupAddon>
423
+ </InputGroup>
424
+ </Field>
425
+ <Field orientation="vertical">
426
+ <FieldLabel class="text-xs text-zinc-500">
427
+ <template #tooltip>
428
+ <Markdown
429
+ :source="fieldDescription('rangeSeparatorIcon') ?? '\u8303\u56F4\u4E24\u7AEF\u4E4B\u95F4\u5206\u9694\u56FE\u6807\u7684 Iconify \u540D\u79F0'"
430
+ block
431
+ class="prose prose-sm prose-zinc"
432
+ />
433
+ </template>
434
+ {{ fieldTitle("rangeSeparatorIcon") }}
435
+ </FieldLabel>
436
+ <IconPicker
437
+ :model-value="value.rangeSeparatorIcon ?? ''"
438
+ placeholder="例:lucide:arrow-right"
439
+ @update:model-value="setSeparatorIcon"
440
+ />
441
+ </Field>
442
+ <Field orientation="vertical">
443
+ <FieldLabel class="text-xs text-zinc-500">
444
+ <template #tooltip>
445
+ <Markdown
446
+ :source="fieldDescription('numberOfMonths') ?? '\u65E5\u5386\u9762\u677F\u4E2D\u5E76\u6392\u663E\u793A\u7684\u6708\u4EFD\u6570'"
447
+ block
448
+ class="prose prose-sm prose-zinc"
449
+ />
450
+ </template>
451
+ {{ fieldTitle("numberOfMonths") }}
452
+ </FieldLabel>
453
+ <InputGroup>
454
+ <InputGroupNumberField
455
+ :model-value="value.numberOfMonths"
456
+ :min="1"
457
+ :step="1"
458
+ @update:model-value="setNumberOfMonths"
459
+ />
460
+ </InputGroup>
461
+ </Field>
462
+ <Field orientation="vertical">
463
+ <FieldLabel class="text-xs text-zinc-500">
464
+ <template
465
+ v-if="fieldDescription('size')"
466
+ #tooltip
467
+ >
468
+ <Markdown
469
+ :source="fieldDescription('size')"
470
+ block
471
+ class="prose prose-sm prose-zinc"
472
+ />
473
+ </template>
474
+ {{ fieldTitle("size") }}
475
+ </FieldLabel>
476
+ <InputGroup>
477
+ <InputGroupAddon align="inline-start">
478
+ <DropdownMenu>
479
+ <DropdownMenuTrigger as-child>
480
+ <InputGroupButton
481
+ variant="ghost"
482
+ size="xs"
483
+ :title="fieldTitle('align')"
484
+ >
485
+ <Icon :icon="currentAlignIcon" />
486
+ </InputGroupButton>
487
+ </DropdownMenuTrigger>
488
+ <DropdownMenuContent align="start">
489
+ <DropdownMenuItem
490
+ v-for="opt in ALIGN_OPTIONS"
491
+ :key="opt.value"
492
+ @select="value = { ...value, align: opt.value }"
493
+ >
494
+ <Icon :icon="opt.icon" />
495
+ {{ opt.label }}
496
+ </DropdownMenuItem>
497
+ </DropdownMenuContent>
498
+ </DropdownMenu>
499
+ </InputGroupAddon>
500
+ <InputGroupNumberField
501
+ :model-value="value.size"
502
+ :disabled="value.grow"
503
+ :min="0"
504
+ @update:model-value="(v) => value = { ...value, size: v }"
505
+ />
506
+ <InputGroupAddon align="inline-end">
507
+ <InputGroupButton
508
+ :variant="value.grow ? 'primary' : 'ghost'"
509
+ size="xs"
510
+ @click="value = { ...value, grow: !value.grow }"
511
+ >
512
+ <Icon :icon="value.grow ? 'fluent:lock-closed-20-regular' : 'fluent:arrow-autofit-width-20-regular'" />
513
+ {{ fieldTitle("grow") }}
514
+ </InputGroupButton>
515
+ </InputGroupAddon>
516
+ </InputGroup>
517
+ </Field>
518
+ <Field orientation="vertical">
519
+ <FieldLabel class="text-xs text-zinc-500">
520
+ <template
521
+ v-if="fieldDescription('disabled')"
522
+ #tooltip
523
+ >
524
+ <Markdown
525
+ :source="fieldDescription('disabled')"
526
+ block
527
+ class="prose prose-sm prose-zinc"
528
+ />
529
+ </template>
530
+ {{ fieldTitle("disabled") }}
531
+ </FieldLabel>
532
+ <ExpressionEditor
533
+ v-model="disabledModel"
534
+ placeholder="例:row.locked"
535
+ result-type="bool"
536
+ :extra-vars="ROW_VARS"
537
+ />
538
+ </Field>
539
+ <Field orientation="vertical">
540
+ <FieldLabel class="text-xs text-zinc-500">
541
+ <template
542
+ v-if="fieldDescription('readonly')"
543
+ #tooltip
544
+ >
545
+ <Markdown
546
+ :source="fieldDescription('readonly')"
547
+ block
548
+ class="prose prose-sm prose-zinc"
549
+ />
550
+ </template>
551
+ {{ fieldTitle("readonly") }}
552
+ </FieldLabel>
553
+ <ExpressionEditor
554
+ v-model="readonlyModel"
555
+ placeholder="例:row.id != null"
556
+ result-type="bool"
557
+ :extra-vars="ROW_VARS"
558
+ />
559
+ </Field>
560
+ <Field
561
+ orientation="vertical"
562
+ class="col-span-2"
563
+ >
564
+ <FieldLabel class="text-xs text-zinc-500">
565
+ <template
566
+ v-if="fieldDescription('derived')"
567
+ #tooltip
568
+ >
569
+ <Markdown
570
+ :source="fieldDescription('derived')"
571
+ block
572
+ class="prose prose-sm prose-zinc"
573
+ />
574
+ </template>
575
+ {{ fieldTitle("derived") }}
576
+ </FieldLabel>
577
+ <DerivedValueEditor
578
+ v-model="derivedModel"
579
+ result-type="dyn"
580
+ placeholder="例:[row.startDate, row.endDate]"
581
+ />
582
+ </Field>
583
+ </div>
584
+ <Field orientation="vertical">
585
+ <FieldLabel class="text-xs text-zinc-500">
586
+ <template
587
+ v-if="fieldDescription('presets')"
588
+ #tooltip
589
+ >
590
+ <Markdown
591
+ :source="fieldDescription('presets')"
592
+ block
593
+ class="prose prose-sm prose-zinc"
594
+ />
595
+ </template>
596
+ {{ fieldTitle("presets") }}
597
+ </FieldLabel>
598
+ <div class="flex flex-col gap-3">
599
+ <div
600
+ v-for="(preset, index) in presets"
601
+ :key="preset.id"
602
+ data-slot="date-range-input-preset"
603
+ class="relative pt-8 grid grid-cols-3 gap-3 rounded border border-zinc-200 bg-zinc-50/40 p-3"
604
+ >
605
+ <InputGroupButton
606
+ variant="destructive"
607
+ size="icon-xs"
608
+ data-slot="date-range-input-preset-delete"
609
+ aria-label="删除预设"
610
+ class="absolute right-2 top-2 z-10"
611
+ @click="removePreset(index)"
612
+ >
613
+ <Icon icon="fluent:delete-20-regular" />
614
+ </InputGroupButton>
615
+ <Field orientation="vertical">
616
+ <FieldLabel class="text-xs text-zinc-500">
617
+ <template
618
+ v-if="presetFieldDescription('label')"
619
+ #tooltip
620
+ >
621
+ <Markdown
622
+ :source="presetFieldDescription('label')"
623
+ block
624
+ class="prose prose-sm prose-zinc"
625
+ />
626
+ </template>
627
+ {{ presetFieldTitle("label") }}
628
+ </FieldLabel>
629
+ <Locale
630
+ :model-value="preset.label"
631
+ @update:model-value="(v) => setPresetLabel(index, v)"
632
+ />
633
+ </Field>
634
+ <Field orientation="vertical">
635
+ <FieldLabel class="text-xs text-zinc-500">
636
+ <template
637
+ v-if="presetFieldDescription('start')"
638
+ #tooltip
639
+ >
640
+ <Markdown
641
+ :source="presetFieldDescription('start')"
642
+ block
643
+ class="prose prose-sm prose-zinc"
644
+ />
645
+ </template>
646
+ {{ presetFieldTitle("start") }}
647
+ </FieldLabel>
648
+ <ExpressionEditor
649
+ :model-value="preset.start"
650
+ placeholder="例:now.offset(-7, &quot;days&quot;)"
651
+ result-type="Date"
652
+ class="min-h-10"
653
+ :extra-vars="ROW_VARS"
654
+ @update:model-value="(v) => setPresetStart(index, v)"
655
+ />
656
+ </Field>
657
+ <Field orientation="vertical">
658
+ <FieldLabel class="text-xs text-zinc-500">
659
+ <template
660
+ v-if="presetFieldDescription('end')"
661
+ #tooltip
662
+ >
663
+ <Markdown
664
+ :source="presetFieldDescription('end')"
665
+ block
666
+ class="prose prose-sm prose-zinc"
667
+ />
668
+ </template>
669
+ {{ presetFieldTitle("end") }}
670
+ </FieldLabel>
671
+ <ExpressionEditor
672
+ :model-value="preset.end"
673
+ placeholder="例:now"
674
+ result-type="Date"
675
+ class="min-h-10"
676
+ :extra-vars="ROW_VARS"
677
+ @update:model-value="(v) => setPresetEnd(index, v)"
678
+ />
679
+ </Field>
680
+ </div>
681
+ <Button
682
+ type="button"
683
+ data-slot="date-range-input-add-preset"
684
+ class="w-full justify-center"
685
+ @click="addPreset"
686
+ >
687
+ <Icon icon="fluent:add-20-regular" />
688
+ <span>增加快捷选项</span>
689
+ </Button>
690
+ </div>
691
+ </Field>
692
+ <Separator />
693
+ <div class="flex flex-wrap gap-x-8 gap-y-3">
694
+ <Field
695
+ orientation="vertical"
696
+ class="w-full max-w-xs"
697
+ >
698
+ <FieldLabel class="text-xs text-zinc-500">
699
+ <template
700
+ v-if="fieldDescription('enableSorting')"
701
+ #tooltip
702
+ >
703
+ <Markdown
704
+ :source="fieldDescription('enableSorting')"
705
+ block
706
+ class="prose prose-sm prose-zinc"
707
+ />
708
+ </template>
709
+ {{ fieldTitle("enableSorting") }}
710
+ </FieldLabel>
711
+ <InputGroup>
712
+ <InputGroupInput
713
+ :model-value="value.sortKey"
714
+ placeholder="例:created_at"
715
+ @update:model-value="(v) => value = { ...value, sortKey: v || void 0 }"
716
+ />
717
+ <InputGroupAddon align="inline-end">
718
+ <InputGroupButton
719
+ :variant="value.enableSorting ? 'primary' : 'ghost'"
720
+ size="xs"
721
+ @click="value = { ...value, enableSorting: !value.enableSorting }"
722
+ >
723
+ <Icon :icon="value.enableSorting ? 'fluent:arrow-sort-up-16-regular' : 'fluent:arrow-sort-16-regular'" />
724
+ {{ fieldTitle("enableSorting") }}
725
+ </InputGroupButton>
726
+ </InputGroupAddon>
727
+ </InputGroup>
728
+ </Field>
729
+ <Field orientation="vertical">
730
+ <FieldLabel class="text-xs text-zinc-500">
731
+ <template
732
+ v-if="fieldDescription('hidden')"
733
+ #tooltip
734
+ >
735
+ <Markdown
736
+ :source="fieldDescription('hidden')"
737
+ block
738
+ class="prose prose-sm prose-zinc"
739
+ />
740
+ </template>
741
+ {{ fieldTitle("hidden") }}
742
+ </FieldLabel>
743
+ <div>
744
+ <Switch
745
+ :model-value="value.hidden ?? false"
746
+ @update:model-value="onHiddenChange"
747
+ />
748
+ </div>
749
+ </Field>
750
+ </div>
751
+ </div>
752
+ </template>