feffery_antd_components 0.4.3-rc6 → 0.4.3

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 (462) hide show
  1. package/CONTRIBUTING.md +4 -4
  2. package/DESCRIPTION +1 -1
  3. package/LICENSE +21 -21
  4. package/MANIFEST.in +6 -6
  5. package/Project.toml +1 -1
  6. package/README-en_US.md +73 -73
  7. package/README.md +87 -87
  8. package/bug_fix.py +21 -36
  9. package/fac-logo.svg +151 -151
  10. package/feffery_antd_components/AntdAccordion.py +7 -7
  11. package/feffery_antd_components/AntdAffix.py +2 -2
  12. package/feffery_antd_components/AntdAlert.py +5 -5
  13. package/feffery_antd_components/AntdAnchor.py +5 -5
  14. package/feffery_antd_components/AntdAvatar.py +4 -4
  15. package/feffery_antd_components/AntdAvatarGroup.py +1 -1
  16. package/feffery_antd_components/AntdBackTop.py +4 -4
  17. package/feffery_antd_components/AntdBadge.py +5 -5
  18. package/feffery_antd_components/AntdBreadcrumb.py +4 -4
  19. package/feffery_antd_components/AntdButton.py +14 -14
  20. package/feffery_antd_components/AntdCalendar.py +4 -4
  21. package/feffery_antd_components/AntdCard.py +5 -5
  22. package/feffery_antd_components/AntdCardGrid.py +3 -3
  23. package/feffery_antd_components/AntdCardMeta.py +1 -1
  24. package/feffery_antd_components/AntdCarousel.py +13 -13
  25. package/feffery_antd_components/AntdCascader.py +16 -17
  26. package/feffery_antd_components/AntdCenter.py +3 -3
  27. package/feffery_antd_components/AntdCheckCard.py +7 -7
  28. package/feffery_antd_components/AntdCheckCardGroup.py +9 -9
  29. package/feffery_antd_components/AntdCheckableTag.py +2 -2
  30. package/feffery_antd_components/AntdCheckbox.py +8 -8
  31. package/feffery_antd_components/AntdCheckboxGroup.py +6 -6
  32. package/feffery_antd_components/AntdCol.py +5 -5
  33. package/feffery_antd_components/AntdCollapse.py +8 -8
  34. package/feffery_antd_components/AntdColorPicker.py +13 -13
  35. package/feffery_antd_components/AntdComment.py +7 -7
  36. package/feffery_antd_components/AntdCompact.py +3 -3
  37. package/feffery_antd_components/AntdConfigProvider.py +6 -6
  38. package/feffery_antd_components/AntdContent.py +1 -1
  39. package/feffery_antd_components/AntdCopyText.py +2 -2
  40. package/feffery_antd_components/AntdCountdown.py +1 -1
  41. package/feffery_antd_components/AntdCountup.py +1 -1
  42. package/feffery_antd_components/AntdCustomSkeleton.py +5 -5
  43. package/feffery_antd_components/AntdDatePicker.py +13 -13
  44. package/feffery_antd_components/AntdDateRangePicker.py +12 -12
  45. package/feffery_antd_components/AntdDescriptionItem.py +2 -2
  46. package/feffery_antd_components/AntdDescriptions.py +6 -6
  47. package/feffery_antd_components/AntdDivider.py +5 -5
  48. package/feffery_antd_components/AntdDraggerUpload.py +15 -15
  49. package/feffery_antd_components/AntdDrawer.py +12 -12
  50. package/feffery_antd_components/AntdDropdown.py +18 -18
  51. package/feffery_antd_components/AntdEmpty.py +2 -2
  52. package/feffery_antd_components/AntdFlex.py +6 -6
  53. package/feffery_antd_components/AntdFloatButton.py +5 -5
  54. package/feffery_antd_components/AntdFloatButtonGroup.py +3 -3
  55. package/feffery_antd_components/AntdFooter.py +1 -1
  56. package/feffery_antd_components/AntdForm.py +10 -6
  57. package/feffery_antd_components/AntdFormItem.py +4 -4
  58. package/feffery_antd_components/AntdFormRender.py +2 -2
  59. package/feffery_antd_components/AntdHappyProvider.py +2 -2
  60. package/feffery_antd_components/AntdHeader.py +1 -1
  61. package/feffery_antd_components/AntdIcon.py +3 -3
  62. package/feffery_antd_components/AntdImage.py +6 -6
  63. package/feffery_antd_components/AntdImageGroup.py +6 -6
  64. package/feffery_antd_components/AntdInput.py +17 -17
  65. package/feffery_antd_components/AntdInputNumber.py +12 -12
  66. package/feffery_antd_components/AntdLayout.py +1 -1
  67. package/feffery_antd_components/AntdMentions.py +9 -9
  68. package/feffery_antd_components/AntdMenu.py +9 -9
  69. package/feffery_antd_components/AntdMessage.py +3 -3
  70. package/feffery_antd_components/AntdModal.py +28 -28
  71. package/feffery_antd_components/AntdNotification.py +9 -9
  72. package/feffery_antd_components/AntdOTP.py +7 -7
  73. package/feffery_antd_components/AntdPageHeader.py +5 -5
  74. package/feffery_antd_components/AntdPagination.py +15 -15
  75. package/feffery_antd_components/AntdParagraph.py +2 -2
  76. package/feffery_antd_components/AntdPictureUpload.py +28 -28
  77. package/feffery_antd_components/AntdPopconfirm.py +21 -21
  78. package/feffery_antd_components/AntdPopover.py +9 -9
  79. package/feffery_antd_components/AntdPopupCard.py +9 -9
  80. package/feffery_antd_components/AntdProgress.py +9 -9
  81. package/feffery_antd_components/AntdQRCode.py +10 -10
  82. package/feffery_antd_components/AntdRadioGroup.py +9 -9
  83. package/feffery_antd_components/AntdRate.py +9 -9
  84. package/feffery_antd_components/AntdResult.py +1 -1
  85. package/feffery_antd_components/AntdRibbon.py +2 -2
  86. package/feffery_antd_components/AntdRow.py +3 -3
  87. package/feffery_antd_components/AntdSegmented.py +9 -9
  88. package/feffery_antd_components/AntdSegmentedColoring.py +11 -11
  89. package/feffery_antd_components/AntdSelect.py +19 -19
  90. package/feffery_antd_components/AntdSider.py +6 -6
  91. package/feffery_antd_components/AntdSkeleton.py +11 -11
  92. package/feffery_antd_components/AntdSkeletonAvatar.py +3 -3
  93. package/feffery_antd_components/AntdSkeletonButton.py +5 -5
  94. package/feffery_antd_components/AntdSkeletonImage.py +1 -1
  95. package/feffery_antd_components/AntdSkeletonInput.py +3 -3
  96. package/feffery_antd_components/AntdSlider.py +10 -10
  97. package/feffery_antd_components/AntdSpace.py +4 -4
  98. package/feffery_antd_components/AntdSpin.py +7 -8
  99. package/feffery_antd_components/AntdSplitter.py +5 -5
  100. package/feffery_antd_components/AntdSpoiler.py +5 -5
  101. package/feffery_antd_components/AntdStatistic.py +2 -2
  102. package/feffery_antd_components/AntdSteps.py +8 -8
  103. package/feffery_antd_components/AntdSwitch.py +8 -8
  104. package/feffery_antd_components/AntdTable.py +64 -63
  105. package/feffery_antd_components/AntdTabs.py +13 -14
  106. package/feffery_antd_components/AntdTag.py +4 -4
  107. package/feffery_antd_components/AntdText.py +2 -2
  108. package/feffery_antd_components/AntdTimePicker.py +16 -16
  109. package/feffery_antd_components/AntdTimeRangePicker.py +15 -15
  110. package/feffery_antd_components/AntdTimeline.py +2 -2
  111. package/feffery_antd_components/AntdTitle.py +2 -2
  112. package/feffery_antd_components/AntdTooltip.py +9 -9
  113. package/feffery_antd_components/AntdTour.py +9 -9
  114. package/feffery_antd_components/AntdTransfer.py +11 -11
  115. package/feffery_antd_components/AntdTree.py +17 -17
  116. package/feffery_antd_components/AntdTreeSelect.py +18 -18
  117. package/feffery_antd_components/AntdUpload.py +18 -18
  118. package/feffery_antd_components/AntdWatermark.py +6 -6
  119. package/feffery_antd_components/Fragment.py +1 -1
  120. package/feffery_antd_components/__init__.py +88 -88
  121. package/feffery_antd_components/_icons.py +559 -559
  122. package/feffery_antd_components/alias.py +222 -222
  123. package/feffery_antd_components/async-antd_table.js +2 -2
  124. package/feffery_antd_components/async-data_display.js +1 -1
  125. package/feffery_antd_components/async-data_entry.js +3 -3
  126. package/feffery_antd_components/async-upload.js +2 -2
  127. package/feffery_antd_components/feffery_antd_components.min.js +8 -8
  128. package/feffery_antd_components/metadata.json +1 -1
  129. package/feffery_antd_components/package-info.json +111 -96
  130. package/feffery_antd_components/utils.py +262 -262
  131. package/package.json +111 -96
  132. package/pytest.ini +5 -5
  133. package/release-to-test-pypi.sh +1 -1
  134. package/requirements.txt +2 -2
  135. package/review_checklist.md +47 -47
  136. package/ruff.toml +4 -4
  137. package/setup.py +33 -33
  138. package/src/jl/'feffery'_antdform.jl +2 -1
  139. package/src/jl/'feffery'_antdtable.jl +7 -6
  140. package/src/lib/components/dataDisplay/AntdAccordion.react.js +232 -232
  141. package/src/lib/components/dataDisplay/AntdAvatar.react.js +177 -177
  142. package/src/lib/components/dataDisplay/AntdAvatarGroup.react.js +133 -133
  143. package/src/lib/components/dataDisplay/AntdBadge.react.js +196 -196
  144. package/src/lib/components/dataDisplay/AntdCarousel.react.js +187 -187
  145. package/src/lib/components/dataDisplay/AntdCheckableTag.react.js +105 -105
  146. package/src/lib/components/dataDisplay/AntdCollapse.react.js +239 -239
  147. package/src/lib/components/dataDisplay/AntdComment.react.js +251 -251
  148. package/src/lib/components/dataDisplay/AntdCountdown.react.js +143 -143
  149. package/src/lib/components/dataDisplay/AntdCountup.react.js +133 -133
  150. package/src/lib/components/dataDisplay/AntdEmpty.react.js +162 -162
  151. package/src/lib/components/dataDisplay/AntdImage.react.js +202 -202
  152. package/src/lib/components/dataDisplay/AntdImageGroup.react.js +181 -181
  153. package/src/lib/components/dataDisplay/AntdPopover.react.js +220 -220
  154. package/src/lib/components/dataDisplay/AntdQRCode.react.js +191 -191
  155. package/src/lib/components/dataDisplay/AntdRibbon.react.js +105 -105
  156. package/src/lib/components/dataDisplay/AntdSegmented.react.js +234 -234
  157. package/src/lib/components/dataDisplay/AntdSpoiler.react.js +154 -154
  158. package/src/lib/components/dataDisplay/AntdStatistic.react.js +168 -168
  159. package/src/lib/components/dataDisplay/AntdTable.react.js +1859 -1858
  160. package/src/lib/components/dataDisplay/AntdTabs.react.js +352 -352
  161. package/src/lib/components/dataDisplay/AntdTag.react.js +135 -135
  162. package/src/lib/components/dataDisplay/AntdTimeline.react.js +136 -136
  163. package/src/lib/components/dataDisplay/AntdTooltip.react.js +230 -230
  164. package/src/lib/components/dataDisplay/AntdTree.react.js +641 -641
  165. package/src/lib/components/dataDisplay/card/AntdCard.react.js +249 -249
  166. package/src/lib/components/dataDisplay/card/AntdCardGrid.react.js +99 -99
  167. package/src/lib/components/dataDisplay/card/AntdCardMeta.react.js +97 -97
  168. package/src/lib/components/dataDisplay/descriptions/AntdDescriptionItem.react.js +130 -130
  169. package/src/lib/components/dataDisplay/descriptions/AntdDescriptions.react.js +237 -237
  170. package/src/lib/components/dataEntry/AntdCalendar.react.js +205 -205
  171. package/src/lib/components/dataEntry/AntdCascader.react.js +435 -435
  172. package/src/lib/components/dataEntry/AntdCheckbox.react.js +182 -182
  173. package/src/lib/components/dataEntry/AntdCheckboxGroup.react.js +193 -193
  174. package/src/lib/components/dataEntry/AntdColorPicker.react.js +240 -240
  175. package/src/lib/components/dataEntry/AntdDatePicker.react.js +432 -432
  176. package/src/lib/components/dataEntry/AntdDateRangePicker.react.js +439 -439
  177. package/src/lib/components/dataEntry/AntdInput.react.js +423 -423
  178. package/src/lib/components/dataEntry/AntdInputNumber.react.js +329 -329
  179. package/src/lib/components/dataEntry/AntdMentions.react.js +236 -236
  180. package/src/lib/components/dataEntry/AntdOTP.react.js +186 -186
  181. package/src/lib/components/dataEntry/AntdRadioGroup.react.js +241 -241
  182. package/src/lib/components/dataEntry/AntdRate.react.js +199 -199
  183. package/src/lib/components/dataEntry/AntdSegmentedColoring.react.js +251 -251
  184. package/src/lib/components/dataEntry/AntdSelect.react.js +492 -492
  185. package/src/lib/components/dataEntry/AntdSlider.react.js +325 -325
  186. package/src/lib/components/dataEntry/AntdSwitch.react.js +210 -210
  187. package/src/lib/components/dataEntry/AntdTimePicker.react.js +344 -344
  188. package/src/lib/components/dataEntry/AntdTimeRangePicker.react.js +325 -325
  189. package/src/lib/components/dataEntry/AntdTransfer.react.js +317 -317
  190. package/src/lib/components/dataEntry/AntdTreeSelect.react.js +573 -573
  191. package/src/lib/components/dataEntry/check-card/AntdCheckCard.react.js +186 -186
  192. package/src/lib/components/dataEntry/check-card/AntdCheckCardGroup.react.js +214 -214
  193. package/src/lib/components/dataEntry/form/AntdForm.react.js +201 -194
  194. package/src/lib/components/dataEntry/form/AntdFormItem.react.js +210 -210
  195. package/src/lib/components/dataEntry/upload/AntdDraggerUpload.react.js +504 -504
  196. package/src/lib/components/dataEntry/upload/AntdPictureUpload.react.js +530 -530
  197. package/src/lib/components/dataEntry/upload/AntdUpload.react.js +537 -537
  198. package/src/lib/components/feedback/AntdAlert.react.js +185 -185
  199. package/src/lib/components/feedback/AntdDrawer.react.js +306 -306
  200. package/src/lib/components/feedback/AntdMessage.react.js +143 -143
  201. package/src/lib/components/feedback/AntdModal.react.js +530 -530
  202. package/src/lib/components/feedback/AntdNotification.react.js +211 -211
  203. package/src/lib/components/feedback/AntdPopconfirm.react.js +433 -433
  204. package/src/lib/components/feedback/AntdPopupCard.react.js +362 -362
  205. package/src/lib/components/feedback/AntdProgress.react.js +300 -300
  206. package/src/lib/components/feedback/AntdResult.react.js +125 -125
  207. package/src/lib/components/feedback/AntdSpin.react.js +273 -273
  208. package/src/lib/components/feedback/skeleton/AntdCustomSkeleton.react.js +197 -197
  209. package/src/lib/components/feedback/skeleton/AntdSkeleton.react.js +291 -291
  210. package/src/lib/components/feedback/skeleton/AntdSkeletonAvatar.react.js +109 -109
  211. package/src/lib/components/feedback/skeleton/AntdSkeletonButton.react.js +114 -114
  212. package/src/lib/components/feedback/skeleton/AntdSkeletonImage.react.js +82 -82
  213. package/src/lib/components/feedback/skeleton/AntdSkeletonInput.react.js +98 -98
  214. package/src/lib/components/formRender/AntdFormRender.react.js +945 -945
  215. package/src/lib/components/general/AntdButton.react.js +328 -328
  216. package/src/lib/components/general/AntdFloatButton.react.js +157 -157
  217. package/src/lib/components/general/AntdFloatButtonGroup.react.js +162 -162
  218. package/src/lib/components/general/AntdIcon.react.js +176 -176
  219. package/src/lib/components/general/typography/AntdParagraph.react.js +202 -202
  220. package/src/lib/components/general/typography/AntdText.react.js +194 -194
  221. package/src/lib/components/general/typography/AntdTitle.react.js +186 -186
  222. package/src/lib/components/icons.react.js +1136 -1136
  223. package/src/lib/components/layout/AntdCenter.react.js +122 -122
  224. package/src/lib/components/layout/AntdCompact.react.js +108 -108
  225. package/src/lib/components/layout/AntdContent.react.js +92 -92
  226. package/src/lib/components/layout/AntdDivider.react.js +219 -219
  227. package/src/lib/components/layout/AntdFlex.react.js +143 -143
  228. package/src/lib/components/layout/AntdFooter.react.js +92 -92
  229. package/src/lib/components/layout/AntdHeader.react.js +92 -92
  230. package/src/lib/components/layout/AntdLayout.react.js +90 -90
  231. package/src/lib/components/layout/AntdSider.react.js +162 -162
  232. package/src/lib/components/layout/AntdSpace.react.js +213 -213
  233. package/src/lib/components/layout/AntdSplitter.react.js +173 -173
  234. package/src/lib/components/layout/grid/AntdCol.react.js +349 -349
  235. package/src/lib/components/layout/grid/AntdRow.react.js +152 -152
  236. package/src/lib/components/locales.react.js +197 -197
  237. package/src/lib/components/navigation/AntdAnchor.react.js +208 -208
  238. package/src/lib/components/navigation/AntdBreadcrumb.react.js +270 -270
  239. package/src/lib/components/navigation/AntdDropdown.react.js +469 -469
  240. package/src/lib/components/navigation/AntdMenu.react.js +573 -649
  241. package/src/lib/components/navigation/AntdPageHeader.react.js +139 -139
  242. package/src/lib/components/navigation/AntdPagination.react.js +303 -303
  243. package/src/lib/components/navigation/AntdSteps.react.js +199 -199
  244. package/src/lib/components/other/AntdAffix.react.js +120 -120
  245. package/src/lib/components/other/AntdBackTop.react.js +128 -128
  246. package/src/lib/components/other/AntdConfigProvider.react.js +246 -246
  247. package/src/lib/components/other/AntdCopyText.react.js +138 -138
  248. package/src/lib/components/other/AntdHappyProvider.react.js +50 -50
  249. package/src/lib/components/other/AntdTour.react.js +277 -277
  250. package/src/lib/components/other/AntdWatermark.react.js +179 -179
  251. package/src/lib/components/other/Fragment.react.js +50 -50
  252. package/src/lib/components/styles.css +513 -513
  253. package/src/lib/components/utils.js +51 -51
  254. package/src/lib/contexts/FormContext.js +4 -4
  255. package/src/lib/contexts/FormItemContext.js +4 -4
  256. package/src/lib/contexts/PropsContext.js +4 -4
  257. package/src/lib/fragments/AntdTable.react.js +2215 -2200
  258. package/src/lib/fragments/dataDisplay/AntdAccordion.react.js +101 -101
  259. package/src/lib/fragments/dataDisplay/AntdAvatar.react.js +127 -127
  260. package/src/lib/fragments/dataDisplay/AntdAvatarGroup.react.js +51 -51
  261. package/src/lib/fragments/dataDisplay/AntdBadge.react.js +73 -73
  262. package/src/lib/fragments/dataDisplay/AntdCarousel.react.js +71 -71
  263. package/src/lib/fragments/dataDisplay/AntdCheckableTag.react.js +57 -57
  264. package/src/lib/fragments/dataDisplay/AntdComment.react.js +178 -178
  265. package/src/lib/fragments/dataDisplay/AntdCountdown.react.js +83 -83
  266. package/src/lib/fragments/dataDisplay/AntdCountup.react.js +70 -70
  267. package/src/lib/fragments/dataDisplay/AntdEmpty.react.js +71 -71
  268. package/src/lib/fragments/dataDisplay/AntdImage.react.js +206 -206
  269. package/src/lib/fragments/dataDisplay/AntdImageGroup.react.js +91 -91
  270. package/src/lib/fragments/dataDisplay/AntdPopover.react.js +106 -106
  271. package/src/lib/fragments/dataDisplay/AntdQRCode.react.js +93 -93
  272. package/src/lib/fragments/dataDisplay/AntdRibbon.react.js +53 -53
  273. package/src/lib/fragments/dataDisplay/AntdSegmented.react.js +129 -129
  274. package/src/lib/fragments/dataDisplay/AntdSpoiler.react.js +96 -96
  275. package/src/lib/fragments/dataDisplay/AntdTabs.react.js +211 -211
  276. package/src/lib/fragments/dataDisplay/AntdTag.react.js +66 -66
  277. package/src/lib/fragments/dataDisplay/AntdTimeline.react.js +67 -67
  278. package/src/lib/fragments/dataDisplay/AntdTooltip.react.js +98 -98
  279. package/src/lib/fragments/dataDisplay/AntdTree.react.js +581 -581
  280. package/src/lib/fragments/dataDisplay/card/AntdCard.react.js +104 -104
  281. package/src/lib/fragments/dataDisplay/card/AntdCardGrid.react.js +54 -54
  282. package/src/lib/fragments/dataDisplay/card/AntdCardMeta.react.js +54 -54
  283. package/src/lib/fragments/dataDisplay/descriptions/AntdDescriptionItem.react.js +56 -56
  284. package/src/lib/fragments/dataDisplay/descriptions/AntdDescriptions.react.js +139 -139
  285. package/src/lib/fragments/dataEntry/AntdCalendar.react.js +178 -178
  286. package/src/lib/fragments/dataEntry/AntdCascader.react.js +319 -319
  287. package/src/lib/fragments/dataEntry/AntdCheckbox.react.js +119 -119
  288. package/src/lib/fragments/dataEntry/AntdCheckboxGroup.react.js +122 -122
  289. package/src/lib/fragments/dataEntry/AntdColorPicker.react.js +244 -244
  290. package/src/lib/fragments/dataEntry/AntdDatePicker.react.js +586 -586
  291. package/src/lib/fragments/dataEntry/AntdDateRangePicker.react.js +628 -628
  292. package/src/lib/fragments/dataEntry/AntdInput.react.js +450 -450
  293. package/src/lib/fragments/dataEntry/AntdInputNumber.react.js +194 -194
  294. package/src/lib/fragments/dataEntry/AntdMentions.react.js +180 -180
  295. package/src/lib/fragments/dataEntry/AntdOTP.react.js +127 -127
  296. package/src/lib/fragments/dataEntry/AntdRadioGroup.react.js +203 -203
  297. package/src/lib/fragments/dataEntry/AntdRate.react.js +131 -131
  298. package/src/lib/fragments/dataEntry/AntdSegmentedColoring.react.js +246 -246
  299. package/src/lib/fragments/dataEntry/AntdSelect.react.js +373 -373
  300. package/src/lib/fragments/dataEntry/AntdSlider.react.js +177 -177
  301. package/src/lib/fragments/dataEntry/AntdSwitch.react.js +132 -132
  302. package/src/lib/fragments/dataEntry/AntdTimePicker.react.js +191 -191
  303. package/src/lib/fragments/dataEntry/AntdTimeRangePicker.react.js +213 -213
  304. package/src/lib/fragments/dataEntry/AntdTransfer.react.js +183 -183
  305. package/src/lib/fragments/dataEntry/AntdTreeSelect.react.js +355 -355
  306. package/src/lib/fragments/dataEntry/check-card/AntdCheckCard.react.js +111 -111
  307. package/src/lib/fragments/dataEntry/check-card/AntdCheckCardGroup.react.js +122 -122
  308. package/src/lib/fragments/dataEntry/form/AntdForm.react.js +126 -120
  309. package/src/lib/fragments/dataEntry/form/AntdFormItem.react.js +85 -84
  310. package/src/lib/fragments/formRender/AntdFormRender.react.js +179 -179
  311. package/src/lib/fragments/upload/AntdDraggerUpload.react.js +622 -622
  312. package/src/lib/fragments/upload/AntdPictureUpload.react.js +577 -577
  313. package/src/lib/fragments/upload/AntdUpload.react.js +613 -613
  314. package/src/lib/hooks/useCss.js +28 -28
  315. package/src/lib/hooks/useStickyOffset.js +115 -115
  316. package/src/lib/index.js +240 -240
  317. package/src/lib/internal_components/UtilsLink.react.js +82 -0
  318. package/src/lib/store/formStore.js +54 -47
  319. package/tests/dash3.0tests/AntdQRCode/347/273/204/344/273/266loading/347/212/266/346/200/201/351/207/215/346/236/204/test.py +51 -51
  320. package/tests/dash3.0tests/AntdTable/345/207/275/346/225/260/345/274/217/346/224/271/351/200/240/test.py +62 -62
  321. package/tests/dash3.0tests/_dashprivate_layout/346/224/271/345/212/250/346/265/213/350/257/225/test.py +50 -50
  322. package/tests/dash3.0tests/loading_state/346/224/271/345/212/250/346/265/213/350/257/225/test.py +38 -38
  323. package/tests/dash3.0tests//345/207/275/346/225/260/345/274/217/347/273/204/344/273/266/351/273/230/350/256/244/345/200/274/351/207/215/346/236/204/test.py +30 -30
  324. package/tests/dash3.0tests//345/212/240/350/275/275/345/212/250/347/224/273/347/261/273/347/273/204/344/273/266/351/207/215/346/236/204/346/265/213/350/257/225/test.py +62 -62
  325. package/tests/dash3.0tests//347/273/204/344/273/266/345/261/236/346/200/247/345/237/272/347/241/200/346/214/201/344/271/205/345/214/226/351/207/215/346/236/204/346/265/213/350/257/225/test.py +25 -25
  326. package/tests/dataDisplay/AntdAccordion/feat_size.py +36 -36
  327. package/tests/dataDisplay/AntdAccordion/feat_styles.py +35 -35
  328. package/tests/dataDisplay/AntdCard/refactor_delete_props.py +83 -83
  329. package/tests/dataDisplay/AntdCarousel/feat_auto_play_dot_duration.py +34 -34
  330. package/tests/dataDisplay/AntdCollapse/feat_size.py +30 -30
  331. package/tests/dataDisplay/AntdCollapse/feat_styles.py +29 -29
  332. package/tests/dataDisplay/AntdCountdown/feat_finish_event.py +41 -41
  333. package/tests/dataDisplay/AntdCountdown/refactor_to_timer.py +57 -57
  334. package/tests/dataDisplay/AntdCountup/refactor_to_timer.py +57 -57
  335. package/tests/dataDisplay/AntdDescriptions/feat_span_filled.py +42 -42
  336. package/tests/dataDisplay/AntdImage/debug_preview_toolbar.py +23 -23
  337. package/tests/dataDisplay/AntdSegmented/feat_shape.py +39 -39
  338. package/tests/dataDisplay/AntdSegmented/feat_simple_options.py +43 -43
  339. package/tests/dataDisplay/AntdSegmented/feat_vertical.py +32 -32
  340. package/tests/dataDisplay/AntdTable/feat_button_mode_like_dcc_link.py +125 -0
  341. package/tests/dataDisplay/AntdTable/feat_button_mode_refactor.py +143 -143
  342. package/tests/dataDisplay/AntdTable/feat_button_mode_tooltip.py +47 -47
  343. package/tests/dataDisplay/AntdTable/feat_columns_fixed_bool.py +40 -40
  344. package/tests/dataDisplay/AntdTable/feat_columns_min_width.py +51 -51
  345. package/tests/dataDisplay/AntdTable/feat_columns_sort_order.py +131 -131
  346. package/tests/dataDisplay/AntdTable/feat_editable_disabled_keys.py +71 -71
  347. package/tests/dataDisplay/AntdTable/feat_header_align.py +38 -38
  348. package/tests/dataDisplay/AntdTable/feat_link_mode_like_dcc_link.py +49 -0
  349. package/tests/dataDisplay/AntdTable/feat_loading.py +76 -76
  350. package/tests/dataDisplay/AntdTable/feat_mini_chart_color.py +139 -139
  351. package/tests/dataDisplay/AntdTable/feat_row_class_name.py +39 -39
  352. package/tests/dataDisplay/AntdTable/feat_row_class_name_func.py +41 -41
  353. package/tests/dataDisplay/AntdTable/feat_select_mode_show_search.py +70 -70
  354. package/tests/dataDisplay/AntdTable/feat_sticky_header.py +81 -81
  355. package/tests/dataDisplay/AntdTable/feat_table_scroll.py +54 -54
  356. package/tests/dataDisplay/AntdTable/feat_tag_mode_tooltip.py +88 -88
  357. package/tests/dataDisplay/AntdTable/feat_title_popover_nodes.py +94 -79
  358. package/tests/dataDisplay/AntdTable/fix_context_locale.py +37 -37
  359. package/tests/dataDisplay/AntdTable/fix_field_bool.py +50 -50
  360. package/tests/dataDisplay/AntdTable/fix_nested_editable.py +115 -115
  361. package/tests/dataDisplay/AntdTable/fix_select_with_editable.py +84 -84
  362. package/tests/dataDisplay/AntdTable/fix_server_side_mode_filter_search.py +194 -194
  363. package/tests/dataDisplay/AntdTable/fix_summary.py +474 -474
  364. package/tests/dataDisplay/AntdTable/fix_summary_multi_level_header.py +85 -85
  365. package/tests/dataDisplay/AntdTable/fix_zero_value_filter.py +34 -34
  366. package/tests/dataDisplay/AntdTable/perf_button_mode_auto_wrap.py +39 -39
  367. package/tests/dataDisplay/AntdTable/perf_editable_column_format_constrait_message.py +65 -65
  368. package/tests/dataDisplay/AntdTable/refactor_mini_progress_mode.py +134 -134
  369. package/tests/dataDisplay/AntdTable/rollback_title_popover_info.py +46 -0
  370. package/tests/dataDisplay/AntdTabs/feat_item_icon.py +39 -39
  371. package/tests/dataDisplay/AntdTabs/feat_placeholder.py +124 -124
  372. package/tests/dataDisplay/AntdTabs/feat_tab_bar_style.py +40 -40
  373. package/tests/dataDisplay/AntdTree/feat_async_data_load.py +71 -71
  374. package/tests/dataDisplay/descriptions/AntdDescriptions/feat_extra.py +83 -83
  375. package/tests/dataEntry/AntdCalendar/feat_custom_cells.py +52 -52
  376. package/tests/dataEntry/AntdCascader/feat_prefix.py +62 -62
  377. package/tests/dataEntry/AntdCascader/feat_suffix_icon.py +62 -62
  378. package/tests/dataEntry/AntdCascader/fix_read_only.py +74 -74
  379. package/tests/dataEntry/AntdDatePicker/feat_custom_cells.py +79 -79
  380. package/tests/dataEntry/AntdDatePicker/feat_picker_value.py +38 -38
  381. package/tests/dataEntry/AntdDatePicker/feat_prefix.py +21 -21
  382. package/tests/dataEntry/AntdDatePicker/feat_suffix_icon.py +21 -21
  383. package/tests/dataEntry/AntdDateRangePicker/feat_custom_cells.py +79 -79
  384. package/tests/dataEntry/AntdDateRangePicker/feat_picker_value.py +38 -38
  385. package/tests/dataEntry/AntdDateRangePicker/feat_prefix.py +21 -21
  386. package/tests/dataEntry/AntdDateRangePicker/feat_suffix_icon.py +21 -21
  387. package/tests/dataEntry/AntdForm/feat_batch_control_tooltips.py +35 -0
  388. package/tests/dataEntry/AntdForm/feat_optional_batch_control.py +62 -62
  389. package/tests/dataEntry/AntdForm/fix_checkbox.py +65 -65
  390. package/tests/dataEntry/AntdRadioGroup/feat_block.py +40 -40
  391. package/tests/dataEntry/AntdSelect/feat_locale_ru.py +24 -24
  392. package/tests/dataEntry/AntdSelect/feat_max_count.py +28 -28
  393. package/tests/dataEntry/AntdSelect/feat_prefix.py +26 -26
  394. package/tests/dataEntry/AntdSelect/feat_show_search.py +32 -32
  395. package/tests/dataEntry/AntdSelect/feat_suffix_icon.py +46 -46
  396. package/tests/dataEntry/AntdSelect/fix_read_only.py +50 -50
  397. package/tests/dataEntry/AntdSelect/fix_read_only_with_allow_clear.py +29 -29
  398. package/tests/dataEntry/AntdSlider/feat_range_editable.py +49 -49
  399. package/tests/dataEntry/AntdTimePicker/feat_prefix.py +21 -21
  400. package/tests/dataEntry/AntdTimePicker/feat_suffix_icon.py +21 -21
  401. package/tests/dataEntry/AntdTimeRangePicker/feat_prefix.py +21 -21
  402. package/tests/dataEntry/AntdTimeRangePicker/feat_suffix_icon.py +21 -21
  403. package/tests/dataEntry/AntdTreeSelect/feat_async_data_load.py +69 -69
  404. package/tests/dataEntry/AntdTreeSelect/feat_max_count.py +71 -71
  405. package/tests/dataEntry/AntdTreeSelect/feat_prefix.py +43 -43
  406. package/tests/dataEntry/AntdTreeSelect/fix_read_only.py +50 -50
  407. package/tests/dataEntry/AntdUpload/feat_pastable.py +22 -22
  408. package/tests/dataEntry/AntdUpload/fix_follow_theme.py +28 -28
  409. package/tests/feat_variant_underlined.py +100 -100
  410. package/tests/feedback/AntdAlert/feat_icon.py +35 -35
  411. package/tests/feedback/AntdMessage/fix_follow_config_provider.py +44 -44
  412. package/tests/feedback/AntdModal/feat_force_render.py +57 -57
  413. package/tests/feedback/AntdModal/feat_loading_title.py +92 -92
  414. package/tests/feedback/AntdModal/feat_prevent_close.py +54 -54
  415. package/tests/feedback/AntdModal/feat_responsive_width.py +31 -31
  416. package/tests/feedback/AntdNotification/feat_component_content.py +64 -64
  417. package/tests/feedback/AntdNotification/feat_number_of_stack.py +40 -40
  418. package/tests/feedback/AntdNotification/feat_show_progress.py +40 -40
  419. package/tests/feedback/AntdNotification/fix_follow_config_provider.py +46 -46
  420. package/tests/feedback/AntdPopupCard/feat_force_render.py +61 -61
  421. package/tests/feedback/AntdProgress/feat_percent_position.py +39 -39
  422. package/tests/feedback/AntdProgress/perf_size.py +26 -26
  423. package/tests/feedback/AntdProgress/perf_steps.py +37 -37
  424. package/tests/feedback/AntdProgress/perf_stroke_color.py +58 -58
  425. package/tests/feedback/AntdResult/feat_extra.py +26 -26
  426. package/tests/feedback/AntdSkeleton/fix_dash3.py +43 -43
  427. package/tests/general/AntdButton/feat_color_and_variant.py +40 -40
  428. package/tests/general/AntdButton/feat_preset_color.py +46 -46
  429. package/tests/general/AntdFloatButtonGroup/feat_placement.py +83 -83
  430. package/tests/general/AntdFloatButtonGroup/feat_tooltip.py +34 -34
  431. package/tests/general/AntdIcon/feat_iconfont.py +41 -41
  432. package/tests/layout/AntdCenter/feat_use_token.py +41 -41
  433. package/tests/layout/AntdDivider/feat_plain.py +21 -21
  434. package/tests/layout/AntdDivider/feat_size.py +36 -36
  435. package/tests/layout/AntdSplitter/feat_AntdSplitter.py +210 -210
  436. package/tests/layout/AntdSplitter/feat_lazy.py +56 -56
  437. package/tests/layout/AntdSplitter/refactor.py +303 -303
  438. package/tests/navigation/AntdAnchor/feat_current_anchor.py +43 -43
  439. package/tests/navigation/AntdAnchor/feat_direction.py +43 -43
  440. package/tests/navigation/AntdAnchor/feat_replace.py +43 -43
  441. package/tests/navigation/AntdBreadcrumb/feat_menu_item_event.py +64 -64
  442. package/tests/navigation/AntdBreadcrumb/refactor_items.py +140 -140
  443. package/tests/navigation/AntdDropdown/feat_extra.py +29 -29
  444. package/tests/navigation/AntdMenu/feat_currentItem.py +85 -85
  445. package/tests/navigation/AntdMenu/feat_currentItemPath.py +85 -85
  446. package/tests/navigation/AntdMenu/feat_currentKeyPath.py +85 -85
  447. package/tests/navigation/AntdMenu/feat_custom_icon.py +57 -57
  448. package/tests/navigation/AntdMenu/feat_expandIcon.py +70 -70
  449. package/tests/navigation/AntdMenu/feat_triggerSubMenuAction.py +67 -67
  450. package/tests/navigation/AntdMenu/fix_onlyExpandCurrentSubMenu.py +57 -57
  451. package/tests/navigation/AntdMenu/fix_with_sider.py +71 -71
  452. package/tests/navigation/AntdPagination/feat_align.py +31 -31
  453. package/tests/other/AntdAffix/feat_listen_affixed.py +41 -41
  454. package/tests/other/AntdBackTop/refactor.py +18 -18
  455. package/tests/other/AntdConfigProvider/feat_use_css.py +67 -67
  456. package/tests/other/AntdCopyText/feat_copy_table.py +67 -67
  457. package/tests/other/AntdCopyText/feat_tooltips.py +61 -61
  458. package/tests/other/AntdHappyProvider/feat_component.py +60 -60
  459. package/tests/other/Fragment/feat_use_token.py +32 -32
  460. package/usage.py +34 -34
  461. package/webpack.config.js +181 -181
  462. package/webpack.serve.config.js +12 -12
@@ -1,582 +1,582 @@
1
- // react核心
2
- import React, { useEffect, useRef, useMemo } from 'react';
3
- // antd核心
4
- import { Tree, Tooltip, Dropdown, Rate } from 'antd';
5
- import AntdIcon from '../../components/general/AntdIcon.react';
6
- // 辅助库
7
- import Highlighter from 'react-highlight-words';
8
- import { omitBy, isUndefined, isString, isObject, isArray, cloneDeep } from 'lodash';
9
- import { pickBy } from 'ramda';
10
- import { flatToTree, useLoading } from '../../components/utils';
11
- // 自定义hooks
12
- import useCss from '../../hooks/useCss';
13
- // 参数类型
14
- import { propTypes, defaultProps } from '../../components/dataDisplay/AntdTree.react';
15
-
16
- // 自定义工具函数
17
- // https://github.com/ant-design/ant-design/issues/15926
18
- const isSameLevel = (a, b) => {
19
- const aLevel = a.props.pos.split('-').length;
20
- const bLevel = b.props.pos.split('-').length;
21
-
22
- return aLevel === bLevel;
23
- };
24
-
25
- const isSameParent = (a, b) => {
26
- const aLevel = a.props.pos.split('-');
27
- const bLevel = b.props.pos.split('-');
28
- aLevel.pop();
29
-
30
- return aLevel.join('') === bLevel.join('');
31
- }
32
-
33
- const filterTree = (toFilterData, keyword, caseSensitive) => {
34
- return toFilterData.filter(node => {
35
- // 首先检查当前节点是否匹配关键字
36
- let isMatch = false;
37
- if (Array.isArray(keyword)) {
38
- isMatch = keyword.some(s => caseSensitive ? node.title.includes(s) : node.title.toLowerCase().includes(s.toLowerCase()));
39
- } else {
40
- isMatch = caseSensitive ? node.title.includes(keyword) : node.title.toLowerCase().includes(keyword.toLowerCase());
41
- }
42
-
43
- // 如果当前节点匹配关键字,但不是根节点,才保留它及其全部后代节点信息
44
- if (isMatch) {
45
- return true;
46
- }
47
-
48
- // 如果当前节点不匹配关键字,检查它的子节点
49
- if (node.children && node.children.length > 0) {
50
- node.children = filterTree(node.children, keyword, caseSensitive);
51
-
52
- // 如果有匹配的子节点,保留当前节点及其匹配的后代节点信息
53
- if (node.children.length > 0) {
54
- return true;
55
- }
56
- }
57
-
58
- // 如果当前节点和它的子节点都不匹配,返回 false,表示不保留该节点
59
- return false;
60
- });
61
- }
62
-
63
- /**
64
- * 树形控件组件AntdTree
65
- */
66
- const AntdTree = (props) => {
67
- let {
68
- id,
69
- className,
70
- setProps,
71
- style,
72
- key,
73
- treeData,
74
- treeNodeKeyToTitle,
75
- treeDataMode,
76
- checkable,
77
- selectable,
78
- selectedKeys,
79
- expandedKeys,
80
- checkedKeys,
81
- defaultExpandAll,
82
- defaultExpandedKeys,
83
- defaultExpandParent,
84
- checkStrictly,
85
- defaultCheckedKeys,
86
- defaultSelectedKeys,
87
- multiple,
88
- showLine,
89
- switcherIcon,
90
- showIcon,
91
- height,
92
- draggable,
93
- showDragIcon,
94
- dragInSameLevel,
95
- dragDisabledKeys,
96
- dropDisabledKeys,
97
- enableNodeFavorites,
98
- favoritedKeys,
99
- scrollTarget,
100
- searchKeyword,
101
- caseSensitive,
102
- highlightStyle,
103
- nodeCheckedSuffix,
104
- nodeUncheckedSuffix,
105
- nodeCheckedStyle,
106
- nodeUncheckedStyle,
107
- enableAsyncLoad,
108
- persistence,
109
- persisted_props,
110
- persistence_type,
111
- batchPropsNames,
112
- ...others
113
- } = props;
114
-
115
- // 异步数据加载标识
116
- const dataLoading = useRef(false);
117
-
118
- // 每次treeData更新后,尝试还原dataLoading状态
119
- useEffect(() => {
120
- if (dataLoading.current) {
121
- dataLoading.current = false;
122
- }
123
- }, [treeData])
124
-
125
- // 批属性监听
126
- useEffect(() => {
127
- if (batchPropsNames && batchPropsNames.length !== 0) {
128
- let _batchPropsValues = {};
129
- for (let propName of batchPropsNames) {
130
- _batchPropsValues[propName] = props[propName];
131
- }
132
- setProps({
133
- batchPropsValues: _batchPropsValues
134
- })
135
- }
136
- })
137
-
138
- const treeRef = useRef(null);
139
-
140
- // 控制一次性scrollTarget动作
141
- useEffect(() => {
142
- if (scrollTarget && treeRef.current) {
143
- treeRef.current.scrollTo(scrollTarget);
144
- setProps({
145
- scrollTarget: null
146
- })
147
- }
148
- }, [scrollTarget])
149
-
150
- if (showLine) {
151
- showLine = { 'showLeafIcon': false }
152
- }
153
-
154
- useEffect(() => {
155
- setProps({
156
- expandedKeys: defaultExpandedKeys && !expandedKeys ? defaultExpandedKeys : expandedKeys,
157
- selectedKeys: defaultSelectedKeys && !selectedKeys ? defaultSelectedKeys : selectedKeys,
158
- checkedKeys: defaultCheckedKeys && !checkedKeys ? defaultCheckedKeys : checkedKeys
159
- })
160
- }, [])
161
-
162
- const flatToTreeData = useMemo(() => {
163
- return flatToTree(treeData);
164
- }, [treeData])
165
-
166
- // 根据treeDataMode对treeData进行预处理
167
- if (treeDataMode === 'flat') {
168
- treeData = flatToTreeData
169
- }
170
-
171
- // 用于以递归的方式将节点icon属性替换成相应的icon对象
172
- const add_leaf_node_icon = (inputTreeData) => {
173
- if (isObject(inputTreeData)) {
174
- // 为节点添加tooltip相关参数
175
- if (inputTreeData.tooltipProps && isString(inputTreeData.title)) {
176
- inputTreeData.title = (<Tooltip {...inputTreeData.tooltipProps}>
177
- {inputTreeData.title}
178
- </Tooltip>)
179
- }
180
- if (inputTreeData.children) {
181
- if (isString(inputTreeData.icon)) {
182
- inputTreeData.icon = (
183
- inputTreeData.iconRenderer === 'fontawesome' ?
184
- (
185
- React.createElement(
186
- 'i',
187
- {
188
- className: inputTreeData.icon
189
- }
190
- )
191
- ) :
192
- (
193
- <AntdIcon icon={inputTreeData.icon} />
194
- )
195
- )
196
- }
197
- for (let i = 0; i < inputTreeData.children.length; i++) {
198
- inputTreeData.children[i] = add_leaf_node_icon(inputTreeData.children[i])
199
- }
200
- } else {
201
- if (isString(inputTreeData.icon)) {
202
- inputTreeData.icon = (
203
- inputTreeData.iconRenderer === 'fontawesome' ?
204
- (
205
- React.createElement(
206
- 'i',
207
- {
208
- className: inputTreeData.icon
209
- }
210
- )
211
- ) :
212
- (
213
- <AntdIcon icon={inputTreeData.icon} />
214
- )
215
- )
216
- }
217
- }
218
- }
219
-
220
- if (isArray(inputTreeData)) {
221
- for (var i = 0; i < inputTreeData.length; i++) {
222
- inputTreeData[i] = add_leaf_node_icon(inputTreeData[i])
223
- }
224
- }
225
-
226
- return inputTreeData;
227
- }
228
-
229
- const listenSelect = (e) => {
230
- setProps({ selectedKeys: e })
231
- }
232
-
233
- const listenCheck = (checkedKeys, e) => {
234
- if (checkStrictly) {
235
- setProps({
236
- checkedKeys: checkedKeys.checked,
237
- halfCheckedKeys: checkedKeys.halfChecked
238
- })
239
- } else {
240
- setProps({
241
- checkedKeys: checkedKeys,
242
- halfCheckedKeys: e.halfCheckedKeys
243
- })
244
- }
245
- }
246
-
247
- const listenExpand = (e) => {
248
- setProps({ expandedKeys: e })
249
- }
250
-
251
- const onDragEnter = (info) => {
252
- setProps({ expandedKeys: info.expandedKeys })
253
- };
254
-
255
- let config = {
256
- expandedKeys
257
- }
258
-
259
- config = omitBy(config, isUndefined)
260
-
261
- // 处理树节点拖拽事件,偏平结构模式下不可用
262
- const onDrop = (info) => {
263
-
264
- // 若当前放置目标节点前后同级不允许被放置
265
- if (dropDisabledKeys && dropDisabledKeys.includes(info.node.key)) {
266
- // 结束拖拽计算过程
267
- return
268
- }
269
-
270
- // 若仅允许同级拖拽
271
- if (dragInSameLevel) {
272
- const canDrop = (isSameLevel(info.dragNode, info.node) && info.dropToGap) || (isSameParent(info.dragNode, info.node) && !info.dropToGap);
273
- if (!canDrop) {
274
- // 结束拖拽计算过程
275
- return
276
- }
277
- }
278
-
279
- const dropKey = info.node.key;
280
- const dragKey = info.dragNode.key;
281
- const dropPos = info.node.pos.split('-');
282
- const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
283
- const loop = (data, _key, callback) => {
284
- for (let i = 0; i < data.length; i++) {
285
- if (data[i].key === _key) {
286
- return callback(data[i], i, data);
287
- }
288
- if (data[i].children) {
289
- loop(data[i].children, _key, callback);
290
- }
291
- }
292
- };
293
- const data = cloneDeep(treeData);
294
-
295
- let dragObj;
296
- loop(data, dragKey, (item, index, arr) => {
297
- arr.splice(index, 1);
298
- dragObj = item;
299
- });
300
- if (!info.dropToGap) {
301
- loop(data, dropKey, (item) => {
302
- item.children = item.children || [];
303
-
304
- item.children.unshift(dragObj);
305
- });
306
- } else if (
307
- (info.node.props.children || []).length > 0 &&
308
- info.node.props.expanded &&
309
- dropPosition === 1
310
- ) {
311
- loop(data, dropKey, (item) => {
312
- item.children = item.children || [];
313
- item.children.unshift(dragObj);
314
- });
315
- } else {
316
- let ar = [];
317
- let i;
318
- loop(data, dropKey, (_item, index, arr) => {
319
- ar = arr;
320
- i = index;
321
- });
322
- if (dropPosition === -1) {
323
- ar.splice(i, 0, dragObj);
324
- } else {
325
- ar.splice(i + 1, 0, dragObj);
326
- }
327
- }
328
- // 更新拖拽完成后的树结构数据
329
- setProps({
330
- treeData: data,
331
- draggedNodeKey: dragKey
332
- })
333
- };
334
-
335
- return (
336
- <Tree
337
- // 提取具有data-*或aria-*通配格式的属性
338
- {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
339
- id={id}
340
- className={
341
- isString(className) ?
342
- className :
343
- (className ? useCss(className) : undefined)
344
- }
345
- style={style}
346
- key={key}
347
- ref={treeRef}
348
- treeData={
349
- searchKeyword ?
350
- add_leaf_node_icon(filterTree(cloneDeep(treeData), searchKeyword, caseSensitive)) :
351
- add_leaf_node_icon(cloneDeep(treeData))
352
- }
353
- selectedKeys={selectedKeys}
354
- checkedKeys={checkedKeys}
355
- selectable={selectable}
356
- checkable={checkable}
357
- defaultExpandAll={defaultExpandAll}
358
- defaultExpandedKeys={defaultExpandedKeys}
359
- defaultExpandParent={defaultExpandParent}
360
- defaultCheckedKeys={defaultCheckedKeys}
361
- defaultSelectedKeys={defaultSelectedKeys}
362
- checkStrictly={checkStrictly}
363
- multiple={multiple}
364
- showLine={showLine}
365
- switcherIcon={switcherIcon}
366
- onSelect={listenSelect}
367
- onCheck={listenCheck}
368
- onExpand={listenExpand}
369
- onDragEnter={onDragEnter}
370
- showIcon={showIcon}
371
- height={height}
372
- titleRender={(nodeData) => {
373
- return (
374
- nodeData.contextMenu ?
375
- (
376
- <Dropdown
377
- menu={{
378
- items: nodeData.contextMenu.map(
379
- itemProps => {
380
- return {
381
- ...itemProps,
382
- icon: itemProps.icon && (
383
- itemProps.iconRenderer === 'fontawesome' ?
384
- (
385
- React.createElement(
386
- 'i',
387
- {
388
- className: itemProps.icon
389
- }
390
- )
391
- ) :
392
- (
393
- <AntdIcon icon={itemProps.icon} />
394
- )
395
- )
396
- }
397
- }
398
- ),
399
- // 右键菜单事件监听
400
- onClick: (e) => {
401
- // 阻止事件蔓延
402
- e.domEvent.stopPropagation()
403
- // 更新相关事件信息
404
- setProps({
405
- clickedContextMenu: {
406
- nodeKey: nodeData.key,
407
- menuKey: e.key,
408
- timestamp: Date.now()
409
- }
410
- })
411
- }
412
- }}
413
- trigger={['contextMenu']}
414
- >
415
- <span className={nodeData.className ? `ant-tree-title ${nodeData.className}` : "ant-tree-title"}
416
- style={{
417
- ...(checkedKeys?.includes(nodeData.key) ? nodeCheckedStyle : nodeUncheckedStyle),
418
- ...nodeData.style // 优先级更高
419
- }}>
420
- {
421
- searchKeyword ?
422
- <Highlighter
423
- highlightStyle={highlightStyle}
424
- searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
425
- autoEscape
426
- textToHighlight={nodeData.title}
427
- /> :
428
- (
429
- treeNodeKeyToTitle && treeNodeKeyToTitle[nodeData.key] ?
430
- treeNodeKeyToTitle[nodeData.key] :
431
- nodeData.title
432
- )
433
- }
434
- {
435
- // 若当前节点满足收藏控件渲染条件
436
- enableNodeFavorites && (isUndefined(nodeData.enableFavorites) || nodeData.enableFavorites) ?
437
- <span style={{
438
- paddingLeft: 2
439
- }}
440
- onClick={(e) => {
441
- // 阻止事件向外传递
442
- e.stopPropagation()
443
- }}>
444
- <Rate
445
- count={1}
446
- value={favoritedKeys.includes(nodeData.key) ? 1 : 0}
447
- onChange={(e) => {
448
- setProps({
449
- favoritedKeys: (
450
- favoritedKeys.includes(nodeData.key) ?
451
- favoritedKeys.filter(key => key !== nodeData.key) :
452
- [...favoritedKeys, nodeData.key]
453
- )
454
- })
455
- }}
456
- />
457
- </span> :
458
- null
459
- }
460
- {checkedKeys?.includes(nodeData.key) ? nodeCheckedSuffix : nodeUncheckedSuffix}
461
- </span>
462
- </Dropdown>
463
- ) :
464
- (
465
- <span className={nodeData.className ? `ant-tree-title ${nodeData.className}` : "ant-tree-title"}
466
- style={{
467
- ...(checkedKeys?.includes(nodeData.key) ? nodeCheckedStyle : nodeUncheckedStyle),
468
- ...nodeData.style // 优先级更高
469
- }}>
470
- {
471
- searchKeyword ?
472
- (
473
- nodeData.tooltipProps ?
474
- <Tooltip {...nodeData.tooltipProps}>
475
- <Highlighter
476
- highlightStyle={highlightStyle}
477
- searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
478
- autoEscape
479
- textToHighlight={nodeData.title.props.children}
480
- />
481
- </Tooltip> :
482
- <Highlighter
483
- highlightStyle={highlightStyle}
484
- searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
485
- autoEscape
486
- textToHighlight={nodeData.title}
487
- />
488
- ) :
489
- (
490
- treeNodeKeyToTitle && treeNodeKeyToTitle[nodeData.key] ?
491
- treeNodeKeyToTitle[nodeData.key] :
492
- nodeData.title
493
- )
494
- }
495
- {
496
- // 若当前节点满足收藏控件渲染条件
497
- enableNodeFavorites && (isUndefined(nodeData.enableFavorites) || nodeData.enableFavorites) ?
498
- <span style={{
499
- paddingLeft: 2
500
- }}
501
- onClick={(e) => {
502
- // 阻止事件向外传递
503
- e.stopPropagation()
504
- }}>
505
- <Rate
506
- count={1}
507
- value={favoritedKeys.includes(nodeData.key) ? 1 : 0}
508
- onChange={(e) => {
509
- setProps({
510
- favoritedKeys: (
511
- favoritedKeys.includes(nodeData.key) ?
512
- favoritedKeys.filter(key => key !== nodeData.key) :
513
- [...favoritedKeys, nodeData.key]
514
- )
515
- })
516
- }}
517
- />
518
- </span> :
519
- null
520
- }
521
- {checkedKeys?.includes(nodeData.key) ? nodeCheckedSuffix : nodeUncheckedSuffix}
522
- </span>
523
- )
524
- );
525
- }}
526
- showLeafIcon={false}
527
- // 处理树可拖拽特性
528
- draggable={
529
- (draggable && treeDataMode !== 'flat') ?
530
- {
531
- icon: showDragIcon,
532
- nodeDraggable: (node) => {
533
- // 检查当前节点是否被禁用拖拽
534
- if (dragDisabledKeys && dragDisabledKeys.includes(node.key)) {
535
- return false;
536
- }
537
- return true;
538
- }
539
- } :
540
- false
541
- }
542
- blockNode={draggable && treeDataMode !== 'flat'}
543
- onDrop={draggable && treeDataMode !== 'flat' ? onDrop : undefined}
544
- loadData={
545
- enableAsyncLoad ?
546
- (node) => {
547
- // 更新最新的异步加载数据目标节点
548
- setProps({
549
- loadingNode: {
550
- key: node.key,
551
- title: node.title
552
- }
553
- })
554
- return new Promise(
555
- (resolve) => {
556
- // 更新数据异步加载标识
557
- dataLoading.current = true;
558
- // 轮询检测是否加载完成
559
- const timer = setInterval(
560
- () => {
561
- if (!dataLoading.current) {
562
- clearInterval(timer);
563
- resolve();
564
- }
565
- },
566
- 200
567
- );
568
- }
569
- )
570
- } :
571
- undefined
572
- }
573
- data-dash-is-loading={useLoading()}
574
- {...config}
575
- />
576
- );
577
- }
578
-
579
- export default AntdTree;
580
-
581
- AntdTree.defaultProps = defaultProps;
1
+ // react核心
2
+ import React, { useEffect, useRef, useMemo } from 'react';
3
+ // antd核心
4
+ import { Tree, Tooltip, Dropdown, Rate } from 'antd';
5
+ import AntdIcon from '../../components/general/AntdIcon.react';
6
+ // 辅助库
7
+ import Highlighter from 'react-highlight-words';
8
+ import { omitBy, isUndefined, isString, isObject, isArray, cloneDeep } from 'lodash';
9
+ import { pickBy } from 'ramda';
10
+ import { flatToTree, useLoading } from '../../components/utils';
11
+ // 自定义hooks
12
+ import useCss from '../../hooks/useCss';
13
+ // 参数类型
14
+ import { propTypes, defaultProps } from '../../components/dataDisplay/AntdTree.react';
15
+
16
+ // 自定义工具函数
17
+ // https://github.com/ant-design/ant-design/issues/15926
18
+ const isSameLevel = (a, b) => {
19
+ const aLevel = a.props.pos.split('-').length;
20
+ const bLevel = b.props.pos.split('-').length;
21
+
22
+ return aLevel === bLevel;
23
+ };
24
+
25
+ const isSameParent = (a, b) => {
26
+ const aLevel = a.props.pos.split('-');
27
+ const bLevel = b.props.pos.split('-');
28
+ aLevel.pop();
29
+
30
+ return aLevel.join('') === bLevel.join('');
31
+ }
32
+
33
+ const filterTree = (toFilterData, keyword, caseSensitive) => {
34
+ return toFilterData.filter(node => {
35
+ // 首先检查当前节点是否匹配关键字
36
+ let isMatch = false;
37
+ if (Array.isArray(keyword)) {
38
+ isMatch = keyword.some(s => caseSensitive ? node.title.includes(s) : node.title.toLowerCase().includes(s.toLowerCase()));
39
+ } else {
40
+ isMatch = caseSensitive ? node.title.includes(keyword) : node.title.toLowerCase().includes(keyword.toLowerCase());
41
+ }
42
+
43
+ // 如果当前节点匹配关键字,但不是根节点,才保留它及其全部后代节点信息
44
+ if (isMatch) {
45
+ return true;
46
+ }
47
+
48
+ // 如果当前节点不匹配关键字,检查它的子节点
49
+ if (node.children && node.children.length > 0) {
50
+ node.children = filterTree(node.children, keyword, caseSensitive);
51
+
52
+ // 如果有匹配的子节点,保留当前节点及其匹配的后代节点信息
53
+ if (node.children.length > 0) {
54
+ return true;
55
+ }
56
+ }
57
+
58
+ // 如果当前节点和它的子节点都不匹配,返回 false,表示不保留该节点
59
+ return false;
60
+ });
61
+ }
62
+
63
+ /**
64
+ * 树形控件组件AntdTree
65
+ */
66
+ const AntdTree = (props) => {
67
+ let {
68
+ id,
69
+ className,
70
+ setProps,
71
+ style,
72
+ key,
73
+ treeData,
74
+ treeNodeKeyToTitle,
75
+ treeDataMode,
76
+ checkable,
77
+ selectable,
78
+ selectedKeys,
79
+ expandedKeys,
80
+ checkedKeys,
81
+ defaultExpandAll,
82
+ defaultExpandedKeys,
83
+ defaultExpandParent,
84
+ checkStrictly,
85
+ defaultCheckedKeys,
86
+ defaultSelectedKeys,
87
+ multiple,
88
+ showLine,
89
+ switcherIcon,
90
+ showIcon,
91
+ height,
92
+ draggable,
93
+ showDragIcon,
94
+ dragInSameLevel,
95
+ dragDisabledKeys,
96
+ dropDisabledKeys,
97
+ enableNodeFavorites,
98
+ favoritedKeys,
99
+ scrollTarget,
100
+ searchKeyword,
101
+ caseSensitive,
102
+ highlightStyle,
103
+ nodeCheckedSuffix,
104
+ nodeUncheckedSuffix,
105
+ nodeCheckedStyle,
106
+ nodeUncheckedStyle,
107
+ enableAsyncLoad,
108
+ persistence,
109
+ persisted_props,
110
+ persistence_type,
111
+ batchPropsNames,
112
+ ...others
113
+ } = props;
114
+
115
+ // 异步数据加载标识
116
+ const dataLoading = useRef(false);
117
+
118
+ // 每次treeData更新后,尝试还原dataLoading状态
119
+ useEffect(() => {
120
+ if (dataLoading.current) {
121
+ dataLoading.current = false;
122
+ }
123
+ }, [treeData])
124
+
125
+ // 批属性监听
126
+ useEffect(() => {
127
+ if (batchPropsNames && batchPropsNames.length !== 0) {
128
+ let _batchPropsValues = {};
129
+ for (let propName of batchPropsNames) {
130
+ _batchPropsValues[propName] = props[propName];
131
+ }
132
+ setProps({
133
+ batchPropsValues: _batchPropsValues
134
+ })
135
+ }
136
+ })
137
+
138
+ const treeRef = useRef(null);
139
+
140
+ // 控制一次性scrollTarget动作
141
+ useEffect(() => {
142
+ if (scrollTarget && treeRef.current) {
143
+ treeRef.current.scrollTo(scrollTarget);
144
+ setProps({
145
+ scrollTarget: null
146
+ })
147
+ }
148
+ }, [scrollTarget])
149
+
150
+ if (showLine) {
151
+ showLine = { 'showLeafIcon': false }
152
+ }
153
+
154
+ useEffect(() => {
155
+ setProps({
156
+ expandedKeys: defaultExpandedKeys && !expandedKeys ? defaultExpandedKeys : expandedKeys,
157
+ selectedKeys: defaultSelectedKeys && !selectedKeys ? defaultSelectedKeys : selectedKeys,
158
+ checkedKeys: defaultCheckedKeys && !checkedKeys ? defaultCheckedKeys : checkedKeys
159
+ })
160
+ }, [])
161
+
162
+ const flatToTreeData = useMemo(() => {
163
+ return flatToTree(treeData);
164
+ }, [treeData])
165
+
166
+ // 根据treeDataMode对treeData进行预处理
167
+ if (treeDataMode === 'flat') {
168
+ treeData = flatToTreeData
169
+ }
170
+
171
+ // 用于以递归的方式将节点icon属性替换成相应的icon对象
172
+ const add_leaf_node_icon = (inputTreeData) => {
173
+ if (isObject(inputTreeData)) {
174
+ // 为节点添加tooltip相关参数
175
+ if (inputTreeData.tooltipProps && isString(inputTreeData.title)) {
176
+ inputTreeData.title = (<Tooltip {...inputTreeData.tooltipProps}>
177
+ {inputTreeData.title}
178
+ </Tooltip>)
179
+ }
180
+ if (inputTreeData.children) {
181
+ if (isString(inputTreeData.icon)) {
182
+ inputTreeData.icon = (
183
+ inputTreeData.iconRenderer === 'fontawesome' ?
184
+ (
185
+ React.createElement(
186
+ 'i',
187
+ {
188
+ className: inputTreeData.icon
189
+ }
190
+ )
191
+ ) :
192
+ (
193
+ <AntdIcon icon={inputTreeData.icon} />
194
+ )
195
+ )
196
+ }
197
+ for (let i = 0; i < inputTreeData.children.length; i++) {
198
+ inputTreeData.children[i] = add_leaf_node_icon(inputTreeData.children[i])
199
+ }
200
+ } else {
201
+ if (isString(inputTreeData.icon)) {
202
+ inputTreeData.icon = (
203
+ inputTreeData.iconRenderer === 'fontawesome' ?
204
+ (
205
+ React.createElement(
206
+ 'i',
207
+ {
208
+ className: inputTreeData.icon
209
+ }
210
+ )
211
+ ) :
212
+ (
213
+ <AntdIcon icon={inputTreeData.icon} />
214
+ )
215
+ )
216
+ }
217
+ }
218
+ }
219
+
220
+ if (isArray(inputTreeData)) {
221
+ for (var i = 0; i < inputTreeData.length; i++) {
222
+ inputTreeData[i] = add_leaf_node_icon(inputTreeData[i])
223
+ }
224
+ }
225
+
226
+ return inputTreeData;
227
+ }
228
+
229
+ const listenSelect = (e) => {
230
+ setProps({ selectedKeys: e })
231
+ }
232
+
233
+ const listenCheck = (checkedKeys, e) => {
234
+ if (checkStrictly) {
235
+ setProps({
236
+ checkedKeys: checkedKeys.checked,
237
+ halfCheckedKeys: checkedKeys.halfChecked
238
+ })
239
+ } else {
240
+ setProps({
241
+ checkedKeys: checkedKeys,
242
+ halfCheckedKeys: e.halfCheckedKeys
243
+ })
244
+ }
245
+ }
246
+
247
+ const listenExpand = (e) => {
248
+ setProps({ expandedKeys: e })
249
+ }
250
+
251
+ const onDragEnter = (info) => {
252
+ setProps({ expandedKeys: info.expandedKeys })
253
+ };
254
+
255
+ let config = {
256
+ expandedKeys
257
+ }
258
+
259
+ config = omitBy(config, isUndefined)
260
+
261
+ // 处理树节点拖拽事件,偏平结构模式下不可用
262
+ const onDrop = (info) => {
263
+
264
+ // 若当前放置目标节点前后同级不允许被放置
265
+ if (dropDisabledKeys && dropDisabledKeys.includes(info.node.key)) {
266
+ // 结束拖拽计算过程
267
+ return
268
+ }
269
+
270
+ // 若仅允许同级拖拽
271
+ if (dragInSameLevel) {
272
+ const canDrop = (isSameLevel(info.dragNode, info.node) && info.dropToGap) || (isSameParent(info.dragNode, info.node) && !info.dropToGap);
273
+ if (!canDrop) {
274
+ // 结束拖拽计算过程
275
+ return
276
+ }
277
+ }
278
+
279
+ const dropKey = info.node.key;
280
+ const dragKey = info.dragNode.key;
281
+ const dropPos = info.node.pos.split('-');
282
+ const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
283
+ const loop = (data, _key, callback) => {
284
+ for (let i = 0; i < data.length; i++) {
285
+ if (data[i].key === _key) {
286
+ return callback(data[i], i, data);
287
+ }
288
+ if (data[i].children) {
289
+ loop(data[i].children, _key, callback);
290
+ }
291
+ }
292
+ };
293
+ const data = cloneDeep(treeData);
294
+
295
+ let dragObj;
296
+ loop(data, dragKey, (item, index, arr) => {
297
+ arr.splice(index, 1);
298
+ dragObj = item;
299
+ });
300
+ if (!info.dropToGap) {
301
+ loop(data, dropKey, (item) => {
302
+ item.children = item.children || [];
303
+
304
+ item.children.unshift(dragObj);
305
+ });
306
+ } else if (
307
+ (info.node.props.children || []).length > 0 &&
308
+ info.node.props.expanded &&
309
+ dropPosition === 1
310
+ ) {
311
+ loop(data, dropKey, (item) => {
312
+ item.children = item.children || [];
313
+ item.children.unshift(dragObj);
314
+ });
315
+ } else {
316
+ let ar = [];
317
+ let i;
318
+ loop(data, dropKey, (_item, index, arr) => {
319
+ ar = arr;
320
+ i = index;
321
+ });
322
+ if (dropPosition === -1) {
323
+ ar.splice(i, 0, dragObj);
324
+ } else {
325
+ ar.splice(i + 1, 0, dragObj);
326
+ }
327
+ }
328
+ // 更新拖拽完成后的树结构数据
329
+ setProps({
330
+ treeData: data,
331
+ draggedNodeKey: dragKey
332
+ })
333
+ };
334
+
335
+ return (
336
+ <Tree
337
+ // 提取具有data-*或aria-*通配格式的属性
338
+ {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
339
+ id={id}
340
+ className={
341
+ isString(className) ?
342
+ className :
343
+ (className ? useCss(className) : undefined)
344
+ }
345
+ style={style}
346
+ key={key}
347
+ ref={treeRef}
348
+ treeData={
349
+ searchKeyword ?
350
+ add_leaf_node_icon(filterTree(cloneDeep(treeData), searchKeyword, caseSensitive)) :
351
+ add_leaf_node_icon(cloneDeep(treeData))
352
+ }
353
+ selectedKeys={selectedKeys}
354
+ checkedKeys={checkedKeys}
355
+ selectable={selectable}
356
+ checkable={checkable}
357
+ defaultExpandAll={defaultExpandAll}
358
+ defaultExpandedKeys={defaultExpandedKeys}
359
+ defaultExpandParent={defaultExpandParent}
360
+ defaultCheckedKeys={defaultCheckedKeys}
361
+ defaultSelectedKeys={defaultSelectedKeys}
362
+ checkStrictly={checkStrictly}
363
+ multiple={multiple}
364
+ showLine={showLine}
365
+ switcherIcon={switcherIcon}
366
+ onSelect={listenSelect}
367
+ onCheck={listenCheck}
368
+ onExpand={listenExpand}
369
+ onDragEnter={onDragEnter}
370
+ showIcon={showIcon}
371
+ height={height}
372
+ titleRender={(nodeData) => {
373
+ return (
374
+ nodeData.contextMenu ?
375
+ (
376
+ <Dropdown
377
+ menu={{
378
+ items: nodeData.contextMenu.map(
379
+ itemProps => {
380
+ return {
381
+ ...itemProps,
382
+ icon: itemProps.icon && (
383
+ itemProps.iconRenderer === 'fontawesome' ?
384
+ (
385
+ React.createElement(
386
+ 'i',
387
+ {
388
+ className: itemProps.icon
389
+ }
390
+ )
391
+ ) :
392
+ (
393
+ <AntdIcon icon={itemProps.icon} />
394
+ )
395
+ )
396
+ }
397
+ }
398
+ ),
399
+ // 右键菜单事件监听
400
+ onClick: (e) => {
401
+ // 阻止事件蔓延
402
+ e.domEvent.stopPropagation()
403
+ // 更新相关事件信息
404
+ setProps({
405
+ clickedContextMenu: {
406
+ nodeKey: nodeData.key,
407
+ menuKey: e.key,
408
+ timestamp: Date.now()
409
+ }
410
+ })
411
+ }
412
+ }}
413
+ trigger={['contextMenu']}
414
+ >
415
+ <span className={nodeData.className ? `ant-tree-title ${nodeData.className}` : "ant-tree-title"}
416
+ style={{
417
+ ...(checkedKeys?.includes(nodeData.key) ? nodeCheckedStyle : nodeUncheckedStyle),
418
+ ...nodeData.style // 优先级更高
419
+ }}>
420
+ {
421
+ searchKeyword ?
422
+ <Highlighter
423
+ highlightStyle={highlightStyle}
424
+ searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
425
+ autoEscape
426
+ textToHighlight={nodeData.title}
427
+ /> :
428
+ (
429
+ treeNodeKeyToTitle && treeNodeKeyToTitle[nodeData.key] ?
430
+ treeNodeKeyToTitle[nodeData.key] :
431
+ nodeData.title
432
+ )
433
+ }
434
+ {
435
+ // 若当前节点满足收藏控件渲染条件
436
+ enableNodeFavorites && (isUndefined(nodeData.enableFavorites) || nodeData.enableFavorites) ?
437
+ <span style={{
438
+ paddingLeft: 2
439
+ }}
440
+ onClick={(e) => {
441
+ // 阻止事件向外传递
442
+ e.stopPropagation()
443
+ }}>
444
+ <Rate
445
+ count={1}
446
+ value={favoritedKeys.includes(nodeData.key) ? 1 : 0}
447
+ onChange={(e) => {
448
+ setProps({
449
+ favoritedKeys: (
450
+ favoritedKeys.includes(nodeData.key) ?
451
+ favoritedKeys.filter(key => key !== nodeData.key) :
452
+ [...favoritedKeys, nodeData.key]
453
+ )
454
+ })
455
+ }}
456
+ />
457
+ </span> :
458
+ null
459
+ }
460
+ {checkedKeys?.includes(nodeData.key) ? nodeCheckedSuffix : nodeUncheckedSuffix}
461
+ </span>
462
+ </Dropdown>
463
+ ) :
464
+ (
465
+ <span className={nodeData.className ? `ant-tree-title ${nodeData.className}` : "ant-tree-title"}
466
+ style={{
467
+ ...(checkedKeys?.includes(nodeData.key) ? nodeCheckedStyle : nodeUncheckedStyle),
468
+ ...nodeData.style // 优先级更高
469
+ }}>
470
+ {
471
+ searchKeyword ?
472
+ (
473
+ nodeData.tooltipProps ?
474
+ <Tooltip {...nodeData.tooltipProps}>
475
+ <Highlighter
476
+ highlightStyle={highlightStyle}
477
+ searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
478
+ autoEscape
479
+ textToHighlight={nodeData.title.props.children}
480
+ />
481
+ </Tooltip> :
482
+ <Highlighter
483
+ highlightStyle={highlightStyle}
484
+ searchWords={Array.isArray(searchKeyword) ? searchKeyword : [searchKeyword]}
485
+ autoEscape
486
+ textToHighlight={nodeData.title}
487
+ />
488
+ ) :
489
+ (
490
+ treeNodeKeyToTitle && treeNodeKeyToTitle[nodeData.key] ?
491
+ treeNodeKeyToTitle[nodeData.key] :
492
+ nodeData.title
493
+ )
494
+ }
495
+ {
496
+ // 若当前节点满足收藏控件渲染条件
497
+ enableNodeFavorites && (isUndefined(nodeData.enableFavorites) || nodeData.enableFavorites) ?
498
+ <span style={{
499
+ paddingLeft: 2
500
+ }}
501
+ onClick={(e) => {
502
+ // 阻止事件向外传递
503
+ e.stopPropagation()
504
+ }}>
505
+ <Rate
506
+ count={1}
507
+ value={favoritedKeys.includes(nodeData.key) ? 1 : 0}
508
+ onChange={(e) => {
509
+ setProps({
510
+ favoritedKeys: (
511
+ favoritedKeys.includes(nodeData.key) ?
512
+ favoritedKeys.filter(key => key !== nodeData.key) :
513
+ [...favoritedKeys, nodeData.key]
514
+ )
515
+ })
516
+ }}
517
+ />
518
+ </span> :
519
+ null
520
+ }
521
+ {checkedKeys?.includes(nodeData.key) ? nodeCheckedSuffix : nodeUncheckedSuffix}
522
+ </span>
523
+ )
524
+ );
525
+ }}
526
+ showLeafIcon={false}
527
+ // 处理树可拖拽特性
528
+ draggable={
529
+ (draggable && treeDataMode !== 'flat') ?
530
+ {
531
+ icon: showDragIcon,
532
+ nodeDraggable: (node) => {
533
+ // 检查当前节点是否被禁用拖拽
534
+ if (dragDisabledKeys && dragDisabledKeys.includes(node.key)) {
535
+ return false;
536
+ }
537
+ return true;
538
+ }
539
+ } :
540
+ false
541
+ }
542
+ blockNode={draggable && treeDataMode !== 'flat'}
543
+ onDrop={draggable && treeDataMode !== 'flat' ? onDrop : undefined}
544
+ loadData={
545
+ enableAsyncLoad ?
546
+ (node) => {
547
+ // 更新最新的异步加载数据目标节点
548
+ setProps({
549
+ loadingNode: {
550
+ key: node.key,
551
+ title: node.title
552
+ }
553
+ })
554
+ return new Promise(
555
+ (resolve) => {
556
+ // 更新数据异步加载标识
557
+ dataLoading.current = true;
558
+ // 轮询检测是否加载完成
559
+ const timer = setInterval(
560
+ () => {
561
+ if (!dataLoading.current) {
562
+ clearInterval(timer);
563
+ resolve();
564
+ }
565
+ },
566
+ 200
567
+ );
568
+ }
569
+ )
570
+ } :
571
+ undefined
572
+ }
573
+ data-dash-is-loading={useLoading()}
574
+ {...config}
575
+ />
576
+ );
577
+ }
578
+
579
+ export default AntdTree;
580
+
581
+ AntdTree.defaultProps = defaultProps;
582
582
  AntdTree.propTypes = propTypes;