@gm-pc/react 1.24.9-beta.13 → 1.24.9-beta.14

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 (399) hide show
  1. package/package.json +3 -3
  2. package/src/common/hooks/index.ts +5 -5
  3. package/src/common/hooks/use_form/index.ts +2 -2
  4. package/src/common/hooks/use_form/use_form.ts +184 -184
  5. package/src/common/hooks/use_form/utils.ts +23 -23
  6. package/src/common/hooks/use_mutation_observer.ts +19 -19
  7. package/src/common/utils/date.ts +28 -28
  8. package/src/common/utils/get_record_partical_object.ts +4 -4
  9. package/src/common/utils/index.ts +3 -3
  10. package/src/common/utils/utils.ts +16 -16
  11. package/src/component/affix/affix.tsx +31 -31
  12. package/src/component/affix/index.ts +2 -2
  13. package/src/component/affix/stories.tsx +16 -16
  14. package/src/component/affix/style.less +3 -3
  15. package/src/component/auto_complete/auto_complete.tsx +202 -202
  16. package/src/component/auto_complete/index.ts +6 -6
  17. package/src/component/auto_complete/stories.tsx +37 -37
  18. package/src/component/auto_full/auto_full.tsx +36 -36
  19. package/src/component/auto_full/index.ts +1 -1
  20. package/src/component/box/box.tsx +29 -29
  21. package/src/component/box/box_form.tsx +83 -83
  22. package/src/component/box/box_pagination.tsx +12 -12
  23. package/src/component/box/box_panel.tsx +91 -91
  24. package/src/component/box/box_table.tsx +57 -57
  25. package/src/component/box/index.ts +10 -10
  26. package/src/component/box/stories.tsx +119 -119
  27. package/src/component/box/style.less +41 -41
  28. package/src/component/button/button.tsx +94 -94
  29. package/src/component/button/button_text.tsx +33 -33
  30. package/src/component/button/index.ts +4 -4
  31. package/src/component/button/stories.tsx +131 -131
  32. package/src/component/button/style.less +158 -158
  33. package/src/component/calendar/calendar.tsx +25 -25
  34. package/src/component/calendar/content.tsx +87 -87
  35. package/src/component/calendar/day.tsx +106 -106
  36. package/src/component/calendar/head.tsx +244 -244
  37. package/src/component/calendar/index.ts +4 -4
  38. package/src/component/calendar/range_calendar.tsx +121 -121
  39. package/src/component/calendar/stories.tsx +54 -54
  40. package/src/component/calendar/style.less +136 -136
  41. package/src/component/calendar/types.ts +54 -54
  42. package/src/component/calendar/week.tsx +27 -27
  43. package/src/component/card/card.tsx +148 -148
  44. package/src/component/card/form_card.tsx +42 -42
  45. package/src/component/card/index.ts +2 -2
  46. package/src/component/card/stories.tsx +90 -90
  47. package/src/component/card/style.less +125 -125
  48. package/src/component/checkbox/checkbox.tsx +75 -75
  49. package/src/component/checkbox/checkbox_group.tsx +51 -51
  50. package/src/component/checkbox/index.ts +5 -5
  51. package/src/component/checkbox/stories.tsx +152 -152
  52. package/src/component/checkbox/style.less +73 -73
  53. package/src/component/checkbox/util.ts +19 -19
  54. package/src/component/collapse/collapse.tsx +27 -27
  55. package/src/component/collapse/index.ts +2 -2
  56. package/src/component/collapse/stories.tsx +21 -21
  57. package/src/component/color_picker/color_list.ts +34 -34
  58. package/src/component/color_picker/color_picker.tsx +43 -43
  59. package/src/component/color_picker/color_select.tsx +97 -97
  60. package/src/component/color_picker/index.ts +2 -2
  61. package/src/component/color_picker/stories.tsx +20 -20
  62. package/src/component/color_picker/style.less +41 -41
  63. package/src/component/config_provider/config_provider.tsx +16 -16
  64. package/src/component/config_provider/context.ts +10 -10
  65. package/src/component/config_provider/index.ts +3 -3
  66. package/src/component/controlled_form/context.tsx +18 -18
  67. package/src/component/controlled_form/controlled_form.tsx +141 -141
  68. package/src/component/controlled_form/index.ts +8 -8
  69. package/src/component/controlled_form/items/index.tsx +115 -115
  70. package/src/component/controlled_form/items/utils.ts +132 -132
  71. package/src/component/controlled_form/stories/components/date_range_filter.tsx +83 -83
  72. package/src/component/controlled_form/stories/components/index.ts +2 -2
  73. package/src/component/controlled_form/stories/components/search_filter.tsx +52 -52
  74. package/src/component/controlled_form/stories/stories.tsx +372 -372
  75. package/src/component/date_picker/date_picker.tsx +183 -183
  76. package/src/component/date_picker/index.ts +2 -2
  77. package/src/component/date_picker/overlay.tsx +106 -106
  78. package/src/component/date_picker/stories.tsx +108 -108
  79. package/src/component/date_picker/style.less +23 -23
  80. package/src/component/date_picker/time_select.tsx +58 -58
  81. package/src/component/date_picker/types.ts +7 -7
  82. package/src/component/date_range_picker/date_range_picker.tsx +144 -144
  83. package/src/component/date_range_picker/index.ts +2 -2
  84. package/src/component/date_range_picker/left.tsx +107 -107
  85. package/src/component/date_range_picker/overlay.tsx +204 -204
  86. package/src/component/date_range_picker/stories.tsx +181 -181
  87. package/src/component/date_range_picker/style.less +41 -41
  88. package/src/component/date_range_picker/time_range_select.tsx +144 -144
  89. package/src/component/date_range_picker/two.tsx +108 -108
  90. package/src/component/date_range_picker/types.ts +42 -42
  91. package/src/component/date_range_picker/util.ts +11 -11
  92. package/src/component/dialog/alert.tsx +38 -38
  93. package/src/component/dialog/confirm.tsx +120 -120
  94. package/src/component/dialog/delete_com.tsx +27 -27
  95. package/src/component/dialog/dialog.tsx +70 -70
  96. package/src/component/dialog/index.ts +16 -16
  97. package/src/component/dialog/prompt.tsx +95 -95
  98. package/src/component/dialog/stories.tsx +195 -195
  99. package/src/component/dialog/types.ts +70 -70
  100. package/src/component/divider/divider.tsx +25 -25
  101. package/src/component/divider/index.ts +2 -2
  102. package/src/component/divider/stories.tsx +14 -14
  103. package/src/component/divider/style.less +29 -29
  104. package/src/component/flex/flex.tsx +133 -133
  105. package/src/component/flex/index.ts +2 -2
  106. package/src/component/flex/stories.tsx +17 -17
  107. package/src/component/flex/style.less +105 -105
  108. package/src/component/flip_number/flip_number.tsx +209 -209
  109. package/src/component/flip_number/index.ts +2 -2
  110. package/src/component/flip_number/stories.tsx +28 -28
  111. package/src/component/flip_number/utils.ts +58 -58
  112. package/src/component/form/context.tsx +15 -15
  113. package/src/component/form/form.tsx +142 -142
  114. package/src/component/form/form_block.tsx +39 -39
  115. package/src/component/form/form_button.tsx +28 -28
  116. package/src/component/form/form_group.tsx +157 -157
  117. package/src/component/form/form_item.tsx +141 -141
  118. package/src/component/form/form_panel.tsx +63 -63
  119. package/src/component/form/index.ts +15 -15
  120. package/src/component/form/stories.tsx +448 -448
  121. package/src/component/form/style.less +159 -159
  122. package/src/component/form/types.ts +110 -110
  123. package/src/component/function_set/function_set.tsx +84 -84
  124. package/src/component/function_set/index.ts +2 -2
  125. package/src/component/function_set/overlay.tsx +41 -41
  126. package/src/component/function_set/stories.tsx +71 -71
  127. package/src/component/function_set/types.ts +15 -15
  128. package/src/component/function_set/utils.ts +21 -21
  129. package/src/component/grid/col.tsx +55 -55
  130. package/src/component/grid/index.ts +3 -3
  131. package/src/component/grid/mixin.less +48 -48
  132. package/src/component/grid/row.tsx +27 -27
  133. package/src/component/grid/stories.tsx +65 -65
  134. package/src/component/grid/style.less +27 -27
  135. package/src/component/grid/types.ts +35 -35
  136. package/src/component/grid/util.ts +12 -12
  137. package/src/component/icon_down_up/icon_down_up.tsx +22 -22
  138. package/src/component/icon_down_up/index.ts +2 -2
  139. package/src/component/icon_down_up/stories.tsx +21 -21
  140. package/src/component/icon_down_up/style.less +10 -10
  141. package/src/component/icon_expand/icon_expand.tsx +22 -22
  142. package/src/component/icon_expand/index.ts +1 -1
  143. package/src/component/img_uploader/img_uploader.tsx +168 -168
  144. package/src/component/img_uploader/index.ts +2 -2
  145. package/src/component/img_uploader/stories.tsx +58 -58
  146. package/src/component/img_uploader/style.less +22 -22
  147. package/src/component/input/index.ts +5 -5
  148. package/src/component/input/input.tsx +24 -24
  149. package/src/component/input/input_close.tsx +51 -51
  150. package/src/component/input/stories.tsx +56 -56
  151. package/src/component/input/style.less +33 -33
  152. package/src/component/input_number/index.ts +2 -2
  153. package/src/component/input_number/input_number.tsx +115 -115
  154. package/src/component/input_number/stories.tsx +27 -27
  155. package/src/component/input_number/style.less +10 -10
  156. package/src/component/input_number/utils.ts +44 -44
  157. package/src/component/label/index.tsx +19 -19
  158. package/src/component/label/stories.tsx +26 -26
  159. package/src/component/label/style.less +34 -34
  160. package/src/component/layout_root/index.ts +2 -2
  161. package/src/component/layout_root/layout_root.tsx +116 -116
  162. package/src/component/layout_root/types.ts +38 -38
  163. package/src/component/level_list/index.ts +2 -2
  164. package/src/component/level_list/level_item.tsx +79 -79
  165. package/src/component/level_list/level_list.tsx +123 -123
  166. package/src/component/level_list/stories/constants.ts +72 -72
  167. package/src/component/level_list/stories/stories.tsx +87 -87
  168. package/src/component/level_list/style.less +41 -41
  169. package/src/component/level_list/types.ts +36 -36
  170. package/src/component/level_list/utils.ts +19 -19
  171. package/src/component/level_select/index.ts +7 -7
  172. package/src/component/level_select/level_select.tsx +216 -216
  173. package/src/component/level_select/multiple_level_select.tsx +104 -104
  174. package/src/component/level_select/stories.tsx +102 -102
  175. package/src/component/level_select/types.ts +38 -38
  176. package/src/component/level_select/util.ts +20 -20
  177. package/src/component/list/base.tsx +129 -129
  178. package/src/component/list/index.ts +3 -3
  179. package/src/component/list/list.tsx +61 -61
  180. package/src/component/list/stories.tsx +113 -113
  181. package/src/component/list/style.less +58 -58
  182. package/src/component/list/types.ts +37 -37
  183. package/src/component/loading/index.ts +10 -10
  184. package/src/component/loading/loading.tsx +26 -26
  185. package/src/component/loading/loading_chunk.tsx +37 -37
  186. package/src/component/loading/loading_full_screen.tsx +45 -45
  187. package/src/component/loading/stories.tsx +43 -43
  188. package/src/component/loading/style.less +69 -69
  189. package/src/component/loading/types.ts +30 -30
  190. package/src/component/mask/index.ts +2 -2
  191. package/src/component/mask/mask.tsx +22 -22
  192. package/src/component/mask/style.less +10 -10
  193. package/src/component/modal/clean_modal.tsx +14 -14
  194. package/src/component/modal/index.ts +5 -5
  195. package/src/component/modal/modal.tsx +145 -145
  196. package/src/component/modal/right_side_modal.tsx +22 -22
  197. package/src/component/modal/stories.tsx +132 -132
  198. package/src/component/modal/style.less +138 -138
  199. package/src/component/modal/types.ts +27 -27
  200. package/src/component/more_select/base.tsx +408 -408
  201. package/src/component/more_select/index.ts +6 -6
  202. package/src/component/more_select/more_select.tsx +137 -137
  203. package/src/component/more_select/render_list_filter.ts +39 -39
  204. package/src/component/more_select/stories.tsx +323 -323
  205. package/src/component/more_select/style.less +72 -72
  206. package/src/component/more_select/types.ts +114 -114
  207. package/src/component/multiple_selection/index.ts +2 -2
  208. package/src/component/multiple_selection/multiple_selection.tsx +118 -118
  209. package/src/component/multiple_selection/stories.tsx +37 -37
  210. package/src/component/multiple_selection/style.less +57 -57
  211. package/src/component/n_progress/index.ts +1 -1
  212. package/src/component/n_progress/n_progress.tsx +39 -39
  213. package/src/component/n_progress/stories.tsx +25 -25
  214. package/src/component/n_progress/style.less +39 -39
  215. package/src/component/nav/a.tsx +7 -7
  216. package/src/component/nav/index.ts +10 -10
  217. package/src/component/nav/nav.tsx +114 -114
  218. package/src/component/nav/nav_item.tsx +98 -98
  219. package/src/component/nav/nav_single_item.tsx +28 -28
  220. package/src/component/nav/popup.tsx +100 -100
  221. package/src/component/nav/portal.ts +17 -17
  222. package/src/component/nav/stories.tsx +152 -152
  223. package/src/component/nav/style.less +246 -246
  224. package/src/component/nav/types.ts +93 -93
  225. package/src/component/pagination/index.ts +2 -2
  226. package/src/component/pagination/left.tsx +45 -45
  227. package/src/component/pagination/page_with_count.tsx +115 -115
  228. package/src/component/pagination/page_without_count.tsx +64 -64
  229. package/src/component/pagination/pagination.tsx +23 -23
  230. package/src/component/pagination/right.tsx +78 -78
  231. package/src/component/pagination/stories.tsx +62 -62
  232. package/src/component/pagination/style.less +51 -51
  233. package/src/component/pagination/types.ts +16 -16
  234. package/src/component/pagination/util.ts +7 -7
  235. package/src/component/popover/index.ts +2 -2
  236. package/src/component/popover/popover.tsx +279 -279
  237. package/src/component/popover/stories.tsx +104 -104
  238. package/src/component/popover/types.ts +25 -25
  239. package/src/component/popover/utils.ts +22 -22
  240. package/src/component/popup/element_in_viewport.ts +33 -33
  241. package/src/component/popup/index.ts +4 -4
  242. package/src/component/popup/popup.tsx +149 -149
  243. package/src/component/popup/popup_content_confirm.tsx +106 -106
  244. package/src/component/popup/style.less +107 -107
  245. package/src/component/price/constant.ts +4 -4
  246. package/src/component/price/event_bus.ts +13 -13
  247. package/src/component/price/index.ts +2 -2
  248. package/src/component/price/price.tsx +152 -152
  249. package/src/component/price/stories.tsx +22 -22
  250. package/src/component/progress/index.ts +2 -2
  251. package/src/component/progress/progress.tsx +53 -53
  252. package/src/component/progress/stories.tsx +20 -20
  253. package/src/component/progress/style.less +35 -35
  254. package/src/component/progress_circle/index.ts +2 -2
  255. package/src/component/progress_circle/progress_circle.tsx +85 -85
  256. package/src/component/progress_circle/stories.tsx +31 -31
  257. package/src/component/progress_circle/style.less +21 -21
  258. package/src/component/radio/index.ts +5 -5
  259. package/src/component/radio/radio.tsx +72 -72
  260. package/src/component/radio/radio_group.tsx +48 -48
  261. package/src/component/radio/stories.tsx +103 -103
  262. package/src/component/radio/style.less +56 -56
  263. package/src/component/radio/util.ts +19 -19
  264. package/src/component/recommend_input/index.ts +2 -2
  265. package/src/component/recommend_input/recommend_input.tsx +100 -100
  266. package/src/component/recommend_input/stories.tsx +47 -47
  267. package/src/component/recommend_input/style.less +25 -25
  268. package/src/component/select/index.ts +2 -2
  269. package/src/component/select/select.tsx +172 -171
  270. package/src/component/select/stories.tsx +140 -140
  271. package/src/component/select/style.less +4 -4
  272. package/src/component/select/types.ts +29 -29
  273. package/src/component/selection/index.ts +2 -2
  274. package/src/component/selection/selection.tsx +162 -162
  275. package/src/component/selection/stories.tsx +45 -45
  276. package/src/component/selection/style.less +65 -65
  277. package/src/component/steps/index.ts +2 -2
  278. package/src/component/steps/steps.tsx +61 -61
  279. package/src/component/steps/stories.tsx +18 -18
  280. package/src/component/steps/style.less +39 -39
  281. package/src/component/storage/index.ts +1 -1
  282. package/src/component/storage/storage.ts +7 -7
  283. package/src/component/storage/stories.tsx +7 -7
  284. package/src/component/switch/index.ts +2 -2
  285. package/src/component/switch/stories.tsx +39 -39
  286. package/src/component/switch/style.less +60 -60
  287. package/src/component/switch/switch.tsx +127 -127
  288. package/src/component/table_select/index.ts +2 -2
  289. package/src/component/table_select/stories.tsx +97 -97
  290. package/src/component/table_select/style.less +20 -20
  291. package/src/component/table_select/table_select.tsx +92 -92
  292. package/src/component/table_select/types.ts +30 -30
  293. package/src/component/table_select/util.ts +15 -15
  294. package/src/component/tabs/index.ts +2 -2
  295. package/src/component/tabs/stories.tsx +172 -172
  296. package/src/component/tabs/style.less +149 -149
  297. package/src/component/tabs/tabs.tsx +232 -232
  298. package/src/component/textarea/index.ts +3 -3
  299. package/src/component/textarea/stories.tsx +37 -37
  300. package/src/component/textarea/style.less +12 -12
  301. package/src/component/textarea/textarea.tsx +22 -22
  302. package/src/component/time_span/index.ts +4 -4
  303. package/src/component/time_span/stories.tsx +87 -87
  304. package/src/component/time_span/style.less +45 -45
  305. package/src/component/time_span/time_span.tsx +129 -129
  306. package/src/component/time_span/time_span_picker.tsx +71 -71
  307. package/src/component/time_span/types.ts +58 -58
  308. package/src/component/time_span/util.ts +18 -18
  309. package/src/component/tip/index.ts +2 -2
  310. package/src/component/tip/stories.tsx +44 -44
  311. package/src/component/tip/style.less +53 -53
  312. package/src/component/tip/tip.tsx +95 -95
  313. package/src/component/tip/types.ts +20 -20
  314. package/src/component/tooltip/index.ts +2 -2
  315. package/src/component/tooltip/stories.tsx +32 -32
  316. package/src/component/tooltip/tooltip.tsx +40 -40
  317. package/src/component/transfer/index.ts +2 -2
  318. package/src/component/transfer/stories.tsx +140 -140
  319. package/src/component/transfer/transfer.tsx +147 -147
  320. package/src/component/transfer/types.ts +42 -42
  321. package/src/component/tree/bottom.tsx +34 -34
  322. package/src/component/tree/find.tsx +73 -73
  323. package/src/component/tree/index.ts +2 -2
  324. package/src/component/tree/item.tsx +75 -75
  325. package/src/component/tree/list.tsx +123 -123
  326. package/src/component/tree/search.tsx +29 -29
  327. package/src/component/tree/stories.tsx +309 -309
  328. package/src/component/tree/style.less +35 -35
  329. package/src/component/tree/tree.tsx +238 -238
  330. package/src/component/tree/types.ts +155 -155
  331. package/src/component/tree/util.ts +208 -208
  332. package/src/component/uploader/default_container.tsx +24 -24
  333. package/src/component/uploader/default_image.tsx +15 -15
  334. package/src/component/uploader/index.ts +10 -10
  335. package/src/component/uploader/stories.tsx +53 -53
  336. package/src/component/uploader/style.less +22 -22
  337. package/src/component/uploader/types.ts +25 -25
  338. package/src/component/uploader/uploader.tsx +62 -62
  339. package/src/component/v_browser/context/browser.ts +7 -7
  340. package/src/component/v_browser/context/browserWindow.ts +7 -7
  341. package/src/component/v_browser/hooks/useWindowEffect.ts +53 -53
  342. package/src/component/v_browser/index.ts +4 -4
  343. package/src/component/v_browser/types.ts +46 -46
  344. package/src/component/v_browser/ui/iframe_portal.tsx +28 -28
  345. package/src/component/v_browser/ui/index.tsx +213 -213
  346. package/src/component/v_browser/ui/style.less +113 -113
  347. package/src/component/v_browser/ui/window_wrapper.tsx +74 -74
  348. package/src/component/v_browser/v_browser.stories.mdx +128 -128
  349. package/src/component/v_browser/v_browser.tsx +287 -287
  350. package/src/css/base.less +64 -64
  351. package/src/css/bg.less +52 -52
  352. package/src/css/border.less +40 -40
  353. package/src/css/cursor.less +19 -19
  354. package/src/css/display.less +16 -16
  355. package/src/css/distance.less +93 -93
  356. package/src/css/error.less +8 -8
  357. package/src/css/other.less +15 -15
  358. package/src/css/overflow.less +23 -23
  359. package/src/css/position.less +11 -11
  360. package/src/css/svg.less +48 -48
  361. package/src/css/text.less +127 -127
  362. package/src/css/var/mixin.less +75 -75
  363. package/src/css/var/variables.less +125 -125
  364. package/src/event_type.ts +11 -11
  365. package/src/index.less +64 -64
  366. package/src/index.ts +61 -61
  367. package/src/svg/calendar-month.svg +8 -8
  368. package/src/svg/calendar-year.svg +13 -13
  369. package/src/svg/calendar.svg +17 -17
  370. package/src/svg/check-detail.svg +18 -18
  371. package/src/svg/close-circle.svg +13 -13
  372. package/src/svg/close-square.svg +12 -12
  373. package/src/svg/closeup.svg +20 -20
  374. package/src/svg/delete.svg +10 -10
  375. package/src/svg/down-small.svg +1 -1
  376. package/src/svg/down.svg +1 -1
  377. package/src/svg/edit-box.svg +17 -17
  378. package/src/svg/edit-pen.svg +17 -17
  379. package/src/svg/empty.svg +27 -27
  380. package/src/svg/expand.svg +21 -21
  381. package/src/svg/left-small.svg +1 -1
  382. package/src/svg/more.svg +10 -10
  383. package/src/svg/next.svg +40 -40
  384. package/src/svg/pen.svg +12 -12
  385. package/src/svg/remove.svg +1 -1
  386. package/src/svg/right-small.svg +1 -1
  387. package/src/svg/search.svg +8 -8
  388. package/src/svg/setting.svg +17 -17
  389. package/src/svg/up-small.svg +1 -1
  390. package/src/svg/up.svg +1 -1
  391. package/src/svg/vbrowser-tab-delete.svg +8 -8
  392. package/src/svg/vbrowser-tab-left.svg +8 -8
  393. package/src/svg/vbrowser-tab-right.svg +8 -8
  394. package/src/types.ts +33 -33
  395. package/src/validator/index.ts +16 -16
  396. package/src/validator/rules.ts +61 -61
  397. package/src/validator/types.ts +10 -10
  398. package/src/validator/validator.ts +95 -95
  399. package/src/var.less +2 -2
@@ -1,408 +1,408 @@
1
- import React, {
2
- ChangeEvent,
3
- Component,
4
- createRef,
5
- MouseEvent,
6
- ReactNode,
7
- KeyboardEvent,
8
- } from 'react'
9
- import classNames from 'classnames'
10
- import _ from 'lodash'
11
- import { MoreSelectBaseProps, MoreSelectGroupDataItem, MoreSelectDataItem } from './types'
12
- import { Popover } from '../popover'
13
- import { Flex } from '../flex'
14
- import SVGRemove from '../../svg/remove.svg'
15
- import SVGCloseCircle from '../../svg/close-circle.svg'
16
- import { renderListFilterDefault, renderListFilterPinYin } from './render_list_filter'
17
- import { Input } from '../input'
18
- import { Loading } from '../loading'
19
- import { getLocale } from '@gm-pc/locales'
20
- import { ListBase } from '../list'
21
- import { findDOMNode } from 'react-dom'
22
- import { ConfigConsumer, ConfigProvider, ConfigProviderProps } from '../config_provider'
23
-
24
- interface MoreSelectBaseState {
25
- searchValue: string
26
- loading: boolean
27
- /* keyboard 默认第一个位置 */
28
- willActiveIndex: number | null
29
- }
30
-
31
- // @todo keydown item disabled
32
- // 目前全键盘还没有这种场景,暂时不管
33
- class MoreSelectBase<V extends string | number = string> extends Component<
34
- MoreSelectBaseProps<V>,
35
- MoreSelectBaseState
36
- > {
37
- static renderListFilterDefault = renderListFilterDefault
38
- static renderListFilterPinYin = renderListFilterPinYin
39
-
40
- readonly state: MoreSelectBaseState = {
41
- searchValue: '',
42
- loading: false,
43
- willActiveIndex: this.props.isKeyboard ? 0 : null,
44
- }
45
-
46
- private _isUnmounted = false
47
- private _baseRef = createRef<HTMLDivElement>()
48
- private _selectionRef = createRef<HTMLDivElement>()
49
- private _popoverRef = createRef<Popover>()
50
- private _inputRef = createRef<HTMLInputElement>()
51
-
52
- private _filterData: MoreSelectGroupDataItem<V>[] | undefined
53
-
54
- constructor(props: MoreSelectBaseProps<V>) {
55
- super(props)
56
- if (props.selected?.length) {
57
- this._getFilterData()
58
- const flatList = this._getFlatFilterData()
59
- this.state.willActiveIndex = flatList.findIndex(
60
- (v) => v.value === props.selected[0].value
61
- )
62
- }
63
- }
64
-
65
- componentWillUnmount() {
66
- this._isUnmounted = false
67
- }
68
-
69
- public apiDoFocus = (): void => {
70
- // 唤起 popover,input autoFocus 会自动聚焦,但是这种方式本质是显示 UI
71
- // this.popoverRef.current.apiDoSetActive(true)
72
-
73
- // focus更符合直觉
74
- // eslint-disable-next-line react/no-find-dom-node
75
- ;(findDOMNode(this._selectionRef.current) as HTMLDivElement).focus()
76
- }
77
-
78
- public apiDoSelectWillActive = (): void => {
79
- const { selected = [], onSelect = _.noop, multiple } = this.props
80
- const { willActiveIndex } = this.state
81
- const flatList = this._getFlatFilterData()
82
- // 没有做过键盘操作啥也不做
83
- if (!_.isNil(willActiveIndex) && willActiveIndex < flatList.length) {
84
- if (multiple) {
85
- onSelect(_.uniqBy([...selected, flatList[willActiveIndex]], (item) => item.value))
86
- } else {
87
- onSelect([flatList[willActiveIndex]])
88
- }
89
- }
90
- }
91
-
92
- private _getFlatFilterData = (): MoreSelectDataItem<V>[] => {
93
- return _.flatMap(this._filterData, (v) => v.children)
94
- }
95
-
96
- private _handleSelect = (values: V[]): void => {
97
- const { onSelect = _.noop, data = [], multiple, selected = [] } = this.props
98
-
99
- const items: MoreSelectDataItem<V>[] = []
100
- data.forEach((group) => {
101
- group.children.forEach((child) => {
102
- if (values.includes(child.value)) {
103
- items.push(child)
104
- }
105
- })
106
- })
107
- selected.forEach((item) => {
108
- let flag = true // 判断当前已选择的选项中是否存在不在当前data里面的,解决onSearch异步,true则表示都不在data里面
109
- data.forEach((group) => {
110
- flag = flag && group.children.every((v) => v.value !== item.value)
111
- })
112
- if (flag) {
113
- items.push(item)
114
- }
115
- })
116
- onSelect(items)
117
-
118
- if (!multiple) {
119
- // 单选后关闭
120
- // 要异步
121
- window.setTimeout(() => {
122
- if (!this._isUnmounted && this._popoverRef.current) {
123
- this._popoverRef.current.apiDoSetActive(false)
124
- }
125
- }, 0)
126
- }
127
- }
128
-
129
- public _handleChange = (
130
- event: ChangeEvent<HTMLInputElement>,
131
- isInitSearch?: boolean
132
- ): void => {
133
- const searchValue = event.target.value
134
- this.setState({ searchValue })
135
- this._debounceDoSearch(searchValue)
136
- setTimeout(() => {
137
- // eslint-disable-next-line no-unused-expressions
138
- isInitSearch && this._inputRef.current?.select()
139
- if (this.props.searchOnActive) {
140
- localStorage.setItem('_GM-PC_MORESELECT_SEARCHVALUE', this.state.searchValue)
141
- }
142
- }, 100)
143
- }
144
-
145
- private _doSearch = (query: string): void => {
146
- const { onSearch, data = [] } = this.props
147
- if (!this._isUnmounted && onSearch) {
148
- const result = onSearch(query, data)
149
- if (!result) {
150
- return
151
- }
152
- this.setState({ loading: true })
153
-
154
- Promise.resolve(result).finally(() => {
155
- this.setState({ loading: false })
156
- })
157
- }
158
- }
159
-
160
- private _debounceDoSearch = _.debounce(this._doSearch, this.props.delay)
161
-
162
- private _handleClear = (clearItem: MoreSelectDataItem<V>, event: MouseEvent): void => {
163
- event.stopPropagation()
164
- const { onSelect = _.noop, selected = [] } = this.props
165
- const willSelected = selected.filter((item) => item.value !== clearItem.value)
166
- onSelect(willSelected)
167
- }
168
-
169
- private _handlePopupKeyDown = (event: KeyboardEvent): void => {
170
- const { onKeyDown } = this.props
171
- let willActiveIndex = this.state.willActiveIndex as number
172
- if (!onKeyDown) {
173
- // 没有事件的不用拦截
174
- return
175
- }
176
- // 不是上下方向键不用拦截
177
- if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') {
178
- onKeyDown(event)
179
- return
180
- }
181
- const flatList = this._getFlatFilterData()
182
- // 没有过滤数据,不用拦截
183
- if (!flatList.length) {
184
- onKeyDown(event)
185
- return
186
- }
187
-
188
- if (event.key === 'ArrowUp') {
189
- willActiveIndex--
190
- } else if (event.key === 'ArrowDown') {
191
- willActiveIndex++
192
- }
193
-
194
- // 修正
195
- if (willActiveIndex < 0) {
196
- willActiveIndex = flatList.length - 1
197
- } else if (willActiveIndex > flatList.length - 1) {
198
- willActiveIndex = 0
199
- }
200
- this.setState({ willActiveIndex })
201
- }
202
-
203
- private _getFilterData = () => {
204
- const { data = [], renderListFilter, renderListFilterType } = this.props
205
- const { searchValue } = this.state
206
- let filterData: MoreSelectGroupDataItem<V>[]
207
- if (renderListFilter) {
208
- filterData = renderListFilter(data, searchValue)
209
- } else if (renderListFilterType === 'pinyin') {
210
- filterData = renderListFilterPinYin(data, searchValue)
211
- } else {
212
- filterData = renderListFilterDefault(data, searchValue)
213
- }
214
- this._filterData = filterData
215
- return filterData
216
- }
217
-
218
- private _renderEmpty = (): ReactNode => {
219
- const { renderEmpty } = this.props
220
-
221
- if (typeof renderEmpty === 'function') {
222
- const result = renderEmpty(this.state.searchValue)
223
- if (result !== undefined) {
224
- return result
225
- }
226
- }
227
-
228
- return (
229
- <Flex alignCenter justifyCenter className='gm-bg gm-padding-5 gm-text-desc'>
230
- {getLocale('没有数据')}
231
- </Flex>
232
- )
233
- }
234
-
235
- private _renderList = (config: ConfigProviderProps): ReactNode => {
236
- const {
237
- selected = [],
238
- multiple,
239
- isGroupList,
240
- renderListItem,
241
- searchPlaceholder,
242
- listHeight,
243
- popupClassName,
244
- renderCustomizedBottom,
245
- } = this.props
246
- const { loading, searchValue, willActiveIndex } = this.state
247
- const filterData = this._getFilterData()
248
- return (
249
- <ConfigProvider {...config}>
250
- <div
251
- className={classNames('gm-more-select-popup', popupClassName)}
252
- onKeyDown={this._handlePopupKeyDown}
253
- >
254
- <div className='gm-more-select-popup-input'>
255
- <Input
256
- ref={this._inputRef}
257
- autoFocus
258
- value={searchValue}
259
- onChange={this._handleChange}
260
- placeholder={searchPlaceholder}
261
- />
262
- </div>
263
- <div style={{ height: listHeight }}>
264
- {loading && (
265
- <Flex alignCenter justifyCenter className='gm-bg gm-padding-5'>
266
- <Loading size='20px' />
267
- </Flex>
268
- )}
269
- {!loading && !filterData.length && this._renderEmpty()}
270
- {!loading && !!filterData.length && (
271
- <ListBase
272
- selected={selected.map((v) => v.value)}
273
- data={filterData}
274
- multiple={multiple}
275
- isGroupList={isGroupList}
276
- className='gm-border-0'
277
- renderItem={renderListItem}
278
- onSelect={this._handleSelect}
279
- isScrollTo
280
- willActiveIndex={willActiveIndex!}
281
- style={{ height: listHeight }}
282
- />
283
- )}
284
- </div>
285
- {!loading &&
286
- !!filterData.length &&
287
- renderCustomizedBottom &&
288
- renderCustomizedBottom(this._popoverRef)}
289
- </div>
290
- </ConfigProvider>
291
- )
292
- }
293
-
294
- private _handleMoreSelectClick = () => {
295
- const { onClick, selected } = this.props
296
- if (typeof onClick === 'function') {
297
- return onClick(selected)
298
- }
299
- }
300
-
301
- private _handlePopoverVisibleChange = (active: boolean) => {
302
- if (active && this.props.searchOnActive) {
303
- const searchValue = localStorage.getItem('_GM-PC_MORESELECT_SEARCHVALUE')
304
- if (searchValue) {
305
- this.setState({ searchValue })
306
- setTimeout(() => {
307
- // eslint-disable-next-line no-unused-expressions
308
- this._inputRef.current?.select()
309
- this._debounceDoSearch(searchValue)
310
- }, 0)
311
- }
312
- }
313
- }
314
-
315
- render() {
316
- const {
317
- isInPopup,
318
- disabled,
319
- disabledClose,
320
- selected = [],
321
- multiple,
322
- placeholder,
323
- renderSelected,
324
- className,
325
- style,
326
- popoverType,
327
- children,
328
- } = this.props
329
- return (
330
- <ConfigConsumer>
331
- {(config) => (
332
- <div
333
- ref={this._baseRef}
334
- onClick={this._handleMoreSelectClick}
335
- className={classNames(
336
- 'gm-more-select',
337
- {
338
- disabled,
339
- 'gm-more-select-multiple': multiple,
340
- },
341
- className
342
- )}
343
- style={style}
344
- >
345
- <Popover
346
- ref={this._popoverRef}
347
- type={popoverType}
348
- popup={() => this._renderList(config)}
349
- disabled={disabled}
350
- isInPopup={isInPopup}
351
- onVisibleChange={this._handlePopoverVisibleChange}
352
- >
353
- {children ?? (
354
- <Flex
355
- ref={this._selectionRef}
356
- tabIndex={0}
357
- wrap
358
- className='gm-more-select-selected'
359
- >
360
- {selected.length !== 0 ? (
361
- selected.map((item) => (
362
- <Flex
363
- key={item.value as any}
364
- className='gm-more-select-selected-item'
365
- >
366
- <Popover
367
- disabled={!this.props.isKeyboard}
368
- type='hover'
369
- popup={<div className='gm-padding-10'>{item.text}</div>}
370
- >
371
- <Flex flex column>
372
- {renderSelected!(item)}
373
- </Flex>
374
- </Popover>
375
- {multiple ? (
376
- <SVGRemove
377
- className='gm-cursor gm-more-select-clear-btn'
378
- onClick={
379
- disabled ? _.noop : this._handleClear.bind(this, item)
380
- }
381
- />
382
- ) : (
383
- !disabledClose && ( // 是否不限时清除按钮,仅单选可用
384
- <SVGCloseCircle
385
- onClick={
386
- disabled ? _.noop : this._handleClear.bind(this, item)
387
- }
388
- className='gm-cursor gm-more-select-clear-btn'
389
- />
390
- )
391
- )}
392
- </Flex>
393
- ))
394
- ) : (
395
- // 加多个 &nbsp; 避免对齐问题,有文本才有对齐
396
- <div className='gm-text-placeholder'>{placeholder}&nbsp; </div>
397
- )}
398
- </Flex>
399
- )}
400
- </Popover>
401
- </div>
402
- )}
403
- </ConfigConsumer>
404
- )
405
- }
406
- }
407
-
408
- export default MoreSelectBase
1
+ import React, {
2
+ ChangeEvent,
3
+ Component,
4
+ createRef,
5
+ MouseEvent,
6
+ ReactNode,
7
+ KeyboardEvent,
8
+ } from 'react'
9
+ import classNames from 'classnames'
10
+ import _ from 'lodash'
11
+ import { MoreSelectBaseProps, MoreSelectGroupDataItem, MoreSelectDataItem } from './types'
12
+ import { Popover } from '../popover'
13
+ import { Flex } from '../flex'
14
+ import SVGRemove from '../../svg/remove.svg'
15
+ import SVGCloseCircle from '../../svg/close-circle.svg'
16
+ import { renderListFilterDefault, renderListFilterPinYin } from './render_list_filter'
17
+ import { Input } from '../input'
18
+ import { Loading } from '../loading'
19
+ import { getLocale } from '@gm-pc/locales'
20
+ import { ListBase } from '../list'
21
+ import { findDOMNode } from 'react-dom'
22
+ import { ConfigConsumer, ConfigProvider, ConfigProviderProps } from '../config_provider'
23
+
24
+ interface MoreSelectBaseState {
25
+ searchValue: string
26
+ loading: boolean
27
+ /* keyboard 默认第一个位置 */
28
+ willActiveIndex: number | null
29
+ }
30
+
31
+ // @todo keydown item disabled
32
+ // 目前全键盘还没有这种场景,暂时不管
33
+ class MoreSelectBase<V extends string | number = string> extends Component<
34
+ MoreSelectBaseProps<V>,
35
+ MoreSelectBaseState
36
+ > {
37
+ static renderListFilterDefault = renderListFilterDefault
38
+ static renderListFilterPinYin = renderListFilterPinYin
39
+
40
+ readonly state: MoreSelectBaseState = {
41
+ searchValue: '',
42
+ loading: false,
43
+ willActiveIndex: this.props.isKeyboard ? 0 : null,
44
+ }
45
+
46
+ private _isUnmounted = false
47
+ private _baseRef = createRef<HTMLDivElement>()
48
+ private _selectionRef = createRef<HTMLDivElement>()
49
+ private _popoverRef = createRef<Popover>()
50
+ private _inputRef = createRef<HTMLInputElement>()
51
+
52
+ private _filterData: MoreSelectGroupDataItem<V>[] | undefined
53
+
54
+ constructor(props: MoreSelectBaseProps<V>) {
55
+ super(props)
56
+ if (props.selected?.length) {
57
+ this._getFilterData()
58
+ const flatList = this._getFlatFilterData()
59
+ this.state.willActiveIndex = flatList.findIndex(
60
+ (v) => v.value === props.selected[0].value
61
+ )
62
+ }
63
+ }
64
+
65
+ componentWillUnmount() {
66
+ this._isUnmounted = false
67
+ }
68
+
69
+ public apiDoFocus = (): void => {
70
+ // 唤起 popover,input autoFocus 会自动聚焦,但是这种方式本质是显示 UI
71
+ // this.popoverRef.current.apiDoSetActive(true)
72
+
73
+ // focus更符合直觉
74
+ // eslint-disable-next-line react/no-find-dom-node
75
+ ;(findDOMNode(this._selectionRef.current) as HTMLDivElement).focus()
76
+ }
77
+
78
+ public apiDoSelectWillActive = (): void => {
79
+ const { selected = [], onSelect = _.noop, multiple } = this.props
80
+ const { willActiveIndex } = this.state
81
+ const flatList = this._getFlatFilterData()
82
+ // 没有做过键盘操作啥也不做
83
+ if (!_.isNil(willActiveIndex) && willActiveIndex < flatList.length) {
84
+ if (multiple) {
85
+ onSelect(_.uniqBy([...selected, flatList[willActiveIndex]], (item) => item.value))
86
+ } else {
87
+ onSelect([flatList[willActiveIndex]])
88
+ }
89
+ }
90
+ }
91
+
92
+ private _getFlatFilterData = (): MoreSelectDataItem<V>[] => {
93
+ return _.flatMap(this._filterData, (v) => v.children)
94
+ }
95
+
96
+ private _handleSelect = (values: V[]): void => {
97
+ const { onSelect = _.noop, data = [], multiple, selected = [] } = this.props
98
+
99
+ const items: MoreSelectDataItem<V>[] = []
100
+ data.forEach((group) => {
101
+ group.children.forEach((child) => {
102
+ if (values.includes(child.value)) {
103
+ items.push(child)
104
+ }
105
+ })
106
+ })
107
+ selected.forEach((item) => {
108
+ let flag = true // 判断当前已选择的选项中是否存在不在当前data里面的,解决onSearch异步,true则表示都不在data里面
109
+ data.forEach((group) => {
110
+ flag = flag && group.children.every((v) => v.value !== item.value)
111
+ })
112
+ if (flag) {
113
+ items.push(item)
114
+ }
115
+ })
116
+ onSelect(items)
117
+
118
+ if (!multiple) {
119
+ // 单选后关闭
120
+ // 要异步
121
+ window.setTimeout(() => {
122
+ if (!this._isUnmounted && this._popoverRef.current) {
123
+ this._popoverRef.current.apiDoSetActive(false)
124
+ }
125
+ }, 0)
126
+ }
127
+ }
128
+
129
+ public _handleChange = (
130
+ event: ChangeEvent<HTMLInputElement>,
131
+ isInitSearch?: boolean
132
+ ): void => {
133
+ const searchValue = event.target.value
134
+ this.setState({ searchValue })
135
+ this._debounceDoSearch(searchValue)
136
+ setTimeout(() => {
137
+ // eslint-disable-next-line no-unused-expressions
138
+ isInitSearch && this._inputRef.current?.select()
139
+ if (this.props.searchOnActive) {
140
+ localStorage.setItem('_GM-PC_MORESELECT_SEARCHVALUE', this.state.searchValue)
141
+ }
142
+ }, 100)
143
+ }
144
+
145
+ private _doSearch = (query: string): void => {
146
+ const { onSearch, data = [] } = this.props
147
+ if (!this._isUnmounted && onSearch) {
148
+ const result = onSearch(query, data)
149
+ if (!result) {
150
+ return
151
+ }
152
+ this.setState({ loading: true })
153
+
154
+ Promise.resolve(result).finally(() => {
155
+ this.setState({ loading: false })
156
+ })
157
+ }
158
+ }
159
+
160
+ private _debounceDoSearch = _.debounce(this._doSearch, this.props.delay)
161
+
162
+ private _handleClear = (clearItem: MoreSelectDataItem<V>, event: MouseEvent): void => {
163
+ event.stopPropagation()
164
+ const { onSelect = _.noop, selected = [] } = this.props
165
+ const willSelected = selected.filter((item) => item.value !== clearItem.value)
166
+ onSelect(willSelected)
167
+ }
168
+
169
+ private _handlePopupKeyDown = (event: KeyboardEvent): void => {
170
+ const { onKeyDown } = this.props
171
+ let willActiveIndex = this.state.willActiveIndex as number
172
+ if (!onKeyDown) {
173
+ // 没有事件的不用拦截
174
+ return
175
+ }
176
+ // 不是上下方向键不用拦截
177
+ if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') {
178
+ onKeyDown(event)
179
+ return
180
+ }
181
+ const flatList = this._getFlatFilterData()
182
+ // 没有过滤数据,不用拦截
183
+ if (!flatList.length) {
184
+ onKeyDown(event)
185
+ return
186
+ }
187
+
188
+ if (event.key === 'ArrowUp') {
189
+ willActiveIndex--
190
+ } else if (event.key === 'ArrowDown') {
191
+ willActiveIndex++
192
+ }
193
+
194
+ // 修正
195
+ if (willActiveIndex < 0) {
196
+ willActiveIndex = flatList.length - 1
197
+ } else if (willActiveIndex > flatList.length - 1) {
198
+ willActiveIndex = 0
199
+ }
200
+ this.setState({ willActiveIndex })
201
+ }
202
+
203
+ private _getFilterData = () => {
204
+ const { data = [], renderListFilter, renderListFilterType } = this.props
205
+ const { searchValue } = this.state
206
+ let filterData: MoreSelectGroupDataItem<V>[]
207
+ if (renderListFilter) {
208
+ filterData = renderListFilter(data, searchValue)
209
+ } else if (renderListFilterType === 'pinyin') {
210
+ filterData = renderListFilterPinYin(data, searchValue)
211
+ } else {
212
+ filterData = renderListFilterDefault(data, searchValue)
213
+ }
214
+ this._filterData = filterData
215
+ return filterData
216
+ }
217
+
218
+ private _renderEmpty = (): ReactNode => {
219
+ const { renderEmpty } = this.props
220
+
221
+ if (typeof renderEmpty === 'function') {
222
+ const result = renderEmpty(this.state.searchValue)
223
+ if (result !== undefined) {
224
+ return result
225
+ }
226
+ }
227
+
228
+ return (
229
+ <Flex alignCenter justifyCenter className='gm-bg gm-padding-5 gm-text-desc'>
230
+ {getLocale('没有数据')}
231
+ </Flex>
232
+ )
233
+ }
234
+
235
+ private _renderList = (config: ConfigProviderProps): ReactNode => {
236
+ const {
237
+ selected = [],
238
+ multiple,
239
+ isGroupList,
240
+ renderListItem,
241
+ searchPlaceholder,
242
+ listHeight,
243
+ popupClassName,
244
+ renderCustomizedBottom,
245
+ } = this.props
246
+ const { loading, searchValue, willActiveIndex } = this.state
247
+ const filterData = this._getFilterData()
248
+ return (
249
+ <ConfigProvider {...config}>
250
+ <div
251
+ className={classNames('gm-more-select-popup', popupClassName)}
252
+ onKeyDown={this._handlePopupKeyDown}
253
+ >
254
+ <div className='gm-more-select-popup-input'>
255
+ <Input
256
+ ref={this._inputRef}
257
+ autoFocus
258
+ value={searchValue}
259
+ onChange={this._handleChange}
260
+ placeholder={searchPlaceholder}
261
+ />
262
+ </div>
263
+ <div style={{ height: listHeight }}>
264
+ {loading && (
265
+ <Flex alignCenter justifyCenter className='gm-bg gm-padding-5'>
266
+ <Loading size='20px' />
267
+ </Flex>
268
+ )}
269
+ {!loading && !filterData.length && this._renderEmpty()}
270
+ {!loading && !!filterData.length && (
271
+ <ListBase
272
+ selected={selected.map((v) => v.value)}
273
+ data={filterData}
274
+ multiple={multiple}
275
+ isGroupList={isGroupList}
276
+ className='gm-border-0'
277
+ renderItem={renderListItem}
278
+ onSelect={this._handleSelect}
279
+ isScrollTo
280
+ willActiveIndex={willActiveIndex!}
281
+ style={{ height: listHeight }}
282
+ />
283
+ )}
284
+ </div>
285
+ {!loading &&
286
+ !!filterData.length &&
287
+ renderCustomizedBottom &&
288
+ renderCustomizedBottom(this._popoverRef)}
289
+ </div>
290
+ </ConfigProvider>
291
+ )
292
+ }
293
+
294
+ private _handleMoreSelectClick = () => {
295
+ const { onClick, selected } = this.props
296
+ if (typeof onClick === 'function') {
297
+ return onClick(selected)
298
+ }
299
+ }
300
+
301
+ private _handlePopoverVisibleChange = (active: boolean) => {
302
+ if (active && this.props.searchOnActive) {
303
+ const searchValue = localStorage.getItem('_GM-PC_MORESELECT_SEARCHVALUE')
304
+ if (searchValue) {
305
+ this.setState({ searchValue })
306
+ setTimeout(() => {
307
+ // eslint-disable-next-line no-unused-expressions
308
+ this._inputRef.current?.select()
309
+ this._debounceDoSearch(searchValue)
310
+ }, 0)
311
+ }
312
+ }
313
+ }
314
+
315
+ render() {
316
+ const {
317
+ isInPopup,
318
+ disabled,
319
+ disabledClose,
320
+ selected = [],
321
+ multiple,
322
+ placeholder,
323
+ renderSelected,
324
+ className,
325
+ style,
326
+ popoverType,
327
+ children,
328
+ } = this.props
329
+ return (
330
+ <ConfigConsumer>
331
+ {(config) => (
332
+ <div
333
+ ref={this._baseRef}
334
+ onClick={this._handleMoreSelectClick}
335
+ className={classNames(
336
+ 'gm-more-select',
337
+ {
338
+ disabled,
339
+ 'gm-more-select-multiple': multiple,
340
+ },
341
+ className
342
+ )}
343
+ style={style}
344
+ >
345
+ <Popover
346
+ ref={this._popoverRef}
347
+ type={popoverType}
348
+ popup={() => this._renderList(config)}
349
+ disabled={disabled}
350
+ isInPopup={isInPopup}
351
+ onVisibleChange={this._handlePopoverVisibleChange}
352
+ >
353
+ {children ?? (
354
+ <Flex
355
+ ref={this._selectionRef}
356
+ tabIndex={0}
357
+ wrap
358
+ className='gm-more-select-selected'
359
+ >
360
+ {selected.length !== 0 ? (
361
+ selected.map((item) => (
362
+ <Flex
363
+ key={item.value as any}
364
+ className='gm-more-select-selected-item'
365
+ >
366
+ <Popover
367
+ disabled={!this.props.isKeyboard}
368
+ type='hover'
369
+ popup={<div className='gm-padding-10'>{item.text}</div>}
370
+ >
371
+ <Flex flex column>
372
+ {renderSelected!(item)}
373
+ </Flex>
374
+ </Popover>
375
+ {multiple ? (
376
+ <SVGRemove
377
+ className='gm-cursor gm-more-select-clear-btn'
378
+ onClick={
379
+ disabled ? _.noop : this._handleClear.bind(this, item)
380
+ }
381
+ />
382
+ ) : (
383
+ !disabledClose && ( // 是否不限时清除按钮,仅单选可用
384
+ <SVGCloseCircle
385
+ onClick={
386
+ disabled ? _.noop : this._handleClear.bind(this, item)
387
+ }
388
+ className='gm-cursor gm-more-select-clear-btn'
389
+ />
390
+ )
391
+ )}
392
+ </Flex>
393
+ ))
394
+ ) : (
395
+ // 加多个 &nbsp; 避免对齐问题,有文本才有对齐
396
+ <div className='gm-text-placeholder'>{placeholder}&nbsp; </div>
397
+ )}
398
+ </Flex>
399
+ )}
400
+ </Popover>
401
+ </div>
402
+ )}
403
+ </ConfigConsumer>
404
+ )
405
+ }
406
+ }
407
+
408
+ export default MoreSelectBase