@baishuyun/ai-design 2.0.38 → 2.1.0-alpha.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 (269) hide show
  1. package/.storybook/main.ts +31 -31
  2. package/.storybook/preview.ts +16 -16
  3. package/CHANGELOG.md +512 -501
  4. package/components.json +22 -22
  5. package/package.json +9 -6
  6. package/scripts/strip-layers.cjs +41 -41
  7. package/src/components/abs-fullscreen-gradient-bg.tsx +35 -35
  8. package/src/components/agent-helper/agent-category-select-menu/index.tsx +57 -57
  9. package/src/components/agent-helper/agent-entry-card/index.tsx +94 -94
  10. package/src/components/agent-helper/agent-helper-card/index.tsx +179 -179
  11. package/src/components/agent-helper/agent-helper-card-list/index.tsx +59 -59
  12. package/src/components/agent-helper/agent-helper-main-layout/index.tsx +60 -60
  13. package/src/components/agent-helper/agent-sort-select/index.tsx +89 -89
  14. package/src/components/agent-helper/agent-tag/index.tsx +29 -29
  15. package/src/components/agent-helper/app-select/index.tsx +559 -559
  16. package/src/components/agent-helper/condition-group/index.tsx +75 -75
  17. package/src/components/agent-helper/condition-input/index.tsx +233 -233
  18. package/src/components/agent-helper/condition-item/index.tsx +237 -237
  19. package/src/components/agent-helper/condition-quantifier-select/index.tsx +142 -142
  20. package/src/components/agent-helper/condition-trigger-description/index.tsx +49 -49
  21. package/src/components/agent-helper/date-picker/calendar-panel.tsx +164 -164
  22. package/src/components/agent-helper/date-picker/date-input.tsx +91 -91
  23. package/src/components/agent-helper/date-picker/date-picker.tsx +327 -327
  24. package/src/components/agent-helper/date-picker/footer-panel.tsx +44 -44
  25. package/src/components/agent-helper/date-picker/index.ts +3 -3
  26. package/src/components/agent-helper/date-picker/month-panel.tsx +82 -82
  27. package/src/components/agent-helper/date-picker/time-panel.tsx +146 -146
  28. package/src/components/agent-helper/date-picker/types.ts +37 -37
  29. package/src/components/agent-helper/date-picker/utils.ts +121 -121
  30. package/src/components/agent-helper/date-picker/year-panel.tsx +86 -86
  31. package/src/components/agent-helper/exec-log-filter/index.tsx +232 -232
  32. package/src/components/agent-helper/field-edit-preference-select/index.tsx +291 -291
  33. package/src/components/agent-helper/field-select/index.tsx +466 -466
  34. package/src/components/agent-helper/field-value-input/china-address-data.ts +4117 -4117
  35. package/src/components/agent-helper/field-value-input/display.tsx +71 -71
  36. package/src/components/agent-helper/field-value-input/icons.tsx +38 -38
  37. package/src/components/agent-helper/field-value-input/index.tsx +144 -144
  38. package/src/components/agent-helper/field-value-input/inputs.tsx +247 -247
  39. package/src/components/agent-helper/field-value-input/picker-inputs.tsx +1141 -1141
  40. package/src/components/agent-helper/flow-node-action-trigger-select/index.tsx +57 -57
  41. package/src/components/agent-helper/form-action-trigger-select/index.tsx +60 -60
  42. package/src/components/agent-helper/form-divider/index.tsx +44 -44
  43. package/src/components/agent-helper/form-select/index.tsx +732 -732
  44. package/src/components/agent-helper/monthdays-select/index.tsx +378 -378
  45. package/src/components/agent-helper/offset-preference-select/index.tsx +268 -268
  46. package/src/components/agent-helper/offset-type-select/index.tsx +66 -66
  47. package/src/components/agent-helper/offset-unit-select/index.tsx +54 -54
  48. package/src/components/agent-helper/placeholder-card/index.tsx +75 -75
  49. package/src/components/agent-helper/prompt-input/index.tsx +646 -646
  50. package/src/components/agent-helper/relational-operator-select/index.tsx +179 -179
  51. package/src/components/agent-helper/repeat-by-type-select/index.tsx +53 -53
  52. package/src/components/agent-helper/repeat-preference-select/index.tsx +162 -162
  53. package/src/components/agent-helper/repeat-preference-type-select/index.tsx +58 -58
  54. package/src/components/agent-helper/search-input/index.tsx +35 -35
  55. package/src/components/agent-helper/table/index.tsx +114 -114
  56. package/src/components/agent-helper/trigger-select/index.tsx +121 -121
  57. package/src/components/agent-helper/trigger-time-preference-select/index.tsx +189 -189
  58. package/src/components/agent-helper/trigger-time-source-type-select/index.tsx +53 -53
  59. package/src/components/agent-helper/weekdays-select/index.tsx +230 -230
  60. package/src/components/agent-scroll-selector.tsx +193 -193
  61. package/src/components/agent-select.tsx +154 -154
  62. package/src/components/attachment-part-group.tsx +35 -35
  63. package/src/components/attachment-part.tsx +296 -296
  64. package/src/components/attachments-previewer.tsx +272 -272
  65. package/src/components/base-button.tsx +49 -49
  66. package/src/components/border-animation.tsx +107 -107
  67. package/src/components/border-color-animation.tsx +66 -66
  68. package/src/components/bot-avatar-name.tsx +36 -36
  69. package/src/components/bot-icon.tsx +23 -23
  70. package/src/components/bs-entry-select/app-group-folder.tsx +61 -61
  71. package/src/components/bs-entry-select/bs-entry-select.tsx +296 -296
  72. package/src/components/bs-entry-select/build-tree.ts +265 -265
  73. package/src/components/bs-entry-select/entry-item.tsx +45 -45
  74. package/src/components/bs-entry-select/entry-popover.tsx +99 -99
  75. package/src/components/bs-entry-select/index.ts +7 -7
  76. package/src/components/bs-entry-select/other-app-section.tsx +96 -96
  77. package/src/components/bs-entry-select/scroll-slider.tsx +872 -872
  78. package/src/components/bs-entry-select/search-input.tsx +4 -4
  79. package/src/components/bs-entry-select/tree-item-node.tsx +84 -84
  80. package/src/components/bs-entry-select/types.ts +46 -46
  81. package/src/components/bs-icons.tsx +1362 -1362
  82. package/src/components/card-field.tsx +23 -23
  83. package/src/components/card.tsx +36 -36
  84. package/src/components/chat-area-header.tsx +65 -65
  85. package/src/components/check-card.tsx +77 -77
  86. package/src/components/circle-checker.tsx +66 -66
  87. package/src/components/collapsible-txt-msg.tsx +75 -75
  88. package/src/components/collapsible.tsx +9 -9
  89. package/src/components/confirm-dialog.tsx +139 -139
  90. package/src/components/date-range-picker.tsx +91 -91
  91. package/src/components/fake-bot-msg.tsx +51 -51
  92. package/src/components/field-checker-list-msg.tsx +146 -146
  93. package/src/components/field-checker.tsx +185 -185
  94. package/src/components/field-icon.tsx +13 -13
  95. package/src/components/field-value-checker.tsx +116 -116
  96. package/src/components/fields-design-info-table.tsx +160 -160
  97. package/src/components/fields-generating-indicator.tsx +95 -95
  98. package/src/components/fields-portal.tsx +18 -18
  99. package/src/components/fields-previewer.tsx +216 -216
  100. package/src/components/font-icon.tsx +65 -65
  101. package/src/components/form-info-editor.tsx +263 -263
  102. package/src/components/formula-tag.tsx +32 -32
  103. package/src/components/generate-animation.tsx +56 -56
  104. package/src/components/icon-btn.tsx +43 -43
  105. package/src/components/icon-card.tsx +67 -67
  106. package/src/components/icons/calendar-icon.tsx +5 -5
  107. package/src/components/icons/clear-all-icon.tsx +5 -5
  108. package/src/components/icons/empty-agent-icon.tsx +93 -93
  109. package/src/components/icons/empty-table-icon.tsx +104 -104
  110. package/src/components/icons/grids-icon.tsx +5 -5
  111. package/src/components/img-part.tsx +27 -27
  112. package/src/components/legacy-slot.tsx +110 -110
  113. package/src/components/line-checker.tsx +168 -168
  114. package/src/components/linear-gradient-border-btn.tsx +48 -48
  115. package/src/components/linear-gradient-color-bg-animation.tsx +103 -103
  116. package/src/components/memoized-markdown.tsx +32 -32
  117. package/src/components/message-content.tsx +21 -21
  118. package/src/components/number-part.tsx +46 -46
  119. package/src/components/office-container.tsx +289 -289
  120. package/src/components/option-item.tsx +27 -27
  121. package/src/components/output-config-editor.tsx +478 -478
  122. package/src/components/previewer-header.tsx +270 -270
  123. package/src/components/primary-confirm-btn.tsx +58 -58
  124. package/src/components/primary-entry-btn.tsx +48 -48
  125. package/src/components/radio-card.tsx +63 -63
  126. package/src/components/scroll-to-bottom-btn.tsx +28 -28
  127. package/src/components/split-line.tsx +9 -9
  128. package/src/components/square-checker.tsx +87 -87
  129. package/src/components/subform-fields-value-checker.tsx +184 -184
  130. package/src/components/tab-radio-group.tsx +83 -83
  131. package/src/components/tooltip.tsx +53 -53
  132. package/src/components/ui/button.tsx +51 -51
  133. package/src/components/ui/calendar.tsx +57 -57
  134. package/src/components/ui/dialog.tsx +104 -104
  135. package/src/components/ui/drawer.tsx +279 -279
  136. package/src/components/ui/form.tsx +202 -202
  137. package/src/components/ui/icons.tsx +1267 -1267
  138. package/src/components/ui/input.tsx +28 -28
  139. package/src/components/ui/label.tsx +30 -30
  140. package/src/components/ui/popover.tsx +85 -85
  141. package/src/components/ui/select.tsx +236 -236
  142. package/src/components/ui/spinner.tsx +17 -17
  143. package/src/components/ui/switch.tsx +33 -33
  144. package/src/components/ui/tabs.tsx +62 -62
  145. package/src/components/ui/textarea.tsx +28 -28
  146. package/src/components/ui/tooltip.tsx +53 -53
  147. package/src/components/user-txt-msg-bubble.tsx +47 -47
  148. package/src/components/warning-msg.tsx +27 -27
  149. package/src/const/ui.ts +119 -119
  150. package/src/css.d.ts +4 -4
  151. package/src/hooks/use-column-appear.ts +78 -78
  152. package/src/hooks/use-portal-container.ts +27 -27
  153. package/src/hooks/use-resizable-width.ts +129 -129
  154. package/src/hooks/use-select-popover-position.ts +74 -74
  155. package/src/hooks/use-shadow.ts +127 -127
  156. package/src/index.ts +226 -226
  157. package/src/lib/utils.ts +138 -138
  158. package/src/stories/AbsFullscreenGradientBg.stories.tsx +36 -36
  159. package/src/stories/AgentCategorySelectMenu.stories.tsx +33 -33
  160. package/src/stories/AgentEntryCard.stories.tsx +90 -90
  161. package/src/stories/AgentHelperCard.stories.tsx +105 -105
  162. package/src/stories/AgentHelperCardList.stories.tsx +120 -120
  163. package/src/stories/AgentHelperMainLayout.stories.tsx +71 -71
  164. package/src/stories/AgentScrollSelector.stories.tsx +95 -95
  165. package/src/stories/AgentSelect.stories.tsx +134 -134
  166. package/src/stories/AgentTag.stories.tsx +44 -44
  167. package/src/stories/AppSelect.stories.tsx +250 -250
  168. package/src/stories/AttachmentPart.stories.tsx +122 -122
  169. package/src/stories/AttachmentPartGroup.stories.tsx +152 -152
  170. package/src/stories/AttachmentsPreviewer.stories.tsx +306 -306
  171. package/src/stories/BaseButton.stories.tsx +33 -33
  172. package/src/stories/BorderAnimation.stories.tsx +116 -116
  173. package/src/stories/BorderColorAnimation.stories.tsx +63 -63
  174. package/src/stories/BotAvatarAndName.stories.ts +24 -24
  175. package/src/stories/BotIcon.stories.ts +22 -22
  176. package/src/stories/BsConditionInput.stories.tsx +460 -460
  177. package/src/stories/BsEntrySelect.stories.tsx +343 -343
  178. package/src/stories/BsTooltip.stories.tsx +32 -32
  179. package/src/stories/Card.stories.tsx +28 -28
  180. package/src/stories/CardField.stories.tsx +87 -87
  181. package/src/stories/ChatAreaHeader.stories.ts +26 -26
  182. package/src/stories/CheckCard.stories.tsx +114 -114
  183. package/src/stories/CircleChecker.stories.tsx +89 -89
  184. package/src/stories/CollapsibleTextMsg.stories.ts +44 -44
  185. package/src/stories/ConditionGroup.stories.tsx +216 -216
  186. package/src/stories/ConditionInput.stories.tsx +502 -502
  187. package/src/stories/ConditionItem.stories.tsx +163 -163
  188. package/src/stories/ConditonQuantifierSelect.stories.tsx +54 -54
  189. package/src/stories/ConditonTriggerDescription.stories.tsx +61 -61
  190. package/src/stories/ConfirmDialog.stories.tsx +123 -123
  191. package/src/stories/DataTable.stories.tsx +191 -191
  192. package/src/stories/DatePicker.stories.tsx +174 -174
  193. package/src/stories/ExecLogFilter.stories.tsx +145 -145
  194. package/src/stories/FakeBotMsg.stories.tsx +36 -36
  195. package/src/stories/FieldEditPreferenceSelect.stories.tsx +161 -161
  196. package/src/stories/FieldSelect.stories.tsx +228 -228
  197. package/src/stories/FieldValueInput.stories.tsx +442 -442
  198. package/src/stories/FlowNodeActionTriggerSelect.stories.tsx +80 -80
  199. package/src/stories/Form.stories.tsx +302 -302
  200. package/src/stories/FormActionTriggerSelect.stories.tsx +80 -80
  201. package/src/stories/FormDivider.stories.tsx +31 -31
  202. package/src/stories/FormInfoEditor.stories.tsx +173 -173
  203. package/src/stories/FormSelect.stories.tsx +222 -222
  204. package/src/stories/FormulaTag.stories.tsx +68 -68
  205. package/src/stories/GenerateAnimation.stories.ts +20 -20
  206. package/src/stories/IconBtn.stories.tsx +32 -32
  207. package/src/stories/IconCard.stories.tsx +35 -35
  208. package/src/stories/IconLib.tsx +45 -45
  209. package/src/stories/Icons.stories.ts +22 -22
  210. package/src/stories/ImgMsgPart.stories.tsx +42 -42
  211. package/src/stories/Input.stories.tsx +102 -102
  212. package/src/stories/Label.stories.tsx +66 -66
  213. package/src/stories/LegacySlot.stories.tsx +56 -56
  214. package/src/stories/LineChecker.stories.tsx +133 -133
  215. package/src/stories/LinearGradientBorderBtn.stories.tsx +86 -86
  216. package/src/stories/LinearGradientColorBgAnimation.stories.tsx +60 -60
  217. package/src/stories/MemoizedMarkdown.stories.tsx +102 -102
  218. package/src/stories/MessageContent.stories.tsx +36 -36
  219. package/src/stories/MonthdaysSelect.stories.tsx +78 -78
  220. package/src/stories/NumbersMsgPart.stories.tsx +42 -42
  221. package/src/stories/OfficeContainer.stories.tsx +287 -287
  222. package/src/stories/OffsetPreferenceSelect.stories.tsx +118 -118
  223. package/src/stories/OffsetTypeSelect.stories.tsx +75 -75
  224. package/src/stories/OffsetUnitSelect.stories.tsx +61 -61
  225. package/src/stories/OptionItem.stories.tsx +77 -77
  226. package/src/stories/OutputConfigEditor.stories.tsx +96 -96
  227. package/src/stories/PlaceholderCard.stories.tsx +35 -35
  228. package/src/stories/PreviewerHeader.stories.tsx +91 -91
  229. package/src/stories/PrimaryConfirmBtn.stories.tsx +60 -60
  230. package/src/stories/PrimaryEntryBtn.stories.tsx +74 -74
  231. package/src/stories/PromptInput.stories.tsx +228 -228
  232. package/src/stories/RadioCard.stories.tsx +103 -103
  233. package/src/stories/RelationalOperatorSelect.stories.tsx +61 -61
  234. package/src/stories/RepeatByTypeSelect.stories.tsx +58 -58
  235. package/src/stories/RepeatPreferenceSelect.stories.tsx +107 -107
  236. package/src/stories/RepeatPreferenceTypeSelect.stories.tsx +58 -58
  237. package/src/stories/ScrollToBottom.stories.tsx +24 -24
  238. package/src/stories/SearchInput.stories.tsx +50 -50
  239. package/src/stories/Select.stories.tsx +128 -128
  240. package/src/stories/SplitLine.stories.tsx +40 -40
  241. package/src/stories/SquareChecker.stories.tsx +96 -96
  242. package/src/stories/TabRadioGroup.stories.tsx +84 -84
  243. package/src/stories/Textarea.stories.tsx +67 -67
  244. package/src/stories/TriggerSelect.stories.tsx +48 -48
  245. package/src/stories/TriggerTimePreferenceSelect.stories.tsx +106 -106
  246. package/src/stories/TriggerTimeSourceTypeSelect.stories.tsx +68 -68
  247. package/src/stories/UserTextMsgBubble.stories.ts +24 -24
  248. package/src/stories/WarningMessage.stories.tsx +23 -23
  249. package/src/stories/WeekdaysSelect.stories.tsx +66 -66
  250. package/src/stories/assets/demo.css +539 -539
  251. package/src/stories/assets/demo_index.html +7988 -7988
  252. package/src/stories/assets/iconfont.css +1377 -1377
  253. package/src/stories/assets/iconfont.json +2382 -2382
  254. package/src/stories/assets/iconfont.svg +697 -697
  255. package/src/stories/collapsible.stories.tsx +47 -47
  256. package/src/stories/drawer.stories.tsx +196 -196
  257. package/src/stories/field-checker-list-msg.stories.tsx +95 -95
  258. package/src/stories/field-checker.stories.tsx +117 -117
  259. package/src/stories/field-icon.stories.tsx +70 -70
  260. package/src/stories/field-value-checker.stories.tsx +113 -113
  261. package/src/stories/fields-design-info-table.stories.tsx +203 -203
  262. package/src/stories/fields-generating.stories.tsx +41 -41
  263. package/src/stories/fields-previewer.stories.tsx +77 -77
  264. package/src/stories/subform-fields-value-checker.stories.tsx +98 -98
  265. package/src/style.css +226 -226
  266. package/src/types.ts +8 -8
  267. package/style.css +3652 -3652
  268. package/tsconfig.json +13 -13
  269. package/vite.config.ts +44 -44
@@ -1,502 +1,502 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { useState, useCallback } from 'react';
3
- import { ConditionInput } from '../components/agent-helper/condition-input';
4
- import type { IField, ICondition, IFieldValueService } from '@baishuyun/types';
5
-
6
- const mockService: IFieldValueService = {
7
- searchUsers: async (keyword) => {
8
- await new Promise((r) => setTimeout(r, 300));
9
- const users = [
10
- { id: 'user1', name: '张三' },
11
- { id: 'user2', name: '李四' },
12
- { id: 'user3', name: '王五' },
13
- ];
14
- return keyword ? users.filter((u) => u.name.includes(keyword)) : users;
15
- },
16
- searchDepts: async (keyword) => {
17
- await new Promise((r) => setTimeout(r, 300));
18
- const depts = [
19
- { id: 'dept1', name: '技术部' },
20
- { id: 'dept2', name: '产品部' },
21
- { id: 'dept3', name: '设计部' },
22
- ];
23
- return keyword ? depts.filter((d) => d.name.includes(keyword)) : depts;
24
- },
25
- searchUserGroups: async (keyword) => {
26
- await new Promise((r) => setTimeout(r, 300));
27
- const groups = [
28
- { id: 'ug1', name: '管理组' },
29
- { id: 'ug2', name: '普通组' },
30
- ];
31
- return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
32
- },
33
- searchDeptGroups: async (keyword) => {
34
- await new Promise((r) => setTimeout(r, 300));
35
- const groups = [
36
- { id: 'dg1', name: '研发中心' },
37
- { id: 'dg2', name: '销售中心' },
38
- ];
39
- return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
40
- },
41
- searchAddress: async (keyword) => {
42
- await new Promise((r) => setTimeout(r, 300));
43
- const addresses = [
44
- { province: '浙江省', city: '杭州市', district: '西湖区' },
45
- { province: '北京市', city: '北京市', district: '朝阳区' },
46
- ];
47
- return keyword ? addresses.filter((a) => a.province.includes(keyword) || a.city.includes(keyword) || a.district.includes(keyword)) : addresses;
48
- },
49
- searchLocation: async (keyword) => {
50
- await new Promise((r) => setTimeout(r, 300));
51
- return [
52
- { province: '浙江省', city: '杭州市', district: '西湖区', detail: '文三路 123 号', lnglatXY: [120.15, 30.28] as [number, number] },
53
- { province: '北京市', city: '北京市', district: '朝阳区', detail: '望京 SOHO', lnglatXY: [116.48, 39.99] as [number, number] },
54
- ].filter((l) => !keyword || l.detail.includes(keyword));
55
- },
56
- searchDistinctValues: async (_field, keyword) => {
57
- await new Promise((r) => setTimeout(r, 300));
58
- const values = [
59
- { label: '苹果', value: 'apple' },
60
- { label: '香蕉', value: 'banana' },
61
- { label: '橙子', value: 'orange' },
62
- { label: '葡萄', value: 'grape' },
63
- ];
64
- return keyword ? values.filter((v) => v.label.includes(keyword)) : values;
65
- },
66
- };
67
-
68
- const mockFields: IField[] = [
69
- {
70
- label: '姓名',
71
- description: '请输入姓名',
72
- widget: { type: 'text', widgetName: 'text', value: '' },
73
- },
74
- {
75
- label: '年龄',
76
- description: '请输入年龄',
77
- widget: { type: 'number', widgetName: 'number', value: '' },
78
- },
79
- {
80
- label: '出生日期',
81
- description: '请选择出生日期',
82
- widget: { type: 'datetime', widgetName: 'datetime', value: '' },
83
- },
84
- {
85
- label: '备注',
86
- description: '请输入备注',
87
- widget: { type: 'textarea', widgetName: 'textarea', value: '' },
88
- },
89
- {
90
- label: '性别',
91
- widget: {
92
- type: 'radiogroup',
93
- widgetName: 'radiogroup',
94
- value: '',
95
- items: [
96
- { label: '男', value: 'male' },
97
- { label: '女', value: 'female' },
98
- ],
99
- },
100
- },
101
- {
102
- label: '所在城市',
103
- widget: {
104
- type: 'combo',
105
- widgetName: 'combo',
106
- value: '',
107
- items: [
108
- { label: '北京', value: 'beijing' },
109
- { label: '上海', value: 'shanghai' },
110
- { label: '广州', value: 'guangzhou' },
111
- ],
112
- },
113
- },
114
- {
115
- label: '兴趣爱好',
116
- widget: {
117
- type: 'checkboxgroup',
118
- widgetName: 'checkboxgroup',
119
- value: [],
120
- items: [
121
- { label: '阅读', value: 'reading' },
122
- { label: '运动', value: 'sports' },
123
- { label: '音乐', value: 'music' },
124
- ],
125
- },
126
- },
127
- {
128
- label: '附件上传',
129
- widget: { type: 'upload', widgetName: 'upload', value: '' },
130
- },
131
- {
132
- label: '负责人',
133
- widget: { type: 'user', widgetName: 'user', value: '' },
134
- },
135
- {
136
- label: '所属部门',
137
- widget: { type: 'dept', widgetName: 'dept', value: '' },
138
- },
139
- {
140
- label: '密码',
141
- widget: { type: 'password', widgetName: 'password', value: '' },
142
- },
143
- {
144
- label: '性别(单选)',
145
- widget: {
146
- type: 'radio',
147
- widgetName: 'radio',
148
- value: '',
149
- items: [
150
- { label: '男', value: 'male' },
151
- { label: '女', value: 'female' },
152
- ],
153
- },
154
- },
155
- {
156
- label: '下拉多选',
157
- widget: {
158
- type: 'combocheck',
159
- widgetName: 'combocheck',
160
- value: [],
161
- items: [
162
- { label: '选项A', value: 'a' },
163
- { label: '选项B', value: 'b' },
164
- { label: '选项C', value: 'c' },
165
- ],
166
- },
167
- },
168
- {
169
- label: '地址',
170
- widget: { type: 'address', widgetName: 'address', value: {} },
171
- },
172
- {
173
- label: '位置',
174
- widget: { type: 'location', widgetName: 'location', value: {} },
175
- },
176
- {
177
- label: '流水号',
178
- widget: { type: 'sn', widgetName: 'sn', value: '' },
179
- },
180
- {
181
- label: '用户组',
182
- widget: { type: 'usergroup', widgetName: 'usergroup', value: '' },
183
- },
184
- {
185
- label: '部门组',
186
- widget: { type: 'deptgroup', widgetName: 'deptgroup', value: '' },
187
- },
188
- {
189
- label: '图片',
190
- widget: { type: 'image', widgetName: 'image', value: '' },
191
- },
192
- {
193
- label: '联动数据',
194
- widget: { type: 'linkdata', widgetName: 'linkdata', value: '' },
195
- },
196
- {
197
- label: '流程状态',
198
- widget: { type: 'flowState', widgetName: 'flowState', value: '' },
199
- },
200
- {
201
- label: '签名',
202
- widget: { type: 'signature', widgetName: 'signature', value: '' },
203
- },
204
- ];
205
-
206
- const meta: Meta<typeof ConditionInput> = {
207
- title: 'Agent Helper/ConditionInput',
208
- component: ConditionInput,
209
- tags: ['autodocs'],
210
- parameters: {
211
- layout: 'centered',
212
- },
213
- args: {
214
- targetName: '流程结束 或 流程节点',
215
- fields: mockFields,
216
- disabled: false,
217
- },
218
- decorators: [
219
- (Story) => (
220
- <div style={{ width: '960px' }}>
221
- <Story />
222
- </div>
223
- ),
224
- ],
225
- };
226
-
227
- export default meta;
228
- type Story = StoryObj<typeof meta>;
229
-
230
- export const Empty: Story = {
231
- args: {
232
- targetName: '流程结束 或 流程节点',
233
- fields: mockFields,
234
- },
235
- };
236
-
237
- export const WithConditions: Story = {
238
- args: {
239
- targetName: '流程结束 或 流程节点',
240
- fields: mockFields,
241
- defaultValue: {
242
- targetName: '流程结束 或 流程节点',
243
- quantifier: 'all',
244
- items: [
245
- {
246
- id: 'item-1',
247
- field: mockFields[0],
248
- operator: 'contains',
249
- value: '张三',
250
- },
251
- {
252
- id: 'item-2',
253
- field: mockFields[1],
254
- operator: 'gte',
255
- value: 18,
256
- },
257
- ],
258
- },
259
- },
260
- };
261
-
262
- export const WithDeleteAll: Story = {
263
- args: {
264
- targetName: '流程结束 或 流程节点',
265
- fields: mockFields,
266
- defaultValue: {
267
- targetName: '流程结束 或 流程节点',
268
- quantifier: 'any',
269
- items: [
270
- {
271
- id: 'item-1',
272
- field: mockFields[0],
273
- operator: 'contains',
274
- value: '张三',
275
- },
276
- {
277
- id: 'item-2',
278
- field: mockFields[1],
279
- operator: 'gte',
280
- value: 18,
281
- },
282
- {
283
- id: 'item-3',
284
- field: mockFields[5],
285
- operator: 'in',
286
- value: ['beijing', 'shanghai'],
287
- },
288
- {
289
- id: 'item-4',
290
- field: mockFields[2],
291
- operator: 'range',
292
- value: undefined,
293
- },
294
- ],
295
- },
296
- },
297
- };
298
-
299
- export const Controlled: Story = {
300
- render: () => {
301
- const [condition, setCondition] = useState<ICondition>({
302
- targetName: '流程结束 或 流程节点',
303
- quantifier: 'all',
304
- items: [
305
- {
306
- id: 'item-1',
307
- field: mockFields[0],
308
- operator: 'contains',
309
- value: '张三',
310
- },
311
- {
312
- id: 'item-2',
313
- field: mockFields[1],
314
- operator: 'gte',
315
- value: 18,
316
- },
317
- ],
318
- });
319
-
320
- const handleChange = useCallback((newCondition: ICondition) => {
321
- setCondition(newCondition);
322
- }, []);
323
-
324
- return (
325
- <div className="flex flex-col gap-[16px]">
326
- <ConditionInput
327
- targetName="流程结束 或 流程节点"
328
- fields={mockFields}
329
- value={condition}
330
- onChange={handleChange}
331
- />
332
- <div className="text-[12px] text-[#666666] bg-[#F5F5F5] rounded-[4px] p-[8px] font-mono">
333
- <pre>{JSON.stringify(condition, null, 2)}</pre>
334
- </div>
335
- </div>
336
- );
337
- },
338
- };
339
-
340
- export const RangeOperators: Story = {
341
- args: {
342
- targetName: '流程结束',
343
- fields: mockFields,
344
- service: mockService,
345
- defaultValue: {
346
- targetName: '流程结束',
347
- quantifier: 'all',
348
- items: [
349
- {
350
- id: 'range-1',
351
- field: mockFields[1], // number: 年龄
352
- operator: 'range',
353
- value: { min: 18, max: 60 },
354
- },
355
- {
356
- id: 'range-2',
357
- field: mockFields[2], // datetime: 出生日期
358
- operator: 'range',
359
- value: { min: '2020-01-01T00:00', max: '2025-12-31T23:59' },
360
- },
361
- ],
362
- },
363
- },
364
- };
365
-
366
- export const MultiSelectOperators: Story = {
367
- args: {
368
- targetName: '流程结束',
369
- fields: mockFields,
370
- service: mockService,
371
- defaultValue: {
372
- targetName: '流程结束',
373
- quantifier: 'any',
374
- items: [
375
- {
376
- id: 'ms-1',
377
- field: mockFields[0], // text: 姓名 (in operator → TextMultiSelect)
378
- operator: 'in',
379
- value: ['apple', 'banana'],
380
- },
381
- {
382
- id: 'ms-2',
383
- field: mockFields[8], // user: 负责人 (in operator → AsyncPicker multiple)
384
- operator: 'in',
385
- value: ['user1', 'user2'],
386
- },
387
- {
388
- id: 'ms-3',
389
- field: mockFields[9], // dept: 所属部门 (nin operator → AsyncPicker multiple)
390
- operator: 'nin',
391
- value: ['dept1'],
392
- },
393
- ],
394
- },
395
- },
396
- };
397
-
398
- export const MixedOperators: Story = {
399
- args: {
400
- targetName: '表单数据',
401
- fields: mockFields,
402
- service: mockService,
403
- defaultValue: {
404
- targetName: '表单数据',
405
- quantifier: 'all',
406
- items: [
407
- {
408
- id: 'mixed-1',
409
- field: mockFields[0], // text: contains
410
- operator: 'contains',
411
- value: '张',
412
- },
413
- {
414
- id: 'mixed-2',
415
- field: mockFields[1], // number: range → RangeNumberInput
416
- operator: 'range',
417
- value: { min: 0, max: 100 },
418
- },
419
- {
420
- id: 'mixed-3',
421
- field: mockFields[2], // datetime: range → RangeDateTimeInput
422
- operator: 'range',
423
- value: { min: '2025-01-01T00:00', max: '2025-06-30T23:59' },
424
- },
425
- {
426
- id: 'mixed-4',
427
- field: mockFields[0], // text: in → TextMultiSelect
428
- operator: 'in',
429
- value: ['orange', 'grape'],
430
- },
431
- ],
432
- },
433
- },
434
- };
435
-
436
- export const AllFieldTypes: Story = {
437
- args: {
438
- targetName: '表单',
439
- fields: mockFields,
440
- service: mockService,
441
- defaultValue: {
442
- targetName: '表单',
443
- quantifier: 'all',
444
- items: [
445
- { id: 'f-text', field: mockFields[0], operator: 'contains', value: '张' },
446
- { id: 'f-number', field: mockFields[1], operator: 'range', value: { min: 18, max: 65 } },
447
- { id: 'f-datetime', field: mockFields[2], operator: 'range', value: { min: '2025-01-01T00:00', max: '2025-12-31T23:59' } },
448
- { id: 'f-textarea', field: mockFields[3], operator: 'contains', value: '关键词' },
449
- { id: 'f-radiogroup', field: mockFields[4], operator: 'eq', value: 'male' },
450
- { id: 'f-combo', field: mockFields[5], operator: 'in', value: ['beijing', 'shanghai'] },
451
- { id: 'f-checkboxgroup', field: mockFields[6], operator: 'all', value: ['reading', 'sports'] },
452
- { id: 'f-upload', field: mockFields[7], operator: 'not_empty', value: undefined },
453
- { id: 'f-user', field: mockFields[8], operator: 'in', value: ['user1', 'user2'] },
454
- { id: 'f-dept', field: mockFields[9], operator: 'nin', value: ['dept3'] },
455
- { id: 'f-password', field: mockFields[10], operator: 'eq', value: 'secret' },
456
- { id: 'f-radio', field: mockFields[11], operator: 'neq', value: 'female' },
457
- { id: 'f-combocheck', field: mockFields[12], operator: 'all', value: ['a', 'b'] },
458
- { id: 'f-address', field: mockFields[13], operator: 'eq', value: { province: '浙江省', city: '杭州市', district: '西湖区' } },
459
- { id: 'f-location', field: mockFields[14], operator: 'eq', value: { province: '北京市', city: '北京市', district: '朝阳区' } },
460
- { id: 'f-sn', field: mockFields[15], operator: 'in', value: ['SN001', 'SN002'] },
461
- { id: 'f-usergroup', field: mockFields[16], operator: 'in', value: ['ug1'] },
462
- { id: 'f-deptgroup', field: mockFields[17], operator: 'all', value: ['dg1'] },
463
- { id: 'f-image', field: mockFields[18], operator: 'not_empty', value: undefined },
464
- { id: 'f-linkdata', field: mockFields[19], operator: 'eq', value: 'a' },
465
- { id: 'f-flowstate', field: mockFields[20], operator: 'eq', value: 'active' },
466
- { id: 'f-signature', field: mockFields[21], operator: 'empty', value: undefined },
467
- ],
468
- },
469
- },
470
- };
471
-
472
- export const Disabled: Story = {
473
- args: {
474
- targetName: '流程结束 或 流程节点',
475
- fields: mockFields,
476
- disabled: true,
477
- defaultValue: {
478
- targetName: '流程结束 或 流程节点',
479
- quantifier: 'all',
480
- items: [
481
- {
482
- id: 'item-1',
483
- field: mockFields[0],
484
- operator: 'contains',
485
- value: '张三',
486
- },
487
- {
488
- id: 'item-2',
489
- field: mockFields[1],
490
- operator: 'gte',
491
- value: 18,
492
- },
493
- {
494
- id: 'item-3',
495
- field: mockFields[5],
496
- operator: 'in',
497
- value: ['beijing', 'shanghai'],
498
- },
499
- ],
500
- },
501
- },
502
- };
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { useState, useCallback } from 'react';
3
+ import { ConditionInput } from '../components/agent-helper/condition-input';
4
+ import type { IField, ICondition, IFieldValueService } from '@baishuyun/types';
5
+
6
+ const mockService: IFieldValueService = {
7
+ searchUsers: async (keyword) => {
8
+ await new Promise((r) => setTimeout(r, 300));
9
+ const users = [
10
+ { id: 'user1', name: '张三' },
11
+ { id: 'user2', name: '李四' },
12
+ { id: 'user3', name: '王五' },
13
+ ];
14
+ return keyword ? users.filter((u) => u.name.includes(keyword)) : users;
15
+ },
16
+ searchDepts: async (keyword) => {
17
+ await new Promise((r) => setTimeout(r, 300));
18
+ const depts = [
19
+ { id: 'dept1', name: '技术部' },
20
+ { id: 'dept2', name: '产品部' },
21
+ { id: 'dept3', name: '设计部' },
22
+ ];
23
+ return keyword ? depts.filter((d) => d.name.includes(keyword)) : depts;
24
+ },
25
+ searchUserGroups: async (keyword) => {
26
+ await new Promise((r) => setTimeout(r, 300));
27
+ const groups = [
28
+ { id: 'ug1', name: '管理组' },
29
+ { id: 'ug2', name: '普通组' },
30
+ ];
31
+ return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
32
+ },
33
+ searchDeptGroups: async (keyword) => {
34
+ await new Promise((r) => setTimeout(r, 300));
35
+ const groups = [
36
+ { id: 'dg1', name: '研发中心' },
37
+ { id: 'dg2', name: '销售中心' },
38
+ ];
39
+ return keyword ? groups.filter((g) => g.name.includes(keyword)) : groups;
40
+ },
41
+ searchAddress: async (keyword) => {
42
+ await new Promise((r) => setTimeout(r, 300));
43
+ const addresses = [
44
+ { province: '浙江省', city: '杭州市', district: '西湖区' },
45
+ { province: '北京市', city: '北京市', district: '朝阳区' },
46
+ ];
47
+ return keyword ? addresses.filter((a) => a.province.includes(keyword) || a.city.includes(keyword) || a.district.includes(keyword)) : addresses;
48
+ },
49
+ searchLocation: async (keyword) => {
50
+ await new Promise((r) => setTimeout(r, 300));
51
+ return [
52
+ { province: '浙江省', city: '杭州市', district: '西湖区', detail: '文三路 123 号', lnglatXY: [120.15, 30.28] as [number, number] },
53
+ { province: '北京市', city: '北京市', district: '朝阳区', detail: '望京 SOHO', lnglatXY: [116.48, 39.99] as [number, number] },
54
+ ].filter((l) => !keyword || l.detail.includes(keyword));
55
+ },
56
+ searchDistinctValues: async (_field, keyword) => {
57
+ await new Promise((r) => setTimeout(r, 300));
58
+ const values = [
59
+ { label: '苹果', value: 'apple' },
60
+ { label: '香蕉', value: 'banana' },
61
+ { label: '橙子', value: 'orange' },
62
+ { label: '葡萄', value: 'grape' },
63
+ ];
64
+ return keyword ? values.filter((v) => v.label.includes(keyword)) : values;
65
+ },
66
+ };
67
+
68
+ const mockFields: IField[] = [
69
+ {
70
+ label: '姓名',
71
+ description: '请输入姓名',
72
+ widget: { type: 'text', widgetName: 'text', value: '' },
73
+ },
74
+ {
75
+ label: '年龄',
76
+ description: '请输入年龄',
77
+ widget: { type: 'number', widgetName: 'number', value: '' },
78
+ },
79
+ {
80
+ label: '出生日期',
81
+ description: '请选择出生日期',
82
+ widget: { type: 'datetime', widgetName: 'datetime', value: '' },
83
+ },
84
+ {
85
+ label: '备注',
86
+ description: '请输入备注',
87
+ widget: { type: 'textarea', widgetName: 'textarea', value: '' },
88
+ },
89
+ {
90
+ label: '性别',
91
+ widget: {
92
+ type: 'radiogroup',
93
+ widgetName: 'radiogroup',
94
+ value: '',
95
+ items: [
96
+ { label: '男', value: 'male' },
97
+ { label: '女', value: 'female' },
98
+ ],
99
+ },
100
+ },
101
+ {
102
+ label: '所在城市',
103
+ widget: {
104
+ type: 'combo',
105
+ widgetName: 'combo',
106
+ value: '',
107
+ items: [
108
+ { label: '北京', value: 'beijing' },
109
+ { label: '上海', value: 'shanghai' },
110
+ { label: '广州', value: 'guangzhou' },
111
+ ],
112
+ },
113
+ },
114
+ {
115
+ label: '兴趣爱好',
116
+ widget: {
117
+ type: 'checkboxgroup',
118
+ widgetName: 'checkboxgroup',
119
+ value: [],
120
+ items: [
121
+ { label: '阅读', value: 'reading' },
122
+ { label: '运动', value: 'sports' },
123
+ { label: '音乐', value: 'music' },
124
+ ],
125
+ },
126
+ },
127
+ {
128
+ label: '附件上传',
129
+ widget: { type: 'upload', widgetName: 'upload', value: '' },
130
+ },
131
+ {
132
+ label: '负责人',
133
+ widget: { type: 'user', widgetName: 'user', value: '' },
134
+ },
135
+ {
136
+ label: '所属部门',
137
+ widget: { type: 'dept', widgetName: 'dept', value: '' },
138
+ },
139
+ {
140
+ label: '密码',
141
+ widget: { type: 'password', widgetName: 'password', value: '' },
142
+ },
143
+ {
144
+ label: '性别(单选)',
145
+ widget: {
146
+ type: 'radio',
147
+ widgetName: 'radio',
148
+ value: '',
149
+ items: [
150
+ { label: '男', value: 'male' },
151
+ { label: '女', value: 'female' },
152
+ ],
153
+ },
154
+ },
155
+ {
156
+ label: '下拉多选',
157
+ widget: {
158
+ type: 'combocheck',
159
+ widgetName: 'combocheck',
160
+ value: [],
161
+ items: [
162
+ { label: '选项A', value: 'a' },
163
+ { label: '选项B', value: 'b' },
164
+ { label: '选项C', value: 'c' },
165
+ ],
166
+ },
167
+ },
168
+ {
169
+ label: '地址',
170
+ widget: { type: 'address', widgetName: 'address', value: {} },
171
+ },
172
+ {
173
+ label: '位置',
174
+ widget: { type: 'location', widgetName: 'location', value: {} },
175
+ },
176
+ {
177
+ label: '流水号',
178
+ widget: { type: 'sn', widgetName: 'sn', value: '' },
179
+ },
180
+ {
181
+ label: '用户组',
182
+ widget: { type: 'usergroup', widgetName: 'usergroup', value: '' },
183
+ },
184
+ {
185
+ label: '部门组',
186
+ widget: { type: 'deptgroup', widgetName: 'deptgroup', value: '' },
187
+ },
188
+ {
189
+ label: '图片',
190
+ widget: { type: 'image', widgetName: 'image', value: '' },
191
+ },
192
+ {
193
+ label: '联动数据',
194
+ widget: { type: 'linkdata', widgetName: 'linkdata', value: '' },
195
+ },
196
+ {
197
+ label: '流程状态',
198
+ widget: { type: 'flowState', widgetName: 'flowState', value: '' },
199
+ },
200
+ {
201
+ label: '签名',
202
+ widget: { type: 'signature', widgetName: 'signature', value: '' },
203
+ },
204
+ ];
205
+
206
+ const meta: Meta<typeof ConditionInput> = {
207
+ title: 'Agent Helper/ConditionInput',
208
+ component: ConditionInput,
209
+ tags: ['autodocs'],
210
+ parameters: {
211
+ layout: 'centered',
212
+ },
213
+ args: {
214
+ targetName: '流程结束 或 流程节点',
215
+ fields: mockFields,
216
+ disabled: false,
217
+ },
218
+ decorators: [
219
+ (Story) => (
220
+ <div style={{ width: '960px' }}>
221
+ <Story />
222
+ </div>
223
+ ),
224
+ ],
225
+ };
226
+
227
+ export default meta;
228
+ type Story = StoryObj<typeof meta>;
229
+
230
+ export const Empty: Story = {
231
+ args: {
232
+ targetName: '流程结束 或 流程节点',
233
+ fields: mockFields,
234
+ },
235
+ };
236
+
237
+ export const WithConditions: Story = {
238
+ args: {
239
+ targetName: '流程结束 或 流程节点',
240
+ fields: mockFields,
241
+ defaultValue: {
242
+ targetName: '流程结束 或 流程节点',
243
+ quantifier: 'all',
244
+ items: [
245
+ {
246
+ id: 'item-1',
247
+ field: mockFields[0],
248
+ operator: 'contains',
249
+ value: '张三',
250
+ },
251
+ {
252
+ id: 'item-2',
253
+ field: mockFields[1],
254
+ operator: 'gte',
255
+ value: 18,
256
+ },
257
+ ],
258
+ },
259
+ },
260
+ };
261
+
262
+ export const WithDeleteAll: Story = {
263
+ args: {
264
+ targetName: '流程结束 或 流程节点',
265
+ fields: mockFields,
266
+ defaultValue: {
267
+ targetName: '流程结束 或 流程节点',
268
+ quantifier: 'any',
269
+ items: [
270
+ {
271
+ id: 'item-1',
272
+ field: mockFields[0],
273
+ operator: 'contains',
274
+ value: '张三',
275
+ },
276
+ {
277
+ id: 'item-2',
278
+ field: mockFields[1],
279
+ operator: 'gte',
280
+ value: 18,
281
+ },
282
+ {
283
+ id: 'item-3',
284
+ field: mockFields[5],
285
+ operator: 'in',
286
+ value: ['beijing', 'shanghai'],
287
+ },
288
+ {
289
+ id: 'item-4',
290
+ field: mockFields[2],
291
+ operator: 'range',
292
+ value: undefined,
293
+ },
294
+ ],
295
+ },
296
+ },
297
+ };
298
+
299
+ export const Controlled: Story = {
300
+ render: () => {
301
+ const [condition, setCondition] = useState<ICondition>({
302
+ targetName: '流程结束 或 流程节点',
303
+ quantifier: 'all',
304
+ items: [
305
+ {
306
+ id: 'item-1',
307
+ field: mockFields[0],
308
+ operator: 'contains',
309
+ value: '张三',
310
+ },
311
+ {
312
+ id: 'item-2',
313
+ field: mockFields[1],
314
+ operator: 'gte',
315
+ value: 18,
316
+ },
317
+ ],
318
+ });
319
+
320
+ const handleChange = useCallback((newCondition: ICondition) => {
321
+ setCondition(newCondition);
322
+ }, []);
323
+
324
+ return (
325
+ <div className="flex flex-col gap-[16px]">
326
+ <ConditionInput
327
+ targetName="流程结束 或 流程节点"
328
+ fields={mockFields}
329
+ value={condition}
330
+ onChange={handleChange}
331
+ />
332
+ <div className="text-[12px] text-[#666666] bg-[#F5F5F5] rounded-[4px] p-[8px] font-mono">
333
+ <pre>{JSON.stringify(condition, null, 2)}</pre>
334
+ </div>
335
+ </div>
336
+ );
337
+ },
338
+ };
339
+
340
+ export const RangeOperators: Story = {
341
+ args: {
342
+ targetName: '流程结束',
343
+ fields: mockFields,
344
+ service: mockService,
345
+ defaultValue: {
346
+ targetName: '流程结束',
347
+ quantifier: 'all',
348
+ items: [
349
+ {
350
+ id: 'range-1',
351
+ field: mockFields[1], // number: 年龄
352
+ operator: 'range',
353
+ value: { min: 18, max: 60 },
354
+ },
355
+ {
356
+ id: 'range-2',
357
+ field: mockFields[2], // datetime: 出生日期
358
+ operator: 'range',
359
+ value: { min: '2020-01-01T00:00', max: '2025-12-31T23:59' },
360
+ },
361
+ ],
362
+ },
363
+ },
364
+ };
365
+
366
+ export const MultiSelectOperators: Story = {
367
+ args: {
368
+ targetName: '流程结束',
369
+ fields: mockFields,
370
+ service: mockService,
371
+ defaultValue: {
372
+ targetName: '流程结束',
373
+ quantifier: 'any',
374
+ items: [
375
+ {
376
+ id: 'ms-1',
377
+ field: mockFields[0], // text: 姓名 (in operator → TextMultiSelect)
378
+ operator: 'in',
379
+ value: ['apple', 'banana'],
380
+ },
381
+ {
382
+ id: 'ms-2',
383
+ field: mockFields[8], // user: 负责人 (in operator → AsyncPicker multiple)
384
+ operator: 'in',
385
+ value: ['user1', 'user2'],
386
+ },
387
+ {
388
+ id: 'ms-3',
389
+ field: mockFields[9], // dept: 所属部门 (nin operator → AsyncPicker multiple)
390
+ operator: 'nin',
391
+ value: ['dept1'],
392
+ },
393
+ ],
394
+ },
395
+ },
396
+ };
397
+
398
+ export const MixedOperators: Story = {
399
+ args: {
400
+ targetName: '表单数据',
401
+ fields: mockFields,
402
+ service: mockService,
403
+ defaultValue: {
404
+ targetName: '表单数据',
405
+ quantifier: 'all',
406
+ items: [
407
+ {
408
+ id: 'mixed-1',
409
+ field: mockFields[0], // text: contains
410
+ operator: 'contains',
411
+ value: '张',
412
+ },
413
+ {
414
+ id: 'mixed-2',
415
+ field: mockFields[1], // number: range → RangeNumberInput
416
+ operator: 'range',
417
+ value: { min: 0, max: 100 },
418
+ },
419
+ {
420
+ id: 'mixed-3',
421
+ field: mockFields[2], // datetime: range → RangeDateTimeInput
422
+ operator: 'range',
423
+ value: { min: '2025-01-01T00:00', max: '2025-06-30T23:59' },
424
+ },
425
+ {
426
+ id: 'mixed-4',
427
+ field: mockFields[0], // text: in → TextMultiSelect
428
+ operator: 'in',
429
+ value: ['orange', 'grape'],
430
+ },
431
+ ],
432
+ },
433
+ },
434
+ };
435
+
436
+ export const AllFieldTypes: Story = {
437
+ args: {
438
+ targetName: '表单',
439
+ fields: mockFields,
440
+ service: mockService,
441
+ defaultValue: {
442
+ targetName: '表单',
443
+ quantifier: 'all',
444
+ items: [
445
+ { id: 'f-text', field: mockFields[0], operator: 'contains', value: '张' },
446
+ { id: 'f-number', field: mockFields[1], operator: 'range', value: { min: 18, max: 65 } },
447
+ { id: 'f-datetime', field: mockFields[2], operator: 'range', value: { min: '2025-01-01T00:00', max: '2025-12-31T23:59' } },
448
+ { id: 'f-textarea', field: mockFields[3], operator: 'contains', value: '关键词' },
449
+ { id: 'f-radiogroup', field: mockFields[4], operator: 'eq', value: 'male' },
450
+ { id: 'f-combo', field: mockFields[5], operator: 'in', value: ['beijing', 'shanghai'] },
451
+ { id: 'f-checkboxgroup', field: mockFields[6], operator: 'all', value: ['reading', 'sports'] },
452
+ { id: 'f-upload', field: mockFields[7], operator: 'not_empty', value: undefined },
453
+ { id: 'f-user', field: mockFields[8], operator: 'in', value: ['user1', 'user2'] },
454
+ { id: 'f-dept', field: mockFields[9], operator: 'nin', value: ['dept3'] },
455
+ { id: 'f-password', field: mockFields[10], operator: 'eq', value: 'secret' },
456
+ { id: 'f-radio', field: mockFields[11], operator: 'neq', value: 'female' },
457
+ { id: 'f-combocheck', field: mockFields[12], operator: 'all', value: ['a', 'b'] },
458
+ { id: 'f-address', field: mockFields[13], operator: 'eq', value: { province: '浙江省', city: '杭州市', district: '西湖区' } },
459
+ { id: 'f-location', field: mockFields[14], operator: 'eq', value: { province: '北京市', city: '北京市', district: '朝阳区' } },
460
+ { id: 'f-sn', field: mockFields[15], operator: 'in', value: ['SN001', 'SN002'] },
461
+ { id: 'f-usergroup', field: mockFields[16], operator: 'in', value: ['ug1'] },
462
+ { id: 'f-deptgroup', field: mockFields[17], operator: 'all', value: ['dg1'] },
463
+ { id: 'f-image', field: mockFields[18], operator: 'not_empty', value: undefined },
464
+ { id: 'f-linkdata', field: mockFields[19], operator: 'eq', value: 'a' },
465
+ { id: 'f-flowstate', field: mockFields[20], operator: 'eq', value: 'active' },
466
+ { id: 'f-signature', field: mockFields[21], operator: 'empty', value: undefined },
467
+ ],
468
+ },
469
+ },
470
+ };
471
+
472
+ export const Disabled: Story = {
473
+ args: {
474
+ targetName: '流程结束 或 流程节点',
475
+ fields: mockFields,
476
+ disabled: true,
477
+ defaultValue: {
478
+ targetName: '流程结束 或 流程节点',
479
+ quantifier: 'all',
480
+ items: [
481
+ {
482
+ id: 'item-1',
483
+ field: mockFields[0],
484
+ operator: 'contains',
485
+ value: '张三',
486
+ },
487
+ {
488
+ id: 'item-2',
489
+ field: mockFields[1],
490
+ operator: 'gte',
491
+ value: 18,
492
+ },
493
+ {
494
+ id: 'item-3',
495
+ field: mockFields[5],
496
+ operator: 'in',
497
+ value: ['beijing', 'shanghai'],
498
+ },
499
+ ],
500
+ },
501
+ },
502
+ };