@gmfe/react 2.14.21-beta.1 → 2.14.26-beta.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 (377) hide show
  1. package/LICENSE.md +4 -0
  2. package/package.json +3 -3
  3. package/src/common/hooks/index.js +3 -3
  4. package/src/common/hooks/use_mutation_observer.js +25 -25
  5. package/src/common/util.js +52 -52
  6. package/src/component/affix/affix.stories.js +13 -13
  7. package/src/component/affix/index.js +21 -21
  8. package/src/component/box/box.js +31 -31
  9. package/src/component/box/box.stories.js +94 -94
  10. package/src/component/box/box_form.js +77 -77
  11. package/src/component/box/box_panel.js +91 -91
  12. package/src/component/box/box_table.js +51 -51
  13. package/src/component/box/index.js +6 -6
  14. package/src/component/box/style.less +39 -39
  15. package/src/component/button/button.stories.js +91 -91
  16. package/src/component/button/index.js +92 -92
  17. package/src/component/button/style.less +114 -114
  18. package/src/component/calendar/calendar.js +52 -52
  19. package/src/component/calendar/calendar.stories.js +57 -57
  20. package/src/component/calendar/content.js +89 -89
  21. package/src/component/calendar/day.js +109 -109
  22. package/src/component/calendar/head.js +243 -243
  23. package/src/component/calendar/index.js +4 -4
  24. package/src/component/calendar/range_calendar.js +150 -150
  25. package/src/component/calendar/style.less +140 -140
  26. package/src/component/calendar/week.js +27 -27
  27. package/src/component/carousel/carousel.js +178 -178
  28. package/src/component/carousel/stories.js +50 -50
  29. package/src/component/carousel/style.less +48 -48
  30. package/src/component/cascader/cascader.js +441 -443
  31. package/src/component/cascader/cascader.select.js +195 -195
  32. package/src/component/cascader/stories.js +240 -240
  33. package/src/component/cascader/style.less +122 -122
  34. package/src/component/checkbox/checkbox.js +86 -86
  35. package/src/component/checkbox/checkbox_group.js +66 -66
  36. package/src/component/checkbox/index.js +4 -4
  37. package/src/component/checkbox/stories.js +103 -103
  38. package/src/component/checkbox/style.less +88 -88
  39. package/src/component/collapse/collapse.stories.js +18 -18
  40. package/src/component/collapse/index.js +36 -36
  41. package/src/component/color_picker/index.js +190 -190
  42. package/src/component/color_picker/stories.js +17 -17
  43. package/src/component/color_picker/style.less +41 -41
  44. package/src/component/date_picker/date_picker.stories.js +102 -102
  45. package/src/component/date_picker/index.js +217 -217
  46. package/src/component/date_picker/overlay.js +119 -119
  47. package/src/component/date_picker/style.less +22 -22
  48. package/src/component/date_picker/time_select.js +62 -62
  49. package/src/component/date_range_picker/date_range_picker.stories.js +196 -196
  50. package/src/component/date_range_picker/index.js +206 -206
  51. package/src/component/date_range_picker/left.js +127 -127
  52. package/src/component/date_range_picker/overlay.js +202 -202
  53. package/src/component/date_range_picker/style.less +46 -46
  54. package/src/component/date_range_picker/time_range_select.js +150 -150
  55. package/src/component/date_range_picker/two.js +129 -129
  56. package/src/component/date_range_picker/util.js +42 -42
  57. package/src/component/dialog/index.js +240 -240
  58. package/src/component/dialog/stories.js +125 -125
  59. package/src/component/divider/index.js +28 -28
  60. package/src/component/divider/stories.js +5 -5
  61. package/src/component/divider/style.less +15 -15
  62. package/src/component/drawer/index.js +107 -107
  63. package/src/component/drawer/style.less +43 -43
  64. package/src/component/drop_down/drop_down.js +84 -84
  65. package/src/component/drop_down/drop_down_item.js +43 -43
  66. package/src/component/drop_down/drop_down_items.js +22 -22
  67. package/src/component/drop_down/index.js +5 -5
  68. package/src/component/drop_down/stories.js +38 -38
  69. package/src/component/drop_down/style.less +21 -21
  70. package/src/component/drop_select/index.js +208 -208
  71. package/src/component/drop_select/style.less +69 -69
  72. package/src/component/dropper/index.js +62 -62
  73. package/src/component/dropper/style.less +18 -18
  74. package/src/component/editable_text/editable_text.stories.js +47 -47
  75. package/src/component/editable_text/index.js +106 -106
  76. package/src/component/editable_text/style.less +29 -29
  77. package/src/component/filter_select/filter.select.js +416 -416
  78. package/src/component/filter_select/multiple.filter.select.js +425 -425
  79. package/src/component/filter_select/style.less +117 -117
  80. package/src/component/flex/index.js +132 -132
  81. package/src/component/flex/stories.js +13 -13
  82. package/src/component/flex/style.less +101 -101
  83. package/src/component/flip_number/index.js +196 -196
  84. package/src/component/flip_number/stories.js +25 -25
  85. package/src/component/flip_number/utils.js +50 -50
  86. package/src/component/form/form.js +153 -153
  87. package/src/component/form/form.stories.js +553 -553
  88. package/src/component/form/form_block.js +59 -59
  89. package/src/component/form/form_button.js +29 -29
  90. package/src/component/form/form_group.js +173 -173
  91. package/src/component/form/form_item.js +174 -174
  92. package/src/component/form/form_panel.js +71 -71
  93. package/src/component/form/index.js +8 -8
  94. package/src/component/form/style.less +130 -130
  95. package/src/component/form/util.js +13 -13
  96. package/src/component/function_set/function_set.stories.js +91 -91
  97. package/src/component/function_set/index.js +98 -98
  98. package/src/component/function_set/overlay.js +56 -56
  99. package/src/component/grid/col.js +72 -72
  100. package/src/component/grid/grid.stories.js +123 -123
  101. package/src/component/grid/index.js +4 -4
  102. package/src/component/grid/mixin.less +48 -48
  103. package/src/component/grid/row.js +44 -44
  104. package/src/component/grid/style.less +26 -26
  105. package/src/component/grid/util.js +11 -11
  106. package/src/component/icon_down_up/index.js +28 -28
  107. package/src/component/icon_down_up/stories.js +18 -18
  108. package/src/component/icon_down_up/style.less +8 -8
  109. package/src/component/image_preview/index.js +20 -20
  110. package/src/component/image_preview/preview_modal.js +193 -193
  111. package/src/component/image_preview/style.less +119 -119
  112. package/src/component/img_uploader/index.js +149 -149
  113. package/src/component/img_uploader/index.stories.js +51 -51
  114. package/src/component/img_uploader/style.less +22 -22
  115. package/src/component/input/index.js +19 -19
  116. package/src/component/input_number/index.js +73 -73
  117. package/src/component/input_number/number.js +158 -158
  118. package/src/component/input_number/stories.js +21 -21
  119. package/src/component/input_number/style.less +10 -10
  120. package/src/component/layout_root/index.js +165 -165
  121. package/src/component/lazy_img/index.js +68 -68
  122. package/src/component/level_list/index.js +120 -120
  123. package/src/component/level_list/level_item.js +64 -64
  124. package/src/component/level_list/level_list.stories.js +139 -139
  125. package/src/component/level_list/style.less +47 -47
  126. package/src/component/level_list/util.js +22 -22
  127. package/src/component/level_select/index.js +240 -240
  128. package/src/component/level_select/level_select.stories.js +67 -67
  129. package/src/component/list/base.js +155 -155
  130. package/src/component/list/index.js +93 -93
  131. package/src/component/list/list.stories.js +99 -99
  132. package/src/component/list/style.less +58 -58
  133. package/src/component/loading/index.js +45 -45
  134. package/src/component/loading/loading_chunk.js +59 -59
  135. package/src/component/loading/loading_full_screen.js +62 -62
  136. package/src/component/loading/stories.js +46 -46
  137. package/src/component/loading/style.less +92 -92
  138. package/src/component/mask/index.js +34 -34
  139. package/src/component/mask/style.less +10 -10
  140. package/src/component/modal/clean_modal.js +36 -36
  141. package/src/component/modal/index.js +293 -293
  142. package/src/component/modal/right_side_modal.js +37 -37
  143. package/src/component/modal/stories.js +96 -96
  144. package/src/component/modal/style.less +145 -145
  145. package/src/component/more_select/base.js +517 -517
  146. package/src/component/more_select/index.js +91 -91
  147. package/src/component/more_select/stories.js +261 -261
  148. package/src/component/more_select/style.less +130 -130
  149. package/src/component/nav/index.js +269 -269
  150. package/src/component/nav/nav.stories.js +133 -133
  151. package/src/component/nav/style.less +156 -156
  152. package/src/component/nprogress/index.js +34 -34
  153. package/src/component/nprogress/stories.js +22 -22
  154. package/src/component/nprogress/style.less +39 -39
  155. package/src/component/pagination/base.js +67 -67
  156. package/src/component/pagination/left.js +65 -65
  157. package/src/component/pagination/page.js +120 -120
  158. package/src/component/pagination/page_peek.js +96 -96
  159. package/src/component/pagination/pagination.js +54 -54
  160. package/src/component/pagination/pagination.stories.js +104 -104
  161. package/src/component/pagination/pagination_text.js +71 -71
  162. package/src/component/pagination/pagination_v2.js +30 -30
  163. package/src/component/pagination/right.js +67 -67
  164. package/src/component/pagination/style.less +52 -52
  165. package/src/component/pagination/util.js +5 -5
  166. package/src/component/picture_preview/index.js +21 -21
  167. package/src/component/popover/index.js +373 -373
  168. package/src/component/popover/stories.js +101 -101
  169. package/src/component/popup/index.js +4 -4
  170. package/src/component/popup/popup.js +172 -172
  171. package/src/component/popup/popup_content_confirm.js +67 -67
  172. package/src/component/popup/style.less +105 -105
  173. package/src/component/price/index.js +147 -147
  174. package/src/component/price/stories.js +34 -34
  175. package/src/component/progress/index.js +101 -101
  176. package/src/component/progress/stories.js +60 -60
  177. package/src/component/progress/style.less +88 -88
  178. package/src/component/progress_circle/index.js +116 -116
  179. package/src/component/progress_circle/stories.js +54 -54
  180. package/src/component/progress_circle/style.less +17 -17
  181. package/src/component/radio/index.js +4 -4
  182. package/src/component/radio/radio.js +76 -76
  183. package/src/component/radio/radio_group.js +51 -51
  184. package/src/component/radio/stories.js +80 -80
  185. package/src/component/radio/style.less +63 -63
  186. package/src/component/recommend_input/index.js +118 -118
  187. package/src/component/recommend_input/recommend_input.stories.js +56 -56
  188. package/src/component/recommend_input/style.less +25 -25
  189. package/src/component/select/index.js +4 -4
  190. package/src/component/select/option.js +22 -22
  191. package/src/component/select/select.js +186 -186
  192. package/src/component/select/select.stories.js +79 -79
  193. package/src/component/select/style.less +4 -4
  194. package/src/component/selection/index.js +132 -132
  195. package/src/component/selection/selection.stories.js +41 -41
  196. package/src/component/selection/style.less +67 -67
  197. package/src/component/sheet/index.js +7 -7
  198. package/src/component/sheet/sheet.js +348 -348
  199. package/src/component/sheet/sheet_action.js +16 -16
  200. package/src/component/sheet/sheet_batch_action.js +16 -16
  201. package/src/component/sheet/sheet_column.js +21 -21
  202. package/src/component/sheet/sheet_select.js +31 -31
  203. package/src/component/sheet/stories.js +210 -210
  204. package/src/component/sheet/style.less +95 -95
  205. package/src/component/steps/index.js +66 -66
  206. package/src/component/steps/steps.stories.js +15 -15
  207. package/src/component/steps/style.less +39 -39
  208. package/src/component/storage/index.js +54 -54
  209. package/src/component/storage/stories.js +38 -38
  210. package/src/component/switch/index.js +118 -118
  211. package/src/component/switch/stories.js +7 -7
  212. package/src/component/switch/style.less +70 -70
  213. package/src/component/table_select/index.js +152 -152
  214. package/src/component/table_select/style.less +12 -12
  215. package/src/component/table_select/table_select.stories.js +91 -91
  216. package/src/component/table_select/util.js +21 -21
  217. package/src/component/tabs/style.less +33 -33
  218. package/src/component/tabs/tabs.js +97 -97
  219. package/src/component/tabs/tabs.stories.js +48 -48
  220. package/src/component/time_span/style.less +45 -45
  221. package/src/component/time_span/time_span.js +183 -183
  222. package/src/component/time_span/time_span.stories.js +66 -66
  223. package/src/component/time_span/time_span_picker.js +112 -112
  224. package/src/component/time_span/time_span_picker.stories.js +71 -71
  225. package/src/component/tip/index.js +168 -168
  226. package/src/component/tip/stories.js +54 -54
  227. package/src/component/tip/style.less +41 -41
  228. package/src/component/tool_tip/index.js +58 -58
  229. package/src/component/tool_tip/stories.js +36 -36
  230. package/src/component/transfer/box.js +186 -186
  231. package/src/component/transfer/index.js +4 -4
  232. package/src/component/transfer/stories.js +108 -108
  233. package/src/component/transfer/style.less +34 -34
  234. package/src/component/transfer/transfer.js +181 -181
  235. package/src/component/transfer/transfer_group.js +178 -178
  236. package/src/component/transfer_v2/index.js +171 -171
  237. package/src/component/transfer_v2/transfer_v2.stories.js +226 -226
  238. package/src/component/tree/bottom.js +41 -41
  239. package/src/component/tree/index.js +205 -205
  240. package/src/component/tree/item.js +154 -154
  241. package/src/component/tree/list.js +151 -151
  242. package/src/component/tree/style.less +147 -147
  243. package/src/component/tree/tree.stories.js +241 -241
  244. package/src/component/tree/util.js +24 -24
  245. package/src/component/tree_v2/bottom.js +40 -40
  246. package/src/component/tree_v2/index.js +260 -260
  247. package/src/component/tree_v2/list.js +230 -230
  248. package/src/component/tree_v2/style.less +38 -38
  249. package/src/component/tree_v2/tree.stories.js +419 -419
  250. package/src/component/tree_v2/util.js +185 -185
  251. package/src/component/uploader/index.js +108 -108
  252. package/src/component/uploader/style.less +24 -24
  253. package/src/component/uploader/uploader.stories.js +51 -51
  254. package/src/css/arrow.less +56 -56
  255. package/src/css/bg.less +52 -52
  256. package/src/css/border.less +40 -40
  257. package/src/css/cover.less +236 -236
  258. package/src/css/cursor.less +19 -19
  259. package/src/css/display.less +16 -16
  260. package/src/css/distance.less +324 -324
  261. package/src/css/error.less +10 -10
  262. package/src/css/other.less +16 -16
  263. package/src/css/overflow.less +23 -23
  264. package/src/css/position.less +11 -11
  265. package/src/css/rotate.less +28 -28
  266. package/src/css/shadow.less +11 -11
  267. package/src/css/stories.js +104 -104
  268. package/src/css/svg.less +51 -51
  269. package/src/css/text.less +120 -120
  270. package/src/css/variables.less +62 -62
  271. package/src/event_type.js +16 -16
  272. package/src/fonts/glyphicons-halflings-regular.svg +542 -542
  273. package/src/index.js +237 -237
  274. package/src/index.less +108 -108
  275. package/src/less/.csscomb.json +304 -304
  276. package/src/less/.csslintrc +19 -19
  277. package/src/less/alerts.less +72 -72
  278. package/src/less/badges.less +65 -65
  279. package/src/less/bootstrap.less +51 -51
  280. package/src/less/breadcrumbs.less +25 -25
  281. package/src/less/button-groups.less +253 -253
  282. package/src/less/buttons.less +186 -186
  283. package/src/less/carousel.less +269 -269
  284. package/src/less/close.less +33 -33
  285. package/src/less/code.less +68 -68
  286. package/src/less/component-animations.less +39 -39
  287. package/src/less/custom.less +37 -37
  288. package/src/less/dropdowns.less +215 -215
  289. package/src/less/forms.less +612 -612
  290. package/src/less/glyphicons.less +1614 -1614
  291. package/src/less/grid.less +76 -76
  292. package/src/less/input-groups.less +175 -175
  293. package/src/less/jumbotron.less +53 -53
  294. package/src/less/labels.less +64 -64
  295. package/src/less/list-group.less +126 -126
  296. package/src/less/media.less +66 -66
  297. package/src/less/mixins/alerts.less +14 -14
  298. package/src/less/mixins/background-variant.less +9 -9
  299. package/src/less/mixins/border-radius.less +21 -21
  300. package/src/less/mixins/buttons.less +65 -65
  301. package/src/less/mixins/center-block.less +7 -7
  302. package/src/less/mixins/clearfix.less +22 -22
  303. package/src/less/mixins/forms.less +84 -84
  304. package/src/less/mixins/gradients.less +59 -59
  305. package/src/less/mixins/grid-framework.less +96 -96
  306. package/src/less/mixins/grid.less +134 -134
  307. package/src/less/mixins/hide-text.less +21 -21
  308. package/src/less/mixins/image.less +25 -25
  309. package/src/less/mixins/labels.less +12 -12
  310. package/src/less/mixins/list-group.less +30 -30
  311. package/src/less/mixins/nav-divider.less +10 -10
  312. package/src/less/mixins/nav-vertical-align.less +9 -9
  313. package/src/less/mixins/opacity.less +8 -8
  314. package/src/less/mixins/pagination.less +24 -24
  315. package/src/less/mixins/panels.less +24 -24
  316. package/src/less/mixins/progress-bar.less +10 -10
  317. package/src/less/mixins/reset-filter.less +8 -8
  318. package/src/less/mixins/reset-text.less +18 -18
  319. package/src/less/mixins/resize.less +6 -6
  320. package/src/less/mixins/responsive-visibility.less +21 -21
  321. package/src/less/mixins/size.less +10 -10
  322. package/src/less/mixins/tab-focus.less +9 -9
  323. package/src/less/mixins/table-row.less +28 -28
  324. package/src/less/mixins/text-emphasis.less +9 -9
  325. package/src/less/mixins/text-overflow.less +8 -8
  326. package/src/less/mixins/vendor-prefixes.less +254 -254
  327. package/src/less/mixins.less +36 -36
  328. package/src/less/modals.less +163 -163
  329. package/src/less/navbar.less +651 -651
  330. package/src/less/navs.less +236 -236
  331. package/src/less/normalize.less +424 -424
  332. package/src/less/pager.less +54 -54
  333. package/src/less/pagination.less +90 -90
  334. package/src/less/panels.less +274 -274
  335. package/src/less/popovers.less +140 -140
  336. package/src/less/print.less +103 -103
  337. package/src/less/progress-bars.less +92 -92
  338. package/src/less/responsive-embed.less +35 -35
  339. package/src/less/responsive-utilities.less +209 -209
  340. package/src/less/scaffolding.less +154 -154
  341. package/src/less/tables.less +228 -228
  342. package/src/less/theme.less +344 -344
  343. package/src/less/thumbnails.less +35 -35
  344. package/src/less/tooltip.less +115 -115
  345. package/src/less/type.less +352 -352
  346. package/src/less/utilities.less +57 -57
  347. package/src/less/variables.less +833 -833
  348. package/src/less/wells.less +29 -29
  349. package/src/sotries.js +4 -4
  350. package/src/validator/index.js +10 -10
  351. package/src/validator/rules.js +66 -66
  352. package/src/validator/type.js +10 -10
  353. package/src/validator/validator.js +86 -86
  354. package/src/var.less +4 -4
  355. package/svg/calendar-month.svg +8 -8
  356. package/svg/calendar-year.svg +13 -13
  357. package/svg/calendar.svg +17 -17
  358. package/svg/check-detail.svg +18 -18
  359. package/svg/close-circle.svg +13 -13
  360. package/svg/closeup.svg +20 -20
  361. package/svg/delete.svg +10 -10
  362. package/svg/down-small.svg +1 -1
  363. package/svg/down.svg +1 -1
  364. package/svg/edit-box.svg +17 -17
  365. package/svg/edit-pen.svg +17 -17
  366. package/svg/empty.svg +27 -27
  367. package/svg/expand.svg +21 -21
  368. package/svg/left-small.svg +1 -1
  369. package/svg/more.svg +10 -10
  370. package/svg/next.svg +40 -40
  371. package/svg/pen.svg +12 -12
  372. package/svg/remove.svg +1 -1
  373. package/svg/right-small.svg +1 -1
  374. package/svg/search.svg +8 -8
  375. package/svg/setting.svg +17 -17
  376. package/svg/up-small.svg +1 -1
  377. package/svg/up.svg +1 -1
@@ -1,373 +1,373 @@
1
- import React from 'react'
2
- import PropTypes from 'prop-types'
3
- import { findDOMNode } from 'react-dom'
4
- import {
5
- createChainedFunction,
6
- getScrollTop,
7
- getScrollLeft
8
- } from '@gm-common/tool'
9
- import LayoutRoot from '../layout_root'
10
- import Popup from '../popup/popup'
11
- import _ from 'lodash'
12
- import classNames from 'classnames'
13
- import EVENT_TYPE from '../../event_type'
14
-
15
- function isContains(target, fun) {
16
- let node = target
17
- while (node) {
18
- if (fun(node)) {
19
- return true
20
- }
21
- node = node.parentNode
22
- }
23
-
24
- return false
25
- }
26
-
27
- function getElementPositionWithScroll(element) {
28
- let { left, top } = element.getBoundingClientRect()
29
- left += getScrollLeft()
30
- top += getScrollTop()
31
-
32
- return {
33
- top,
34
- left
35
- }
36
- }
37
-
38
- class Popover extends React.Component {
39
- constructor(props) {
40
- super(props)
41
- this.state = {
42
- active: false
43
- }
44
-
45
- this.debounceHandleModalScroll = _.debounce(this.handleModalScroll, 200)
46
- this.debounceHandleBrowserScroll = _.debounce(this.handleBrowserScroll, 200)
47
- this.debounceHandleDrawerScroll = _.debounce(this.handleDrawerScroll, 200)
48
- this.debounceHandleTableScroll = _.debounce(this.handleTableScroll, 200)
49
-
50
- this.timer = null
51
-
52
- // 延迟的,可能不存在。使用的时候判断下
53
- this.refPopup = null
54
-
55
- this.id = +new Date() + '' + Math.random()
56
-
57
- this._isUnmounted = false
58
- }
59
-
60
- /** 注意,先调用这个,再处理业务的 onXXX。比如 date_picker */
61
- apiDoSetActive = active => {
62
- this.setActive(active)
63
- }
64
-
65
- componentDidMount() {
66
- if (this.props.type === 'click' || this.props.type === 'focus') {
67
- window.document.body.addEventListener('click', this.handleBodyClick)
68
- } else if (this.props.type === 'realFocus') {
69
- // 原生 blur 不能冒泡,focusout 才能冒泡
70
- window.document.body.addEventListener('focusout', this.handleBodyFocusOut)
71
- }
72
-
73
- // 用 debounce
74
- window.addEventListener(
75
- EVENT_TYPE.MODAL_SCROLL,
76
- this.debounceHandleModalScroll
77
- )
78
- window.addEventListener(
79
- EVENT_TYPE.BROWSER_SCROLL,
80
- this.debounceHandleBrowserScroll
81
- )
82
- window.addEventListener(
83
- EVENT_TYPE.DRAWER_SCROLL,
84
- this.debounceHandleDrawerScroll
85
- )
86
- window.addEventListener(
87
- EVENT_TYPE.TABLE_SCROLL,
88
- this.debounceHandleTableScroll
89
- )
90
- }
91
-
92
- componentWillUnmount() {
93
- this._isUnmounted = true
94
-
95
- if (this.props.type === 'click' || this.props.type === 'focus') {
96
- window.document.body.removeEventListener('click', this.handleBodyClick)
97
- } else if (this.props.type === 'realFocus') {
98
- window.document.body.removeEventListener(
99
- 'focusout',
100
- this.handleBodyFocusOut
101
- )
102
- }
103
-
104
- LayoutRoot._removeComponentPopup(this.id)
105
-
106
- window.removeEventListener(
107
- EVENT_TYPE.MODAL_SCROLL,
108
- this.debounceHandleModalScroll
109
- )
110
- window.removeEventListener(
111
- EVENT_TYPE.BROWSER_SCROLL,
112
- this.debounceHandleBrowserScroll
113
- )
114
- window.removeEventListener(
115
- EVENT_TYPE.DRAWER_SCROLL,
116
- this.debounceHandleDrawerScroll
117
- )
118
- window.removeEventListener(
119
- EVENT_TYPE.TABLE_SCROLL,
120
- this.debounceHandleTableScroll
121
- )
122
- }
123
-
124
- handleDrawerScroll = () => {
125
- if (this.state.active) {
126
- this.setActive(this.state.active)
127
- }
128
- }
129
-
130
- handleModalScroll = () => {
131
- if (this.state.active) {
132
- this.setActive(this.state.active)
133
- }
134
- }
135
-
136
- handleBrowserScroll = () => {
137
- if (this.state.active) {
138
- this.setActive(this.state.active)
139
- }
140
- }
141
-
142
- handleTableScroll = () => {
143
- if (this.state.active) {
144
- this.setActive(this.state.active)
145
- }
146
- }
147
-
148
- componentDidUpdate() {
149
- this.doRenderPopup(this.state.active)
150
- }
151
-
152
- doRenderPopup(active) {
153
- const {
154
- style,
155
- className,
156
- popup,
157
- type,
158
- top,
159
- right,
160
- center,
161
- offset,
162
- showArrow,
163
- arrowLeft,
164
- predictingHeight,
165
- pureContainer,
166
- isInPopup
167
- } = this.props
168
-
169
- const disabled = this.getDisabled()
170
-
171
- if (active) {
172
- LayoutRoot._setComponentPopup(
173
- this.id,
174
- <Popup
175
- key={'popup_' + this.id}
176
- ref={ref => (this.refPopup = ref)}
177
- onMouseEnter={
178
- !disabled && type === 'hover' ? this.handleMouseEnter : _.noop
179
- }
180
- onMouseLeave={
181
- !disabled && type === 'hover' ? this.handleMouseLeave : _.noop
182
- }
183
- rect={this.rect}
184
- top={top}
185
- right={right}
186
- center={center}
187
- offset={offset}
188
- showArrow={showArrow}
189
- arrowLeft={arrowLeft}
190
- predictingHeight={predictingHeight}
191
- pureContainer={pureContainer}
192
- className={classNames(
193
- {
194
- 'gm-popover-is-in-popup': isInPopup
195
- },
196
- className
197
- )}
198
- style={style}
199
- >
200
- {_.isFunction(popup) ? popup() : popup}
201
- </Popup>
202
- )
203
- } else {
204
- LayoutRoot._removeComponentPopup(this.id)
205
- }
206
- }
207
-
208
- setActive = active => {
209
- if (this._isUnmounted) {
210
- return
211
- }
212
-
213
- if (active) {
214
- const dom = findDOMNode(this)
215
- const pos = getElementPositionWithScroll(dom)
216
- const rect = {
217
- left: pos.left,
218
- top: pos.top,
219
- height: dom.offsetHeight,
220
- width: dom.offsetWidth
221
- }
222
- this.rect = rect
223
- }
224
-
225
- this.setState({
226
- active
227
- })
228
-
229
- // 不需要,重复了,didUpdate 会做了
230
- // this.doRenderPopup(active)
231
- }
232
-
233
- doBodyClickAndFocusOut = target => {
234
- const { active } = this.state
235
-
236
- // 没激活就没有必要判断了
237
- if (!active) {
238
- return
239
- }
240
-
241
- // type 为 focus 存在 由于时机问题,可能 refPopup 还没出来,此时啥也不做
242
- if (!this.refPopup) {
243
- return
244
- }
245
-
246
- const $this = findDOMNode(this)
247
- const $popup = findDOMNode(this.refPopup)
248
-
249
- if (
250
- isContains(target, node => {
251
- return (
252
- node === $this ||
253
- node === $popup ||
254
- (node.classList && node.classList.contains('gm-popover-is-in-popup'))
255
- )
256
- })
257
- ) {
258
- return
259
- }
260
-
261
- this.setActive(false)
262
- }
263
-
264
- handleBodyClick = event => {
265
- this.doBodyClickAndFocusOut(event.target)
266
- }
267
-
268
- handleBodyFocusOut = event => {
269
- this.doBodyClickAndFocusOut(event.relatedTarget)
270
- }
271
-
272
- handleClick = () => {
273
- // focus 也会进来
274
- const { type } = this.props
275
-
276
- if (type === 'click') {
277
- this.setActive(!this.state.active)
278
- } else {
279
- this.setActive(true)
280
- }
281
- }
282
-
283
- handleFocus = () => {
284
- this.setActive(true)
285
- }
286
-
287
- handleMouseEnter = () => {
288
- clearTimeout(this.timer)
289
- this.setActive(true)
290
- }
291
-
292
- handleMouseLeave = () => {
293
- clearTimeout(this.timer)
294
-
295
- this.timer = setTimeout(() => {
296
- this.setActive(false)
297
- }, 500)
298
- }
299
-
300
- getDisabled = () => {
301
- const { disabled, children } = this.props
302
- return disabled || children.props.disabled
303
- }
304
-
305
- render() {
306
- const { children, type } = this.props
307
-
308
- const { active } = this.state
309
-
310
- const child = React.Children.only(children)
311
-
312
- const p = {}
313
- if (!this.getDisabled()) {
314
- if (type === 'click' || type === 'focus') {
315
- p.onClick = createChainedFunction(child.props.onClick, this.handleClick)
316
- } else if (type === 'realFocus') {
317
- p.onFocus = createChainedFunction(child.props.onFocus, this.handleFocus)
318
- } else if (type === 'hover') {
319
- p.onMouseEnter = createChainedFunction(
320
- child.props.onMouseEnter,
321
- this.handleMouseEnter
322
- )
323
- p.onMouseLeave = createChainedFunction(
324
- child.props.onMouseLeave,
325
- this.handleMouseLeave
326
- )
327
- }
328
- }
329
-
330
- // 通过类名告知 target 做好 active 的应变
331
- return React.cloneElement(child, {
332
- ...p,
333
- className: classNames(child.props.className, {
334
- 'gm-popover-active': active
335
- })
336
- })
337
- }
338
- }
339
-
340
- // 注意 Popover 的 popup 不会随 render 更新
341
- Popover.propTypes = {
342
- // 命名问题,focus 不是真正的 focus事件,和 click 类似,只不过 focus 不会因为二次点击而关掉。
343
- // 想要 focus 事件的效果,请用 realFocus,失焦会 hide
344
- type: PropTypes.oneOf(['focus', 'click', 'hover', 'realFocus']),
345
- popup: PropTypes.oneOfType([PropTypes.element, PropTypes.func]).isRequired,
346
- children: PropTypes.any.isRequired,
347
- disabled: PropTypes.bool, // 也可以用children props disable
348
-
349
- className: PropTypes.string,
350
- style: PropTypes.object,
351
-
352
- right: PropTypes.bool,
353
- top: PropTypes.bool,
354
- center: PropTypes.bool,
355
- offset: PropTypes.number, // 偏移量
356
-
357
- showArrow: PropTypes.bool, // 是否显示三角标
358
- arrowLeft: PropTypes.string,
359
- pureContainer: PropTypes.bool,
360
-
361
- isInPopup: PropTypes.bool,
362
-
363
- /** 预判高度。因为 popup 的宽高会是可变的,所以没法判断视窗内是否能放得下,于是有此。 */
364
- predictingHeight: PropTypes.number
365
- }
366
-
367
- Popover.defaultProps = {
368
- type: 'focus',
369
- showArrow: false,
370
- isInPopup: false
371
- }
372
-
373
- export default Popover
1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { findDOMNode } from 'react-dom'
4
+ import {
5
+ createChainedFunction,
6
+ getScrollTop,
7
+ getScrollLeft
8
+ } from '@gm-common/tool'
9
+ import LayoutRoot from '../layout_root'
10
+ import Popup from '../popup/popup'
11
+ import _ from 'lodash'
12
+ import classNames from 'classnames'
13
+ import EVENT_TYPE from '../../event_type'
14
+
15
+ function isContains(target, fun) {
16
+ let node = target
17
+ while (node) {
18
+ if (fun(node)) {
19
+ return true
20
+ }
21
+ node = node.parentNode
22
+ }
23
+
24
+ return false
25
+ }
26
+
27
+ function getElementPositionWithScroll(element) {
28
+ let { left, top } = element.getBoundingClientRect()
29
+ left += getScrollLeft()
30
+ top += getScrollTop()
31
+
32
+ return {
33
+ top,
34
+ left
35
+ }
36
+ }
37
+
38
+ class Popover extends React.Component {
39
+ constructor(props) {
40
+ super(props)
41
+ this.state = {
42
+ active: false
43
+ }
44
+
45
+ this.debounceHandleModalScroll = _.debounce(this.handleModalScroll, 200)
46
+ this.debounceHandleBrowserScroll = _.debounce(this.handleBrowserScroll, 200)
47
+ this.debounceHandleDrawerScroll = _.debounce(this.handleDrawerScroll, 200)
48
+ this.debounceHandleTableScroll = _.debounce(this.handleTableScroll, 200)
49
+
50
+ this.timer = null
51
+
52
+ // 延迟的,可能不存在。使用的时候判断下
53
+ this.refPopup = null
54
+
55
+ this.id = +new Date() + '' + Math.random()
56
+
57
+ this._isUnmounted = false
58
+ }
59
+
60
+ /** 注意,先调用这个,再处理业务的 onXXX。比如 date_picker */
61
+ apiDoSetActive = active => {
62
+ this.setActive(active)
63
+ }
64
+
65
+ componentDidMount() {
66
+ if (this.props.type === 'click' || this.props.type === 'focus') {
67
+ window.document.body.addEventListener('click', this.handleBodyClick)
68
+ } else if (this.props.type === 'realFocus') {
69
+ // 原生 blur 不能冒泡,focusout 才能冒泡
70
+ window.document.body.addEventListener('focusout', this.handleBodyFocusOut)
71
+ }
72
+
73
+ // 用 debounce
74
+ window.addEventListener(
75
+ EVENT_TYPE.MODAL_SCROLL,
76
+ this.debounceHandleModalScroll
77
+ )
78
+ window.addEventListener(
79
+ EVENT_TYPE.BROWSER_SCROLL,
80
+ this.debounceHandleBrowserScroll
81
+ )
82
+ window.addEventListener(
83
+ EVENT_TYPE.DRAWER_SCROLL,
84
+ this.debounceHandleDrawerScroll
85
+ )
86
+ window.addEventListener(
87
+ EVENT_TYPE.TABLE_SCROLL,
88
+ this.debounceHandleTableScroll
89
+ )
90
+ }
91
+
92
+ componentWillUnmount() {
93
+ this._isUnmounted = true
94
+
95
+ if (this.props.type === 'click' || this.props.type === 'focus') {
96
+ window.document.body.removeEventListener('click', this.handleBodyClick)
97
+ } else if (this.props.type === 'realFocus') {
98
+ window.document.body.removeEventListener(
99
+ 'focusout',
100
+ this.handleBodyFocusOut
101
+ )
102
+ }
103
+
104
+ LayoutRoot._removeComponentPopup(this.id)
105
+
106
+ window.removeEventListener(
107
+ EVENT_TYPE.MODAL_SCROLL,
108
+ this.debounceHandleModalScroll
109
+ )
110
+ window.removeEventListener(
111
+ EVENT_TYPE.BROWSER_SCROLL,
112
+ this.debounceHandleBrowserScroll
113
+ )
114
+ window.removeEventListener(
115
+ EVENT_TYPE.DRAWER_SCROLL,
116
+ this.debounceHandleDrawerScroll
117
+ )
118
+ window.removeEventListener(
119
+ EVENT_TYPE.TABLE_SCROLL,
120
+ this.debounceHandleTableScroll
121
+ )
122
+ }
123
+
124
+ handleDrawerScroll = () => {
125
+ if (this.state.active) {
126
+ this.setActive(this.state.active)
127
+ }
128
+ }
129
+
130
+ handleModalScroll = () => {
131
+ if (this.state.active) {
132
+ this.setActive(this.state.active)
133
+ }
134
+ }
135
+
136
+ handleBrowserScroll = () => {
137
+ if (this.state.active) {
138
+ this.setActive(this.state.active)
139
+ }
140
+ }
141
+
142
+ handleTableScroll = () => {
143
+ if (this.state.active) {
144
+ this.setActive(this.state.active)
145
+ }
146
+ }
147
+
148
+ componentDidUpdate() {
149
+ this.doRenderPopup(this.state.active)
150
+ }
151
+
152
+ doRenderPopup(active) {
153
+ const {
154
+ style,
155
+ className,
156
+ popup,
157
+ type,
158
+ top,
159
+ right,
160
+ center,
161
+ offset,
162
+ showArrow,
163
+ arrowLeft,
164
+ predictingHeight,
165
+ pureContainer,
166
+ isInPopup
167
+ } = this.props
168
+
169
+ const disabled = this.getDisabled()
170
+
171
+ if (active) {
172
+ LayoutRoot._setComponentPopup(
173
+ this.id,
174
+ <Popup
175
+ key={'popup_' + this.id}
176
+ ref={ref => (this.refPopup = ref)}
177
+ onMouseEnter={
178
+ !disabled && type === 'hover' ? this.handleMouseEnter : _.noop
179
+ }
180
+ onMouseLeave={
181
+ !disabled && type === 'hover' ? this.handleMouseLeave : _.noop
182
+ }
183
+ rect={this.rect}
184
+ top={top}
185
+ right={right}
186
+ center={center}
187
+ offset={offset}
188
+ showArrow={showArrow}
189
+ arrowLeft={arrowLeft}
190
+ predictingHeight={predictingHeight}
191
+ pureContainer={pureContainer}
192
+ className={classNames(
193
+ {
194
+ 'gm-popover-is-in-popup': isInPopup
195
+ },
196
+ className
197
+ )}
198
+ style={style}
199
+ >
200
+ {_.isFunction(popup) ? popup() : popup}
201
+ </Popup>
202
+ )
203
+ } else {
204
+ LayoutRoot._removeComponentPopup(this.id)
205
+ }
206
+ }
207
+
208
+ setActive = active => {
209
+ if (this._isUnmounted) {
210
+ return
211
+ }
212
+
213
+ if (active) {
214
+ const dom = findDOMNode(this)
215
+ const pos = getElementPositionWithScroll(dom)
216
+ const rect = {
217
+ left: pos.left,
218
+ top: pos.top,
219
+ height: dom.offsetHeight,
220
+ width: dom.offsetWidth
221
+ }
222
+ this.rect = rect
223
+ }
224
+
225
+ this.setState({
226
+ active
227
+ })
228
+
229
+ // 不需要,重复了,didUpdate 会做了
230
+ // this.doRenderPopup(active)
231
+ }
232
+
233
+ doBodyClickAndFocusOut = target => {
234
+ const { active } = this.state
235
+
236
+ // 没激活就没有必要判断了
237
+ if (!active) {
238
+ return
239
+ }
240
+
241
+ // type 为 focus 存在 由于时机问题,可能 refPopup 还没出来,此时啥也不做
242
+ if (!this.refPopup) {
243
+ return
244
+ }
245
+
246
+ const $this = findDOMNode(this)
247
+ const $popup = findDOMNode(this.refPopup)
248
+
249
+ if (
250
+ isContains(target, node => {
251
+ return (
252
+ node === $this ||
253
+ node === $popup ||
254
+ (node.classList && node.classList.contains('gm-popover-is-in-popup'))
255
+ )
256
+ })
257
+ ) {
258
+ return
259
+ }
260
+
261
+ this.setActive(false)
262
+ }
263
+
264
+ handleBodyClick = event => {
265
+ this.doBodyClickAndFocusOut(event.target)
266
+ }
267
+
268
+ handleBodyFocusOut = event => {
269
+ this.doBodyClickAndFocusOut(event.relatedTarget)
270
+ }
271
+
272
+ handleClick = () => {
273
+ // focus 也会进来
274
+ const { type } = this.props
275
+
276
+ if (type === 'click') {
277
+ this.setActive(!this.state.active)
278
+ } else {
279
+ this.setActive(true)
280
+ }
281
+ }
282
+
283
+ handleFocus = () => {
284
+ this.setActive(true)
285
+ }
286
+
287
+ handleMouseEnter = () => {
288
+ clearTimeout(this.timer)
289
+ this.setActive(true)
290
+ }
291
+
292
+ handleMouseLeave = () => {
293
+ clearTimeout(this.timer)
294
+
295
+ this.timer = setTimeout(() => {
296
+ this.setActive(false)
297
+ }, 500)
298
+ }
299
+
300
+ getDisabled = () => {
301
+ const { disabled, children } = this.props
302
+ return disabled || children.props.disabled
303
+ }
304
+
305
+ render() {
306
+ const { children, type } = this.props
307
+
308
+ const { active } = this.state
309
+
310
+ const child = React.Children.only(children)
311
+
312
+ const p = {}
313
+ if (!this.getDisabled()) {
314
+ if (type === 'click' || type === 'focus') {
315
+ p.onClick = createChainedFunction(child.props.onClick, this.handleClick)
316
+ } else if (type === 'realFocus') {
317
+ p.onFocus = createChainedFunction(child.props.onFocus, this.handleFocus)
318
+ } else if (type === 'hover') {
319
+ p.onMouseEnter = createChainedFunction(
320
+ child.props.onMouseEnter,
321
+ this.handleMouseEnter
322
+ )
323
+ p.onMouseLeave = createChainedFunction(
324
+ child.props.onMouseLeave,
325
+ this.handleMouseLeave
326
+ )
327
+ }
328
+ }
329
+
330
+ // 通过类名告知 target 做好 active 的应变
331
+ return React.cloneElement(child, {
332
+ ...p,
333
+ className: classNames(child.props.className, {
334
+ 'gm-popover-active': active
335
+ })
336
+ })
337
+ }
338
+ }
339
+
340
+ // 注意 Popover 的 popup 不会随 render 更新
341
+ Popover.propTypes = {
342
+ // 命名问题,focus 不是真正的 focus事件,和 click 类似,只不过 focus 不会因为二次点击而关掉。
343
+ // 想要 focus 事件的效果,请用 realFocus,失焦会 hide
344
+ type: PropTypes.oneOf(['focus', 'click', 'hover', 'realFocus']),
345
+ popup: PropTypes.oneOfType([PropTypes.element, PropTypes.func]).isRequired,
346
+ children: PropTypes.any.isRequired,
347
+ disabled: PropTypes.bool, // 也可以用children props disable
348
+
349
+ className: PropTypes.string,
350
+ style: PropTypes.object,
351
+
352
+ right: PropTypes.bool,
353
+ top: PropTypes.bool,
354
+ center: PropTypes.bool,
355
+ offset: PropTypes.number, // 偏移量
356
+
357
+ showArrow: PropTypes.bool, // 是否显示三角标
358
+ arrowLeft: PropTypes.string,
359
+ pureContainer: PropTypes.bool,
360
+
361
+ isInPopup: PropTypes.bool,
362
+
363
+ /** 预判高度。因为 popup 的宽高会是可变的,所以没法判断视窗内是否能放得下,于是有此。 */
364
+ predictingHeight: PropTypes.number
365
+ }
366
+
367
+ Popover.defaultProps = {
368
+ type: 'focus',
369
+ showArrow: false,
370
+ isInPopup: false
371
+ }
372
+
373
+ export default Popover