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,650 +1,574 @@
1
- // react核心
2
- import React, { Component, useEffect, useMemo } from 'react';
3
- import PropTypes from 'prop-types';
4
- // antd核心
5
- import { Menu, Button } from 'antd';
6
- import AntdIcon from "../general/AntdIcon.react";
7
- import {
8
- MenuUnfoldOutlined,
9
- MenuFoldOutlined,
10
- } from '@ant-design/icons';
11
- // 辅助库
12
- import { get, has, isArray, isUndefined, isNull, isString, cloneDeep } from 'lodash';
13
- import { pickBy } from 'ramda';
14
- import isAbsoluteUrl from 'is-absolute-url';
15
- import { useLoading } from '../utils';
16
- // 自定义hooks
17
- import useCss from '../../hooks/useCss';
18
-
19
- const { SubMenu, Item, ItemGroup, Divider } = Menu;
20
-
21
- // 自定义UtilsLink
22
- function CustomEvent(event, params) {
23
- params = params || {
24
- bubbles: false,
25
- cancelable: false,
26
- detail: undefined
27
- };
28
- const evt = document.createEvent('CustomEvent');
29
- evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
30
- return evt;
31
- }
32
- CustomEvent.prototype = window.Event.prototype;
33
-
34
- function isExternalLink(external_link, href) {
35
- if (isUndefined(external_link) || isNull(external_link)) {
36
- return isAbsoluteUrl(href);
37
- }
38
- return external_link;
39
- }
40
-
41
- function findByKey(array, key) {
42
- for (let item of array) {
43
- if (get(item, 'props.key') === key) {
44
- return item;
45
- }
46
- if (get(item, 'children') && isArray(get(item, 'children'))) {
47
- const result = findByKey(item.children, key);
48
- if (result) {
49
- return result;
50
- }
51
- }
52
- }
53
- return null;
54
- }
55
-
56
- function findKeyPath(array, key, path = []) {
57
- for (let item of array) {
58
- if (item?.props?.key) {
59
- let currentPath = [...path, item.props.key];
60
- if (get(item, 'props.key') === key) {
61
- return currentPath;
62
- }
63
- if (get(item, 'children') && isArray(get(item, 'children'))) {
64
- const result = findKeyPath(item.children, key, currentPath);
65
- if (result) {
66
- return result;
67
- }
68
- }
69
- }
70
- }
71
- return null;
72
- }
73
-
74
- const getLevelKeys = (items1) => {
75
- const key = {};
76
- const func = (items2, level = 1) => {
77
- items2.forEach((item) => {
78
- if (item?.props?.key) {
79
- key[item.props.key] = level;
80
- }
81
- if (item?.children) {
82
- func(item.children, level + 1);
83
- }
84
- });
85
- };
86
- func(items1);
87
- return key;
88
- };
89
-
90
- class UtilsLink extends Component {
91
-
92
- constructor(props) {
93
- super(props);
94
- this.updateLocation = this.updateLocation.bind(this);
95
- }
96
-
97
- updateLocation(e) {
98
- const hasModifiers = e.metaKey || e.shiftKey || e.altKey || e.ctrlKey;
99
- if (hasModifiers) {
100
- return;
101
- }
102
- if (this.props.disabled) {
103
- e.preventDefault();
104
- return;
105
- }
106
- if (this.props.preOnClick) {
107
- this.props.preOnClick();
108
- }
109
- const { external_link, href } = this.props;
110
- if (href && !isExternalLink(external_link, href)) {
111
- // prevent anchor from updating location
112
- e.preventDefault();
113
- const { href } = this.props;
114
- window.history.pushState({}, '', href);
115
- window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));
116
- // scroll back to top
117
- window.scrollTo(0, 0);
118
- }
119
- }
120
-
121
- render() {
122
- const {
123
- children,
124
- external_link,
125
- preOnClick,
126
- target,
127
- href,
128
- download,
129
- ...otherProps
130
- } = this.props;
131
- const linkIsExternal = href && isExternalLink(external_link, href);
132
-
133
- return (
134
- <a
135
- href={href}
136
- target={linkIsExternal ? target : null}
137
- download={download && linkIsExternal ? download : null}
138
- {...otherProps}
139
- onClick={e => this.updateLocation(e)}
140
- >
141
- {children}
142
- </a>
143
- );
144
- }
145
- }
146
-
147
- // 字符串 -> 组件
148
- const str2Jsx = new Map([
149
- ['SubMenu', SubMenu],
150
- ['Item', Item],
151
- ['ItemGroup', ItemGroup],
152
- ['Divider', Divider]
153
- ])
154
-
155
- // 递归推导多层菜单结构
156
- const raw2Jsx = (obj, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon) => {
157
- // 若obj为数组
158
- if (Array.isArray(obj)) {
159
- // 若obj为数组,则针对数组中每个对象向下递归
160
- obj = obj.map(obj_ => raw2Jsx(obj_, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon))
161
-
162
- } else if (obj.hasOwnProperty('component')) {
163
- // obj包含children属性,则向下递归处理
164
- if (obj.hasOwnProperty('children')) {
165
- Object.assign(obj, { children: obj.children.map(obj_ => raw2Jsx(obj_, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon)) })
166
- if (obj.component === 'SubMenu') {
167
- obj = <SubMenu
168
- key={obj.props.key}
169
- title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
170
- disabled={obj.props.disabled}
171
- icon={
172
- menuItemKeyToIcon[obj.props.key] ||
173
- (
174
- obj.props.iconRenderer === 'fontawesome' ?
175
- (
176
- React.createElement(
177
- 'i',
178
- {
179
- className: obj.props.icon
180
- }
181
- )
182
- ) :
183
- (
184
- <AntdIcon icon={obj.props.icon} />
185
- )
186
- )
187
- }>
188
- {obj.children}
189
- </SubMenu>
190
- } else {
191
- obj = <ItemGroup
192
- key={obj.props.key}
193
- title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
194
- disabled={obj.props.disabled}
195
- icon={
196
- menuItemKeyToIcon[obj.props.key] ||
197
- (
198
- obj.props.iconRenderer === 'fontawesome' ?
199
- (
200
- React.createElement(
201
- 'i',
202
- {
203
- className: obj.props.icon
204
- }
205
- )
206
- ) :
207
- (
208
- <AntdIcon icon={obj.props.icon} />
209
- )
210
- )
211
- }>
212
- {obj.children}
213
- </ItemGroup>
214
- }
215
- } else {
216
- // 检查obj.component是否为Divider
217
- if (obj.component === 'Divider') {
218
- obj = <Divider dashed={obj.props && obj.props.dashed} />
219
- } else if (obj.props.href) {
220
- // 生成Item对应的jsx
221
- obj = <Item
222
- key={obj.props.key}
223
- title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
224
- disabled={obj.props.disabled}
225
- danger={obj.props.danger}
226
- icon={
227
- menuItemKeyToIcon[obj.props.key] ||
228
- (
229
- obj.props.iconRenderer === 'fontawesome' ?
230
- (
231
- React.createElement(
232
- 'i',
233
- {
234
- className: obj.props.icon
235
- }
236
- )
237
- ) :
238
- (
239
- <AntdIcon icon={obj.props.icon} />
240
- )
241
- )
242
- }
243
- name={obj.props && obj.props.name}
244
- >
245
- <UtilsLink href={obj.props.href} target={obj.props.target}>{menuItemKeyToTitle[obj.props.key] || obj.props.title}</UtilsLink>
246
- </Item>
247
- } else {
248
- obj = <Item
249
- key={obj.props.key}
250
- title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
251
- disabled={obj.props.disabled}
252
- danger={obj.props.danger}
253
- icon={
254
- menuItemKeyToIcon[obj.props.key] ||
255
- (
256
- obj.props.iconRenderer === 'fontawesome' ?
257
- (
258
- React.createElement(
259
- 'i',
260
- {
261
- className: obj.props.icon
262
- }
263
- )
264
- ) :
265
- (
266
- <AntdIcon icon={obj.props.icon} />
267
- )
268
- )
269
- }
270
- name={obj.props && obj.props.name}
271
- >
272
- {menuItemKeyToTitle[obj.props.key] || obj.props.title}
273
- </Item>
274
- }
275
- }
276
- }
277
- return obj;
278
- }
279
-
280
- /**
281
- * 导航菜单组件AntdMenu
282
- */
283
- const AntdMenu = ({
284
- id,
285
- className,
286
- style,
287
- key,
288
- expandIcon,
289
- menuItems,
290
- menuItemKeyToTitle,
291
- menuItemKeyToIcon,
292
- mode = 'vertical',
293
- theme = 'light',
294
- defaultOpenKeys,
295
- currentKey,
296
- openKeys,
297
- onlyExpandCurrentSubMenu = false,
298
- defaultSelectedKey,
299
- renderCollapsedButton = false,
300
- popupContainer = 'body',
301
- inlineCollapsed,
302
- inlineIndent = 24,
303
- triggerSubMenuAction = 'hover',
304
- setProps,
305
- persistence,
306
- persisted_props,
307
- persistence_type,
308
- ...others
309
- }) => {
310
-
311
- const levelKeys = useMemo(() => {
312
- return getLevelKeys(menuItems);
313
- }, [menuItems]);
314
-
315
- const onOpenChange = (keys) => {
316
- if (onlyExpandCurrentSubMenu) {
317
- if (isUndefined(openKeys) || isNull(openKeys)) {
318
- openKeys = [];
319
- }
320
- const currentOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
321
- if (!isUndefined(currentOpenKey)) {
322
- const repeatIndex = keys
323
- .filter((key) => key !== currentOpenKey)
324
- .findIndex((key) => levelKeys[key] === levelKeys[currentOpenKey]);
325
- setProps({
326
- openKeys: keys
327
- .filter((_, index) => index !== repeatIndex)
328
- .filter((key) => levelKeys[key] <= levelKeys[currentOpenKey]),
329
- });
330
- } else {
331
- setProps({ openKeys: keys });
332
- }
333
- } else {
334
- setProps({ openKeys: keys });
335
- }
336
- };
337
-
338
- useEffect(() => {
339
- // 初始化currentKey
340
- if (defaultSelectedKey && !currentKey) {
341
- // 当defaultSelectedKey不为空且currentKey为空时
342
- // 为currentKey初始化defaultSelectedKey对应的key值
343
- setProps({ currentKey: defaultSelectedKey })
344
- }
345
-
346
- // 初始化openKeys
347
- if (defaultOpenKeys) {
348
- // 当defaultOpenKeys不为空且openKeys为空时
349
- // 为openKeys初始化defaultOpenKeys对应的key值
350
- setProps({ openKeys: defaultOpenKeys })
351
- }
352
- }, [])
353
-
354
- useEffect(() => {
355
- // 当currentKey发生变化时,自动查找currentKey对应的菜单信息
356
- let currentItem = findByKey(menuItems, currentKey)
357
- // 当currentKey发生变化时,自动查找currentKey对应的key路径信息和菜单路径信息
358
- let currentKeyPath = findKeyPath(menuItems, currentKey)
359
- let currentItemPath = currentKeyPath?.map(item => findByKey(menuItems, item))
360
- setProps({
361
- currentItem: currentItem,
362
- currentKeyPath: currentKeyPath,
363
- currentItemPath: currentItemPath
364
- })
365
- }, [currentKey])
366
-
367
- // 基于menuItems推导jsx数据结构
368
- let _menuItems = raw2Jsx(cloneDeep(menuItems), str2Jsx, menuItemKeyToTitle || {}, menuItemKeyToIcon || {});
369
-
370
- // 监听Item的点击事件
371
- const listenSelected = (item) => {
372
- // 将当前选中的key值赋给currentKey
373
- setProps({ currentKey: item.key })
374
- }
375
-
376
- if (renderCollapsedButton) {
377
- return (
378
- <div style={{ width: '100%' }}>
379
- <Button type="primary" onClick={() => setProps({ inlineCollapsed: !inlineCollapsed })}>
380
- {React.createElement(inlineCollapsed ? MenuUnfoldOutlined : MenuFoldOutlined)}
381
- </Button>
382
- <Menu
383
- // 提取具有data-*或aria-*通配格式的属性
384
- {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
385
- id={id}
386
- className={
387
- isString(className) ?
388
- className :
389
- (className ? useCss(className) : undefined)
390
- }
391
- style={style}
392
- key={key}
393
- expandIcon={
394
- has(expandIcon, 'collapse') && has(expandIcon, 'expand')
395
- ? (props) => props.isSubMenu
396
- ? (props.isOpen
397
- ? expandIcon.collapse
398
- : expandIcon.expand)
399
- : undefined
400
- : expandIcon
401
- }
402
- mode={mode}
403
- theme={theme}
404
- selectedKeys={[currentKey]}
405
- openKeys={openKeys}
406
- defaultOpenKeys={defaultOpenKeys}
407
- defaultSelectedKeys={defaultSelectedKey ? [defaultSelectedKey] : defaultSelectedKey}
408
- onSelect={listenSelected}
409
- onOpenChange={onOpenChange}
410
- getPopupContainer={
411
- popupContainer === 'parent' ?
412
- (triggerNode) => triggerNode.parentNode :
413
- undefined
414
- }
415
- inlineCollapsed={inlineCollapsed}
416
- inlineIndent={inlineIndent}
417
- triggerSubMenuAction={triggerSubMenuAction}
418
- data-dash-is-loading={useLoading()}
419
- >
420
- {_menuItems}
421
- </Menu>
422
- </div>
423
- );
424
- } else {
425
- return (
426
- <Menu
427
- // 提取具有data-*或aria-*通配格式的属性
428
- {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
429
- id={id}
430
- className={
431
- isString(className) ?
432
- className :
433
- (className ? useCss(className) : undefined)
434
- }
435
- style={style}
436
- key={key}
437
- expandIcon={
438
- has(expandIcon, 'collapse') && has(expandIcon, 'expand')
439
- ? (props) => props.isSubMenu
440
- ? (props.isOpen
441
- ? expandIcon.collapse
442
- : expandIcon.expand)
443
- : undefined
444
- : expandIcon
445
- }
446
- mode={mode}
447
- theme={theme}
448
- selectedKeys={[currentKey]}
449
- openKeys={openKeys}
450
- defaultOpenKeys={defaultOpenKeys}
451
- defaultSelectedKeys={defaultSelectedKey ? [defaultSelectedKey] : defaultSelectedKey}
452
- onSelect={listenSelected}
453
- onOpenChange={onOpenChange}
454
- getPopupContainer={
455
- popupContainer === 'parent' ?
456
- (triggerNode) => triggerNode.parentNode :
457
- undefined
458
- }
459
- inlineCollapsed={inlineCollapsed}
460
- inlineIndent={inlineIndent}
461
- triggerSubMenuAction={triggerSubMenuAction}
462
- data-dash-is-loading={useLoading()}
463
- >
464
- {_menuItems}
465
- </Menu>
466
- );
467
- }
468
- }
469
-
470
- AntdMenu.propTypes = {
471
- /**
472
- * 组件唯一id
473
- */
474
- id: PropTypes.string,
475
-
476
- /**
477
- * 对当前组件的`key`值进行更新,可实现强制重绘当前组件的效果
478
- */
479
- key: PropTypes.string,
480
-
481
- /**
482
- * 当前组件css样式
483
- */
484
- style: PropTypes.object,
485
-
486
- /**
487
- * 当前组件css类名,支持[动态css](/advanced-classname)
488
- */
489
- className: PropTypes.oneOfType([
490
- PropTypes.string,
491
- PropTypes.object
492
- ]),
493
-
494
- /**
495
- * 自定义展开图标,建议仅在`mode='inline'`时使用字典类型
496
- */
497
- expandIcon: PropTypes.oneOfType([
498
- PropTypes.node,
499
- PropTypes.exact({
500
- /**
501
- * 展开图标
502
- */
503
- expand: PropTypes.node,
504
- /**
505
- * 收起图标
506
- */
507
- collapse: PropTypes.node
508
- })
509
- ]),
510
-
511
- /**
512
- * 导航菜单数据结构
513
- */
514
- menuItems: PropTypes.array,
515
-
516
- /**
517
- * 为指定节点定义组件型菜单项标题,优先级高于menuItems中对应节点的title属性
518
- */
519
- menuItemKeyToTitle: PropTypes.objectOf(PropTypes.node),
520
-
521
- /**
522
- * 为指定节点定义组件型菜单项图标元素,优先级高于menuItems中对应节点的icon属性
523
- */
524
- menuItemKeyToIcon: PropTypes.objectOf(PropTypes.node),
525
-
526
- /**
527
- * 显示模式,可选项有`'vertical'`、`'horizontal'`、`'inline'`
528
- * 默认值:`'vertical'`
529
- */
530
- mode: PropTypes.oneOf(['vertical', 'horizontal', 'inline']),
531
-
532
- /**
533
- * 主题,可选项有`'light'`、`'dark'`
534
- * 默认值:`'light'`
535
- */
536
- theme: PropTypes.oneOf(['light', 'dark']),
537
-
538
- /**
539
- * 监听或设置当前已选中菜单项key值
540
- */
541
- currentKey: PropTypes.string,
542
-
543
- /**
544
- * 监听当前已选中菜单项信息
545
- */
546
- currentItem: PropTypes.object,
547
-
548
- /**
549
- * 监听当前已选中菜单项key值路径信息
550
- */
551
- currentKeyPath: PropTypes.array,
552
-
553
- /**
554
- * 监听当前已选中菜单项路径信息
555
- */
556
- currentItemPath: PropTypes.array,
557
-
558
- /**
559
- * 监听或设置当前已展开子菜单项key值
560
- */
561
- openKeys: PropTypes.arrayOf(PropTypes.string),
562
-
563
- /**
564
- * 是否只展开当前选中项的父级菜单
565
- * 默认值:`false`
566
- */
567
- onlyExpandCurrentSubMenu: PropTypes.bool,
568
-
569
- /**
570
- * 默认展开的菜单项key值
571
- */
572
- defaultOpenKeys: PropTypes.arrayOf(PropTypes.string),
573
-
574
- // 默认选中的菜单项对应key
575
- defaultSelectedKey: PropTypes.string,
576
-
577
- /**
578
- * 是否渲染菜单折叠状态控制按钮
579
- * 默认值:`false`
580
- */
581
- renderCollapsedButton: PropTypes.bool,
582
-
583
- /**
584
- * 菜单展开层锚定策略,可选项有`'parent'`、`'body'`
585
- * 默认值:`'body'`
586
- */
587
- popupContainer: PropTypes.oneOf(['parent', 'body']),
588
-
589
- /**
590
- * 当前菜单是否折叠,仅inline模式下有效
591
- * 默认值:`false`
592
- */
593
- inlineCollapsed: PropTypes.bool,
594
-
595
- /**
596
- * inline模式下,子菜单相对上一级的像素缩进宽度
597
- * 默认值:`24`
598
- */
599
- inlineIndent: PropTypes.number,
600
-
601
- /**
602
- * `SubMenu`展开/关闭的触发行为,可选项有`'hover'`、`'click'`,`mode='inline'`下无效
603
- * 默认值:`'hover'`
604
- */
605
- triggerSubMenuAction: PropTypes.oneOf(['hover', 'click']),
606
-
607
- /**
608
- * `data-*`格式属性通配
609
- */
610
- 'data-*': PropTypes.string,
611
-
612
- /**
613
- * `aria-*`格式属性通配
614
- */
615
- 'aria-*': PropTypes.string,
616
-
617
- /**
618
- * Dash-assigned callback that should be called to report property changes
619
- * to Dash, to make them available for callbacks.
620
- */
621
- setProps: PropTypes.func,
622
-
623
- /**
624
- * 是否为当前组件开启持久化功能
625
- */
626
- persistence: PropTypes.oneOfType([
627
- PropTypes.bool,
628
- PropTypes.string,
629
- PropTypes.number
630
- ]),
631
-
632
- /**
633
- * 当前组件启用持久化的属性值数组,可选项有`'currentKey'`、`'openKeys'`
634
- * 默认值:`['currentKey', 'openKeys']`
635
- */
636
- persisted_props: PropTypes.arrayOf(PropTypes.oneOf(['currentKey', 'openKeys'])),
637
-
638
- /**
639
- * 当前组件的属性持久化存储类型
640
- * 默认值:`'local'`
641
- */
642
- persistence_type: PropTypes.oneOf(['local', 'session', 'memory'])
643
- };
644
-
645
- AntdMenu.dashPersistence = {
646
- persisted_props: ['currentKey', 'openKeys'],
647
- persistence_type: 'local'
648
- }
649
-
1
+ // react核心
2
+ import React, { useEffect, useMemo } from 'react';
3
+ import PropTypes from 'prop-types';
4
+ // antd核心
5
+ import { Menu, Button } from 'antd';
6
+ import AntdIcon from "../general/AntdIcon.react";
7
+ import {
8
+ MenuUnfoldOutlined,
9
+ MenuFoldOutlined,
10
+ } from '@ant-design/icons';
11
+ // 辅助库
12
+ import { get, has, isArray, isUndefined, isNull, isString, cloneDeep } from 'lodash';
13
+ import { pickBy } from 'ramda';
14
+ import { useLoading } from '../utils';
15
+ // 自定义hooks
16
+ import useCss from '../../hooks/useCss';
17
+ // 内部组件
18
+ import { UtilsLink } from '../../internal_components/UtilsLink.react';
19
+
20
+ const { SubMenu, Item, ItemGroup, Divider } = Menu;
21
+
22
+ function findByKey(array, key) {
23
+ for (let item of array) {
24
+ if (get(item, 'props.key') === key) {
25
+ return item;
26
+ }
27
+ if (get(item, 'children') && isArray(get(item, 'children'))) {
28
+ const result = findByKey(item.children, key);
29
+ if (result) {
30
+ return result;
31
+ }
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+
37
+ function findKeyPath(array, key, path = []) {
38
+ for (let item of array) {
39
+ if (item?.props?.key) {
40
+ let currentPath = [...path, item.props.key];
41
+ if (get(item, 'props.key') === key) {
42
+ return currentPath;
43
+ }
44
+ if (get(item, 'children') && isArray(get(item, 'children'))) {
45
+ const result = findKeyPath(item.children, key, currentPath);
46
+ if (result) {
47
+ return result;
48
+ }
49
+ }
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+
55
+ const getLevelKeys = (items1) => {
56
+ const key = {};
57
+ const func = (items2, level = 1) => {
58
+ items2.forEach((item) => {
59
+ if (item?.props?.key) {
60
+ key[item.props.key] = level;
61
+ }
62
+ if (item?.children) {
63
+ func(item.children, level + 1);
64
+ }
65
+ });
66
+ };
67
+ func(items1);
68
+ return key;
69
+ };
70
+
71
+ // 字符串 -> 组件
72
+ const str2Jsx = new Map([
73
+ ['SubMenu', SubMenu],
74
+ ['Item', Item],
75
+ ['ItemGroup', ItemGroup],
76
+ ['Divider', Divider]
77
+ ])
78
+
79
+ // 递归推导多层菜单结构
80
+ const raw2Jsx = (obj, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon) => {
81
+ // 若obj为数组
82
+ if (Array.isArray(obj)) {
83
+ // 若obj为数组,则针对数组中每个对象向下递归
84
+ obj = obj.map(obj_ => raw2Jsx(obj_, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon))
85
+
86
+ } else if (obj.hasOwnProperty('component')) {
87
+ // 若obj包含children属性,则向下递归处理
88
+ if (obj.hasOwnProperty('children')) {
89
+ Object.assign(obj, { children: obj.children.map(obj_ => raw2Jsx(obj_, str2Jsx, menuItemKeyToTitle, menuItemKeyToIcon)) })
90
+ if (obj.component === 'SubMenu') {
91
+ obj = <SubMenu
92
+ key={obj.props.key}
93
+ title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
94
+ disabled={obj.props.disabled}
95
+ icon={
96
+ menuItemKeyToIcon[obj.props.key] ||
97
+ (
98
+ obj.props.iconRenderer === 'fontawesome' ?
99
+ (
100
+ React.createElement(
101
+ 'i',
102
+ {
103
+ className: obj.props.icon
104
+ }
105
+ )
106
+ ) :
107
+ (
108
+ <AntdIcon icon={obj.props.icon} />
109
+ )
110
+ )
111
+ }>
112
+ {obj.children}
113
+ </SubMenu>
114
+ } else {
115
+ obj = <ItemGroup
116
+ key={obj.props.key}
117
+ title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
118
+ disabled={obj.props.disabled}
119
+ icon={
120
+ menuItemKeyToIcon[obj.props.key] ||
121
+ (
122
+ obj.props.iconRenderer === 'fontawesome' ?
123
+ (
124
+ React.createElement(
125
+ 'i',
126
+ {
127
+ className: obj.props.icon
128
+ }
129
+ )
130
+ ) :
131
+ (
132
+ <AntdIcon icon={obj.props.icon} />
133
+ )
134
+ )
135
+ }>
136
+ {obj.children}
137
+ </ItemGroup>
138
+ }
139
+ } else {
140
+ // 检查obj.component是否为Divider
141
+ if (obj.component === 'Divider') {
142
+ obj = <Divider dashed={obj.props && obj.props.dashed} />
143
+ } else if (obj.props.href) {
144
+ // 生成Item对应的jsx
145
+ obj = <Item
146
+ key={obj.props.key}
147
+ title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
148
+ disabled={obj.props.disabled}
149
+ danger={obj.props.danger}
150
+ icon={
151
+ menuItemKeyToIcon[obj.props.key] ||
152
+ (
153
+ obj.props.iconRenderer === 'fontawesome' ?
154
+ (
155
+ React.createElement(
156
+ 'i',
157
+ {
158
+ className: obj.props.icon
159
+ }
160
+ )
161
+ ) :
162
+ (
163
+ <AntdIcon icon={obj.props.icon} />
164
+ )
165
+ )
166
+ }
167
+ name={obj.props && obj.props.name}
168
+ >
169
+ <UtilsLink href={obj.props.href} target={obj.props.target}>{menuItemKeyToTitle[obj.props.key] || obj.props.title}</UtilsLink>
170
+ </Item>
171
+ } else {
172
+ obj = <Item
173
+ key={obj.props.key}
174
+ title={menuItemKeyToTitle[obj.props.key] || obj.props.title}
175
+ disabled={obj.props.disabled}
176
+ danger={obj.props.danger}
177
+ icon={
178
+ menuItemKeyToIcon[obj.props.key] ||
179
+ (
180
+ obj.props.iconRenderer === 'fontawesome' ?
181
+ (
182
+ React.createElement(
183
+ 'i',
184
+ {
185
+ className: obj.props.icon
186
+ }
187
+ )
188
+ ) :
189
+ (
190
+ <AntdIcon icon={obj.props.icon} />
191
+ )
192
+ )
193
+ }
194
+ name={obj.props && obj.props.name}
195
+ >
196
+ {menuItemKeyToTitle[obj.props.key] || obj.props.title}
197
+ </Item>
198
+ }
199
+ }
200
+ }
201
+ return obj;
202
+ }
203
+
204
+ /**
205
+ * 导航菜单组件AntdMenu
206
+ */
207
+ const AntdMenu = ({
208
+ id,
209
+ className,
210
+ style,
211
+ key,
212
+ expandIcon,
213
+ menuItems,
214
+ menuItemKeyToTitle,
215
+ menuItemKeyToIcon,
216
+ mode = 'vertical',
217
+ theme = 'light',
218
+ defaultOpenKeys,
219
+ currentKey,
220
+ openKeys,
221
+ onlyExpandCurrentSubMenu = false,
222
+ defaultSelectedKey,
223
+ renderCollapsedButton = false,
224
+ popupContainer = 'body',
225
+ inlineCollapsed,
226
+ inlineIndent = 24,
227
+ triggerSubMenuAction = 'hover',
228
+ setProps,
229
+ persistence,
230
+ persisted_props,
231
+ persistence_type,
232
+ ...others
233
+ }) => {
234
+
235
+ const levelKeys = useMemo(() => {
236
+ return getLevelKeys(menuItems);
237
+ }, [menuItems]);
238
+
239
+ const onOpenChange = (keys) => {
240
+ if (onlyExpandCurrentSubMenu) {
241
+ if (isUndefined(openKeys) || isNull(openKeys)) {
242
+ openKeys = [];
243
+ }
244
+ const currentOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
245
+ if (!isUndefined(currentOpenKey)) {
246
+ const repeatIndex = keys
247
+ .filter((key) => key !== currentOpenKey)
248
+ .findIndex((key) => levelKeys[key] === levelKeys[currentOpenKey]);
249
+ setProps({
250
+ openKeys: keys
251
+ .filter((_, index) => index !== repeatIndex)
252
+ .filter((key) => levelKeys[key] <= levelKeys[currentOpenKey]),
253
+ });
254
+ } else {
255
+ setProps({ openKeys: keys });
256
+ }
257
+ } else {
258
+ setProps({ openKeys: keys });
259
+ }
260
+ };
261
+
262
+ useEffect(() => {
263
+ // 初始化currentKey
264
+ if (defaultSelectedKey && !currentKey) {
265
+ // 当defaultSelectedKey不为空且currentKey为空时
266
+ // 为currentKey初始化defaultSelectedKey对应的key值
267
+ setProps({ currentKey: defaultSelectedKey })
268
+ }
269
+
270
+ // 初始化openKeys
271
+ if (defaultOpenKeys) {
272
+ // 当defaultOpenKeys不为空且openKeys为空时
273
+ // 为openKeys初始化defaultOpenKeys对应的key值
274
+ setProps({ openKeys: defaultOpenKeys })
275
+ }
276
+ }, [])
277
+
278
+ useEffect(() => {
279
+ // 当currentKey发生变化时,自动查找currentKey对应的菜单信息
280
+ let currentItem = findByKey(menuItems, currentKey)
281
+ // 当currentKey发生变化时,自动查找currentKey对应的key路径信息和菜单路径信息
282
+ let currentKeyPath = findKeyPath(menuItems, currentKey)
283
+ let currentItemPath = currentKeyPath?.map(item => findByKey(menuItems, item))
284
+ setProps({
285
+ currentItem: currentItem,
286
+ currentKeyPath: currentKeyPath,
287
+ currentItemPath: currentItemPath
288
+ })
289
+ }, [currentKey])
290
+
291
+ // 基于menuItems推导jsx数据结构
292
+ let _menuItems = raw2Jsx(cloneDeep(menuItems), str2Jsx, menuItemKeyToTitle || {}, menuItemKeyToIcon || {});
293
+
294
+ // 监听Item的点击事件
295
+ const listenSelected = (item) => {
296
+ // 将当前选中的key值赋给currentKey
297
+ setProps({ currentKey: item.key })
298
+ }
299
+
300
+ if (renderCollapsedButton) {
301
+ return (
302
+ <div style={{ width: '100%' }}>
303
+ <Button type="primary" onClick={() => setProps({ inlineCollapsed: !inlineCollapsed })}>
304
+ {React.createElement(inlineCollapsed ? MenuUnfoldOutlined : MenuFoldOutlined)}
305
+ </Button>
306
+ <Menu
307
+ // 提取具有data-*或aria-*通配格式的属性
308
+ {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
309
+ id={id}
310
+ className={
311
+ isString(className) ?
312
+ className :
313
+ (className ? useCss(className) : undefined)
314
+ }
315
+ style={style}
316
+ key={key}
317
+ expandIcon={
318
+ has(expandIcon, 'collapse') && has(expandIcon, 'expand')
319
+ ? (props) => props.isSubMenu
320
+ ? (props.isOpen
321
+ ? expandIcon.collapse
322
+ : expandIcon.expand)
323
+ : undefined
324
+ : expandIcon
325
+ }
326
+ mode={mode}
327
+ theme={theme}
328
+ selectedKeys={[currentKey]}
329
+ openKeys={openKeys}
330
+ defaultOpenKeys={defaultOpenKeys}
331
+ defaultSelectedKeys={defaultSelectedKey ? [defaultSelectedKey] : defaultSelectedKey}
332
+ onSelect={listenSelected}
333
+ onOpenChange={onOpenChange}
334
+ getPopupContainer={
335
+ popupContainer === 'parent' ?
336
+ (triggerNode) => triggerNode.parentNode :
337
+ undefined
338
+ }
339
+ inlineCollapsed={inlineCollapsed}
340
+ inlineIndent={inlineIndent}
341
+ triggerSubMenuAction={triggerSubMenuAction}
342
+ data-dash-is-loading={useLoading()}
343
+ >
344
+ {_menuItems}
345
+ </Menu>
346
+ </div>
347
+ );
348
+ } else {
349
+ return (
350
+ <Menu
351
+ // 提取具有data-*或aria-*通配格式的属性
352
+ {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
353
+ id={id}
354
+ className={
355
+ isString(className) ?
356
+ className :
357
+ (className ? useCss(className) : undefined)
358
+ }
359
+ style={style}
360
+ key={key}
361
+ expandIcon={
362
+ has(expandIcon, 'collapse') && has(expandIcon, 'expand')
363
+ ? (props) => props.isSubMenu
364
+ ? (props.isOpen
365
+ ? expandIcon.collapse
366
+ : expandIcon.expand)
367
+ : undefined
368
+ : expandIcon
369
+ }
370
+ mode={mode}
371
+ theme={theme}
372
+ selectedKeys={[currentKey]}
373
+ openKeys={openKeys}
374
+ defaultOpenKeys={defaultOpenKeys}
375
+ defaultSelectedKeys={defaultSelectedKey ? [defaultSelectedKey] : defaultSelectedKey}
376
+ onSelect={listenSelected}
377
+ onOpenChange={onOpenChange}
378
+ getPopupContainer={
379
+ popupContainer === 'parent' ?
380
+ (triggerNode) => triggerNode.parentNode :
381
+ undefined
382
+ }
383
+ inlineCollapsed={inlineCollapsed}
384
+ inlineIndent={inlineIndent}
385
+ triggerSubMenuAction={triggerSubMenuAction}
386
+ data-dash-is-loading={useLoading()}
387
+ >
388
+ {_menuItems}
389
+ </Menu>
390
+ );
391
+ }
392
+ }
393
+
394
+ AntdMenu.propTypes = {
395
+ /**
396
+ * 组件唯一id
397
+ */
398
+ id: PropTypes.string,
399
+
400
+ /**
401
+ * 对当前组件的`key`值进行更新,可实现强制重绘当前组件的效果
402
+ */
403
+ key: PropTypes.string,
404
+
405
+ /**
406
+ * 当前组件css样式
407
+ */
408
+ style: PropTypes.object,
409
+
410
+ /**
411
+ * 当前组件css类名,支持[动态css](/advanced-classname)
412
+ */
413
+ className: PropTypes.oneOfType([
414
+ PropTypes.string,
415
+ PropTypes.object
416
+ ]),
417
+
418
+ /**
419
+ * 自定义展开图标,建议仅在`mode='inline'`时使用字典类型
420
+ */
421
+ expandIcon: PropTypes.oneOfType([
422
+ PropTypes.node,
423
+ PropTypes.exact({
424
+ /**
425
+ * 展开图标
426
+ */
427
+ expand: PropTypes.node,
428
+ /**
429
+ * 收起图标
430
+ */
431
+ collapse: PropTypes.node
432
+ })
433
+ ]),
434
+
435
+ /**
436
+ * 导航菜单数据结构
437
+ */
438
+ menuItems: PropTypes.array,
439
+
440
+ /**
441
+ * 为指定节点定义组件型菜单项标题,优先级高于menuItems中对应节点的title属性
442
+ */
443
+ menuItemKeyToTitle: PropTypes.objectOf(PropTypes.node),
444
+
445
+ /**
446
+ * 为指定节点定义组件型菜单项图标元素,优先级高于menuItems中对应节点的icon属性
447
+ */
448
+ menuItemKeyToIcon: PropTypes.objectOf(PropTypes.node),
449
+
450
+ /**
451
+ * 显示模式,可选项有`'vertical'`、`'horizontal'`、`'inline'`
452
+ * 默认值:`'vertical'`
453
+ */
454
+ mode: PropTypes.oneOf(['vertical', 'horizontal', 'inline']),
455
+
456
+ /**
457
+ * 主题,可选项有`'light'`、`'dark'`
458
+ * 默认值:`'light'`
459
+ */
460
+ theme: PropTypes.oneOf(['light', 'dark']),
461
+
462
+ /**
463
+ * 监听或设置当前已选中菜单项key值
464
+ */
465
+ currentKey: PropTypes.string,
466
+
467
+ /**
468
+ * 监听当前已选中菜单项信息
469
+ */
470
+ currentItem: PropTypes.object,
471
+
472
+ /**
473
+ * 监听当前已选中菜单项key值路径信息
474
+ */
475
+ currentKeyPath: PropTypes.array,
476
+
477
+ /**
478
+ * 监听当前已选中菜单项路径信息
479
+ */
480
+ currentItemPath: PropTypes.array,
481
+
482
+ /**
483
+ * 监听或设置当前已展开子菜单项key值
484
+ */
485
+ openKeys: PropTypes.arrayOf(PropTypes.string),
486
+
487
+ /**
488
+ * 是否只展开当前选中项的父级菜单
489
+ * 默认值:`false`
490
+ */
491
+ onlyExpandCurrentSubMenu: PropTypes.bool,
492
+
493
+ /**
494
+ * 默认展开的菜单项key值
495
+ */
496
+ defaultOpenKeys: PropTypes.arrayOf(PropTypes.string),
497
+
498
+ // 默认选中的菜单项对应key
499
+ defaultSelectedKey: PropTypes.string,
500
+
501
+ /**
502
+ * 是否渲染菜单折叠状态控制按钮
503
+ * 默认值:`false`
504
+ */
505
+ renderCollapsedButton: PropTypes.bool,
506
+
507
+ /**
508
+ * 菜单展开层锚定策略,可选项有`'parent'`、`'body'`
509
+ * 默认值:`'body'`
510
+ */
511
+ popupContainer: PropTypes.oneOf(['parent', 'body']),
512
+
513
+ /**
514
+ * 当前菜单是否折叠,仅inline模式下有效
515
+ * 默认值:`false`
516
+ */
517
+ inlineCollapsed: PropTypes.bool,
518
+
519
+ /**
520
+ * inline模式下,子菜单相对上一级的像素缩进宽度
521
+ * 默认值:`24`
522
+ */
523
+ inlineIndent: PropTypes.number,
524
+
525
+ /**
526
+ * `SubMenu`展开/关闭的触发行为,可选项有`'hover'`、`'click'`,`mode='inline'`下无效
527
+ * 默认值:`'hover'`
528
+ */
529
+ triggerSubMenuAction: PropTypes.oneOf(['hover', 'click']),
530
+
531
+ /**
532
+ * `data-*`格式属性通配
533
+ */
534
+ 'data-*': PropTypes.string,
535
+
536
+ /**
537
+ * `aria-*`格式属性通配
538
+ */
539
+ 'aria-*': PropTypes.string,
540
+
541
+ /**
542
+ * Dash-assigned callback that should be called to report property changes
543
+ * to Dash, to make them available for callbacks.
544
+ */
545
+ setProps: PropTypes.func,
546
+
547
+ /**
548
+ * 是否为当前组件开启持久化功能
549
+ */
550
+ persistence: PropTypes.oneOfType([
551
+ PropTypes.bool,
552
+ PropTypes.string,
553
+ PropTypes.number
554
+ ]),
555
+
556
+ /**
557
+ * 当前组件启用持久化的属性值数组,可选项有`'currentKey'`、`'openKeys'`
558
+ * 默认值:`['currentKey', 'openKeys']`
559
+ */
560
+ persisted_props: PropTypes.arrayOf(PropTypes.oneOf(['currentKey', 'openKeys'])),
561
+
562
+ /**
563
+ * 当前组件的属性持久化存储类型
564
+ * 默认值:`'local'`
565
+ */
566
+ persistence_type: PropTypes.oneOf(['local', 'session', 'memory'])
567
+ };
568
+
569
+ AntdMenu.dashPersistence = {
570
+ persisted_props: ['currentKey', 'openKeys'],
571
+ persistence_type: 'local'
572
+ }
573
+
650
574
  export default AntdMenu;