@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,9 @@
1
+ import type { CellContext } from '@tanstack/vue-table';
2
+ import type { Value } from './schema.js';
3
+ type __VLS_Props = {
4
+ column: Value;
5
+ ctx: CellContext<unknown, unknown>;
6
+ };
7
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -0,0 +1,465 @@
1
+ <script setup>
2
+ import { Icon } from "@iconify/vue";
3
+ import { Effect, Fiber, Option } from "effect";
4
+ import { computed, ref, shallowRef, watch } from "vue";
5
+ import { useI18n } from "vue-i18n";
6
+ import { cel as _rawCel } from "../../../../../utils/cel";
7
+ import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
8
+ import { useFormReadonly } from "../../../../form/utils/readonly";
9
+ import { publishSelection } from "../../../../../utils/selections-registry";
10
+ import { getLocalizedText } from "../../../../../share/locale";
11
+ import { fetchJsonOption } from "../../../../../share/request";
12
+ import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "../../../../ui/input-group";
13
+ import { Markdown } from "../../../../ui/markdown";
14
+ import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../../../../ui/popover";
15
+ import { Skeleton } from "../../../../ui/skeleton";
16
+ import { Tree as UiTree } from "../../../../ui/tree";
17
+ import { useFormState } from "../../../../form/utils/state";
18
+ import { interpolateMarkdown } from "../../../utils/runtime";
19
+ import { useSharedFetchLayer } from "../../../utils/shared-fetch";
20
+ import {
21
+ findWrappedPath,
22
+ getWrappedChildren,
23
+ wrapStructuralAll
24
+ } from "../tree-combobox-shared";
25
+ defineOptions({ name: "ShwfedTableTreeComboboxSingleRendererRuntime" });
26
+ const props = defineProps({
27
+ column: { type: null, required: true },
28
+ ctx: { type: Object, required: true }
29
+ });
30
+ const { locale, t } = useI18n({
31
+ inheritLocale: true,
32
+ messages: {
33
+ zh: {
34
+ "tree-combobox-single-placeholder": "\u8BF7\u9009\u62E9",
35
+ "tree-combobox-single-search-placeholder": "\u641C\u7D22\u2026",
36
+ "tree-combobox-single-empty": "\u65E0\u53EF\u9009\u9879",
37
+ "tree-combobox-single-load-error": "\u52A0\u8F7D\u5931\u8D25",
38
+ "tree-combobox-single-retry": "\u91CD\u8BD5"
39
+ },
40
+ en: {
41
+ "tree-combobox-single-placeholder": "Select\u2026",
42
+ "tree-combobox-single-search-placeholder": "Search\u2026",
43
+ "tree-combobox-single-empty": "No options",
44
+ "tree-combobox-single-load-error": "Failed to load",
45
+ "tree-combobox-single-retry": "Retry"
46
+ },
47
+ ja: {
48
+ "tree-combobox-single-placeholder": "\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",
49
+ "tree-combobox-single-search-placeholder": "\u691C\u7D22\u2026",
50
+ "tree-combobox-single-empty": "\u9078\u629E\u80A2\u306A\u3057",
51
+ "tree-combobox-single-load-error": "\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
52
+ "tree-combobox-single-retry": "\u518D\u8A66\u884C"
53
+ }
54
+ }
55
+ });
56
+ const formState = useFormState();
57
+ const inherited = injectCELContext();
58
+ const $cel = (expression, context) => _rawCel(expression, { ...celBindings(inherited), ...context });
59
+ const sharedFetchLayer = useSharedFetchLayer();
60
+ const row = computed(() => props.ctx.row.original);
61
+ const rowIndex = computed(() => props.ctx.row.index);
62
+ const placeholderText = computed(
63
+ () => props.column.placeholder ? getLocalizedText(props.column.placeholder, locale.value) : t("tree-combobox-single-placeholder")
64
+ );
65
+ function evalBool(expression, label) {
66
+ if (!expression) return false;
67
+ try {
68
+ return Effect.runSync($cel(expression, { row: row.value, index: rowIndex.value })) === true;
69
+ } catch (e) {
70
+ console.error(`[shwfed-table] tree-combobox-single ${label} failed`, e);
71
+ return false;
72
+ }
73
+ }
74
+ const isHidden = computed(() => evalBool(props.column.hidden, "hidden"));
75
+ const isDisabled = computed(() => evalBool(props.column.disabled, "disabled"));
76
+ const formReadonly = useFormReadonly();
77
+ const isReadonly = computed(
78
+ () => props.column.readonly != null ? evalBool(props.column.readonly, "readonly") : formReadonly.value
79
+ );
80
+ const effectiveReadonly = computed(
81
+ () => isReadonly.value || props.column.derived?.mode === "formula"
82
+ );
83
+ const model = computed({
84
+ get: () => {
85
+ const raw = formState.getAt(props.column.binding);
86
+ if (raw == null) return void 0;
87
+ return String(raw);
88
+ },
89
+ set: (next) => {
90
+ formState.setAt(props.column.binding, next == null ? void 0 : String(next));
91
+ }
92
+ });
93
+ function nodeCtx(raw) {
94
+ return { row: row.value, index: rowIndex.value, node: raw };
95
+ }
96
+ function nodeKey(raw) {
97
+ try {
98
+ return String(Effect.runSync($cel(props.column.nodeKey, nodeCtx(raw))));
99
+ } catch (e) {
100
+ console.error("[shwfed-table] tree-combobox-single nodeKey failed", e);
101
+ return "";
102
+ }
103
+ }
104
+ function nodeChildrenList(raw) {
105
+ let v;
106
+ try {
107
+ v = Effect.runSync($cel(props.column.nodeChildren, nodeCtx(raw)));
108
+ } catch (e) {
109
+ console.error("[shwfed-table] tree-combobox-single nodeChildren failed", e);
110
+ return void 0;
111
+ }
112
+ if (v == null) return void 0;
113
+ if (!Array.isArray(v)) return void 0;
114
+ return v;
115
+ }
116
+ function safeInterpolate(tpl, raw) {
117
+ try {
118
+ return interpolateMarkdown(tpl, $cel, nodeCtx(raw));
119
+ } catch (e) {
120
+ console.error("[shwfed-table] tree-combobox-single node interpolation failed", e);
121
+ return tpl;
122
+ }
123
+ }
124
+ function wrappedLabelText(w) {
125
+ try {
126
+ const raw = Effect.runSync($cel(props.column.nodeLabel, nodeCtx(w.raw)));
127
+ return raw == null ? "" : String(raw);
128
+ } catch (e) {
129
+ console.error("[shwfed-table] tree-combobox-single nodeLabel failed", e);
130
+ return "";
131
+ }
132
+ }
133
+ function wrappedTooltipText(w) {
134
+ if (!props.column.nodeTooltip) return void 0;
135
+ const tpl = getLocalizedText(props.column.nodeTooltip, locale.value);
136
+ return tpl ? safeInterpolate(tpl, w.raw) : void 0;
137
+ }
138
+ function wrappedKeywords(w) {
139
+ const expr = props.column.keywords;
140
+ if (!expr) return [];
141
+ let v;
142
+ try {
143
+ v = Effect.runSync($cel(expr, nodeCtx(w.raw)));
144
+ } catch (e) {
145
+ console.error("[shwfed-table] tree-combobox-single keywords failed", e);
146
+ return [];
147
+ }
148
+ if (!Array.isArray(v)) return [];
149
+ return v.filter((k) => k != null).map((k) => String(k).trim().toLowerCase()).filter((k) => k.length > 0);
150
+ }
151
+ function wrappedSelectable(w, _depth) {
152
+ if (isDisabled.value) return false;
153
+ const expr = props.column.nodeSelectable;
154
+ if (!expr) return true;
155
+ try {
156
+ return Effect.runSync($cel(expr, nodeCtx(w.raw)));
157
+ } catch {
158
+ return false;
159
+ }
160
+ }
161
+ const rawRoots = shallowRef([]);
162
+ const loading = ref(false);
163
+ const fetchError = ref(null);
164
+ async function fetchTree() {
165
+ const dataSource = props.column.dataSource;
166
+ if (!dataSource) {
167
+ rawRoots.value = [];
168
+ return;
169
+ }
170
+ const effect = Effect.gen(function* () {
171
+ let jsonOpt = Option.none();
172
+ if (dataSource.request) {
173
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
174
+ row: row.value,
175
+ index: rowIndex.value
176
+ }));
177
+ }
178
+ const dataRaw = yield* $cel(dataSource.data, {
179
+ row: row.value,
180
+ index: rowIndex.value,
181
+ json: jsonOpt
182
+ });
183
+ return Array.isArray(dataRaw) ? dataRaw : [];
184
+ });
185
+ const program = Effect.gen(function* () {
186
+ const showMaskFiber = yield* Effect.fork(
187
+ Effect.sync(() => {
188
+ loading.value = true;
189
+ }).pipe(Effect.delay("30 millis"))
190
+ );
191
+ return yield* Effect.ensuring(effect, Fiber.interrupt(showMaskFiber));
192
+ }).pipe(
193
+ Effect.ensuring(Effect.sync(() => {
194
+ loading.value = false;
195
+ }))
196
+ );
197
+ try {
198
+ const result = await Effect.runPromise(Effect.provide(program, sharedFetchLayer));
199
+ rawRoots.value = result;
200
+ fetchError.value = null;
201
+ } catch (e) {
202
+ console.warn("[shwfed-table] tree-combobox-single dataSource fetch failed", e);
203
+ fetchError.value = e;
204
+ }
205
+ }
206
+ watch(
207
+ () => [props.column.dataSource?.request, props.column.dataSource?.data],
208
+ () => {
209
+ void fetchTree();
210
+ },
211
+ { immediate: true }
212
+ );
213
+ const roots = computed(
214
+ () => wrapStructuralAll(rawRoots.value, {
215
+ nodeKey,
216
+ nodeChildren: nodeChildrenList
217
+ })
218
+ );
219
+ const selectedWrapped = computed(() => {
220
+ const k = model.value;
221
+ if (!k) return void 0;
222
+ const path = findWrappedPath(roots.value, k);
223
+ if (!path || path.length === 0) return void 0;
224
+ return path[path.length - 1];
225
+ });
226
+ const triggerLabel = computed(
227
+ () => selectedWrapped.value ? wrappedLabelText(selectedWrapped.value) : ""
228
+ );
229
+ publishSelection(
230
+ props.column.id,
231
+ () => selectedWrapped.value,
232
+ { identity: (w) => w.key, raw: (w) => w.raw }
233
+ );
234
+ const initialExpanded = computed(() => {
235
+ if (!props.column.expandAll) return [];
236
+ const out = [];
237
+ const stack = [...roots.value];
238
+ while (stack.length) {
239
+ const n = stack.pop();
240
+ if (n.kind === "branch") {
241
+ out.push(n.key);
242
+ stack.push(...n.children);
243
+ }
244
+ }
245
+ return out;
246
+ });
247
+ const filterQuery = ref("");
248
+ function filterPredicate(w, query) {
249
+ const q = query.trim().toLowerCase();
250
+ if (!q) return true;
251
+ if (wrappedLabelText(w).trim().toLowerCase().includes(q)) return true;
252
+ return wrappedKeywords(w).some((k) => k.includes(q));
253
+ }
254
+ const open = ref(false);
255
+ function handleUpdate(next) {
256
+ const k = typeof next === "string" ? next : void 0;
257
+ model.value = k;
258
+ if (k) open.value = false;
259
+ }
260
+ const showClear = computed(
261
+ () => !isDisabled.value && !loading.value && !!model.value
262
+ );
263
+ function handleClear() {
264
+ model.value = void 0;
265
+ open.value = false;
266
+ }
267
+ const hoveredKey = ref(null);
268
+ watch(open, (isOpen) => {
269
+ if (!isOpen) hoveredKey.value = null;
270
+ });
271
+ function collectTooltipNodes(out, siblings) {
272
+ for (const n of siblings) {
273
+ if (wrappedTooltipText(n)) out.push(n.key);
274
+ if (n.kind === "branch") collectTooltipNodes(out, n.children);
275
+ }
276
+ }
277
+ const anyHasTooltip = computed(() => {
278
+ if (!props.column.nodeTooltip) return false;
279
+ const out = [];
280
+ collectTooltipNodes(out, roots.value);
281
+ return out.length > 0;
282
+ });
283
+ const hoveredTooltip = computed(() => {
284
+ const k = hoveredKey.value;
285
+ if (!k) return void 0;
286
+ const path = findWrappedPath(roots.value, k);
287
+ if (!path || path.length === 0) return void 0;
288
+ return wrappedTooltipText(path[path.length - 1]);
289
+ });
290
+ </script>
291
+
292
+ <template>
293
+ <div class="p-[0.125rem] w-full">
294
+ <span
295
+ v-if="isHidden"
296
+ class="block h-7 w-full"
297
+ />
298
+ <!--
299
+ Readonly empty state mirrors the `text` column exactly: a centered,
300
+ faded, non-selectable `-` in `font-mono`, so a readonly grid reads
301
+ uniformly regardless of column type. A resolved label keeps the
302
+ left-aligned dark text.
303
+ -->
304
+ <span
305
+ v-else-if="effectiveReadonly"
306
+ :class="[
307
+ 'flex items-center h-7 w-full px-2 text-[0.75rem] truncate',
308
+ triggerLabel ? 'text-zinc-700' : 'justify-center font-mono text-zinc-300 select-none'
309
+ ]"
310
+ >
311
+ {{ triggerLabel || "-" }}
312
+ </span>
313
+ <Popover
314
+ v-else
315
+ v-model:open="open"
316
+ >
317
+ <PopoverAnchor as-child>
318
+ <InputGroup
319
+ class="group/tree-combobox-single h-7 rounded border-zinc-200/30 hover:border-zinc-200 focus-within:border-zinc-200 transition-colors ease-out duration-180"
320
+ :data-disabled="isDisabled ? 'true' : void 0"
321
+ >
322
+ <PopoverTrigger as-child>
323
+ <InputGroupInput
324
+ :model-value="triggerLabel"
325
+ :disabled="isDisabled"
326
+ :placeholder="placeholderText"
327
+ class="h-7 text-[0.75rem] md:text-[0.75rem] px-2 cursor-pointer text-left"
328
+ readonly
329
+ />
330
+ </PopoverTrigger>
331
+ <InputGroupAddon
332
+ v-if="loading"
333
+ align="inline-end"
334
+ data-slot="tree-combobox-single-loading"
335
+ class="text-zinc-400"
336
+ >
337
+ <Icon
338
+ icon="fluent:spinner-ios-20-regular"
339
+ class="size-3 animate-spin"
340
+ />
341
+ </InputGroupAddon>
342
+ <InputGroupAddon
343
+ v-else-if="showClear"
344
+ align="inline-end"
345
+ class="[@media(hover:hover)]:opacity-0 transition-opacity group-hover/tree-combobox-single:opacity-100 focus-within:opacity-100"
346
+ >
347
+ <InputGroupButton
348
+ size="icon-xs"
349
+ data-slot="tree-combobox-single-clear"
350
+ class="size-4 text-zinc-500 hover:text-zinc-700"
351
+ tabindex="-1"
352
+ @mousedown.prevent
353
+ @click.stop="handleClear"
354
+ >
355
+ <Icon
356
+ icon="fluent:dismiss-20-regular"
357
+ class="size-3"
358
+ />
359
+ </InputGroupButton>
360
+ </InputGroupAddon>
361
+ </InputGroup>
362
+ </PopoverAnchor>
363
+ <PopoverContent
364
+ class="p-0"
365
+ :style="{ width: 'var(--reka-popover-trigger-width)' }"
366
+ >
367
+ <div
368
+ data-slot="tree-combobox-single-search"
369
+ class="flex h-7 items-center gap-2 border-b border-zinc-200 px-2"
370
+ >
371
+ <Icon
372
+ icon="fluent:search-20-filled"
373
+ class="size-3 shrink-0 opacity-50"
374
+ />
375
+ <input
376
+ v-model="filterQuery"
377
+ :disabled="isDisabled"
378
+ :placeholder="t('tree-combobox-single-search-placeholder')"
379
+ class="flex h-7 w-full bg-transparent text-[0.75rem] outline-hidden placeholder:text-zinc-500 disabled:cursor-not-allowed disabled:opacity-50"
380
+ >
381
+ </div>
382
+ <div class="flex flex-col p-1">
383
+ <div
384
+ v-if="fetchError && roots.length === 0"
385
+ class="min-h-7 px-2 py-1 text-[0.75rem] text-red-500"
386
+ >
387
+ {{ t("tree-combobox-single-load-error") }}
388
+ </div>
389
+ <div
390
+ v-else-if="loading && roots.length === 0"
391
+ class="flex flex-col gap-1 px-2 py-1"
392
+ aria-busy="true"
393
+ >
394
+ <Skeleton class="h-4 w-2/3" />
395
+ <Skeleton class="h-4 w-1/2" />
396
+ <Skeleton class="h-4 w-3/5" />
397
+ </div>
398
+
399
+ <UiTree
400
+ v-else
401
+ :roots="roots"
402
+ :get-key="(w) => w.key"
403
+ :get-children="getWrappedChildren"
404
+ selection-mode="single"
405
+ :model-value="model"
406
+ :selectable="wrappedSelectable"
407
+ :filter-predicate="filterPredicate"
408
+ :filter-query="filterQuery"
409
+ :initial-expanded="initialExpanded"
410
+ :show-focused-row="false"
411
+ :class="isDisabled ? 'pointer-events-none opacity-60' : void 0"
412
+ class="max-h-72 overflow-y-auto"
413
+ @update:model-value="handleUpdate"
414
+ >
415
+ <template #node="{ node, selected }">
416
+ <span
417
+ class="flex flex-1 min-w-0 items-center justify-between gap-2"
418
+ @mouseenter="hoveredKey = node.key"
419
+ @focusin="hoveredKey = node.key"
420
+ >
421
+ <span class="min-w-0 truncate text-[0.75rem] text-zinc-700">{{ wrappedLabelText(node) }}</span>
422
+ <Icon
423
+ v-if="selected"
424
+ icon="fluent:checkmark-20-regular"
425
+ class="size-3 shrink-0 text-zinc-700"
426
+ />
427
+ </span>
428
+ </template>
429
+
430
+ <template #empty>
431
+ <div class="min-h-7 px-2 py-1 text-[0.75rem] text-zinc-400">
432
+ {{ t("tree-combobox-single-empty") }}
433
+ </div>
434
+ </template>
435
+
436
+ <template #error="{ error, retry }">
437
+ <span class="inline-flex items-center gap-1 text-xs text-red-500">
438
+ {{ t("tree-combobox-single-load-error") }}
439
+ <button
440
+ type="button"
441
+ class="underline hover:text-red-600"
442
+ @click.stop="retry"
443
+ >
444
+ {{ t("tree-combobox-single-retry") }}
445
+ </button>
446
+ <span class="sr-only">{{ String(error) }}</span>
447
+ </span>
448
+ </template>
449
+ </UiTree>
450
+ </div>
451
+ <div
452
+ v-if="anyHasTooltip && hoveredTooltip"
453
+ data-slot="tree-combobox-single-tooltip"
454
+ class="border-t border-zinc-200 px-2 py-1.5"
455
+ >
456
+ <Markdown
457
+ :source="hoveredTooltip"
458
+ block
459
+ class="prose prose-xs prose-zinc"
460
+ />
461
+ </div>
462
+ </PopoverContent>
463
+ </Popover>
464
+ </div>
465
+ </template>
@@ -0,0 +1,9 @@
1
+ import type { CellContext } from '@tanstack/vue-table';
2
+ import type { Value } from './schema.js';
3
+ type __VLS_Props = {
4
+ column: Value;
5
+ ctx: CellContext<unknown, unknown>;
6
+ };
7
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -0,0 +1,80 @@
1
+ import { Schema } from 'effect';
2
+ import type { ColumnDef } from '@tanstack/vue-table';
3
+ import type { Environment } from '../../../../../vendor/cel-js/lib/index.js';
4
+ import type { ColumnDefDeps, MigrateFn, MigrateSource } from '../../../utils/resolve.js';
5
+ export declare const type: "com.shwfed.table.column.tree-combobox-single";
6
+ export declare const compatibilityDate: "2026-06-14";
7
+ export declare const metadata: {
8
+ readonly name: "下拉树(单选)";
9
+ readonly icon: "fluent:tree-evergreen-20-regular";
10
+ readonly selection: true;
11
+ };
12
+ export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
13
+ placeholder: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
14
+ locale: Schema.Literal<["zh"]>;
15
+ message: Schema.SchemaClass<string, string, never>;
16
+ }>], [Schema.Struct<{
17
+ locale: Schema.Literal<["ja", "en", "ko"]>;
18
+ message: Schema.SchemaClass<string, string, never>;
19
+ }>]>>;
20
+ hidden: Schema.optional<Schema.Schema<string, string, never>>;
21
+ disabled: Schema.optional<Schema.Schema<string, string, never>>;
22
+ readonly: Schema.optional<Schema.Schema<string, string, never>>;
23
+ derived: Schema.optional<Schema.Struct<{
24
+ mode: Schema.Literal<["formula", "prefill"]>;
25
+ expression: Schema.Schema<string, string, never>;
26
+ }>>;
27
+ dataSource: Schema.Struct<{
28
+ request: Schema.optional<Schema.Schema<string, string, never>>;
29
+ data: Schema.Schema<string, string, never>;
30
+ }>;
31
+ nodeKey: Schema.Schema<string, string, never>;
32
+ nodeChildren: Schema.Schema<string, string, never>;
33
+ nodeLabel: Schema.Schema<string, string, never>;
34
+ nodeTooltip: Schema.optional<Schema.refine<readonly [{
35
+ readonly locale: "zh";
36
+ readonly message: string;
37
+ }, ...{
38
+ readonly locale: "en" | "ja" | "ko";
39
+ readonly message: string;
40
+ }[]], Schema.TupleType<readonly [Schema.Struct<{
41
+ locale: Schema.Literal<["zh"]>;
42
+ message: Schema.SchemaClass<string, string, never>;
43
+ }>], [Schema.Struct<{
44
+ locale: Schema.Literal<["ja", "en", "ko"]>;
45
+ message: Schema.SchemaClass<string, string, never>;
46
+ }>]>>>;
47
+ keywords: Schema.optional<Schema.Schema<string, string, never>>;
48
+ nodeSelectable: Schema.optional<Schema.Schema<string, string, never>>;
49
+ expandAll: Schema.optionalWith<typeof Schema.Boolean, {
50
+ default: () => false;
51
+ }>;
52
+ title: Schema.TupleType<readonly [Schema.Struct<{
53
+ locale: Schema.Literal<["zh"]>;
54
+ message: Schema.SchemaClass<string, string, never>;
55
+ }>], [Schema.Struct<{
56
+ locale: Schema.Literal<["ja", "en", "ko"]>;
57
+ message: Schema.SchemaClass<string, string, never>;
58
+ }>]>;
59
+ binding: Schema.refine<string, typeof Schema.String>;
60
+ enableSorting: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
61
+ sortKey: Schema.optional<Schema.refine<string, typeof Schema.String>>;
62
+ size: Schema.optional<Schema.refine<number, Schema.filter<typeof Schema.Number>>>;
63
+ grow: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
64
+ tooltip: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
65
+ locale: Schema.Literal<["zh"]>;
66
+ message: Schema.SchemaClass<string, string, never>;
67
+ }>], [Schema.Struct<{
68
+ locale: Schema.Literal<["ja", "en", "ko"]>;
69
+ message: Schema.SchemaClass<string, string, never>;
70
+ }>]>>;
71
+ id: Schema.refine<string, typeof Schema.String>;
72
+ groupId: Schema.optional<typeof Schema.UUID>;
73
+ type: Schema.Literal<["com.shwfed.table.column.tree-combobox-single"]>;
74
+ compatibilityDate: Schema.Literal<["2026-06-14"]>;
75
+ }>;
76
+ export type Value = Schema.Schema.Type<ReturnType<typeof schema>>;
77
+ export declare function defaults(): Partial<Value>;
78
+ export declare const migrateFrom: ReadonlyArray<MigrateSource>;
79
+ export declare const migrate: MigrateFn;
80
+ export declare function toColumnDef(value: Value, { getLocaleText }: ColumnDefDeps): Partial<ColumnDef<unknown, unknown>>;