feffery_antd_components 0.1.16 → 0.2.0-rc1

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 (250) hide show
  1. package/DESCRIPTION +1 -1
  2. package/NAMESPACE +1 -0
  3. package/Project.toml +1 -1
  4. package/README-en_US.md +51 -0
  5. package/README.md +14 -5
  6. package/build/lib/feffery_antd_components/AntdAccordion.py +66 -0
  7. package/build/lib/feffery_antd_components/AntdAccordionItem.py +60 -0
  8. package/build/lib/feffery_antd_components/AntdAffix.py +58 -0
  9. package/build/lib/feffery_antd_components/AntdAlert.py +64 -0
  10. package/build/lib/feffery_antd_components/AntdAnchor.py +64 -0
  11. package/build/lib/feffery_antd_components/AntdAvatar.py +83 -0
  12. package/build/lib/feffery_antd_components/AntdBackTop.py +56 -0
  13. package/build/lib/feffery_antd_components/AntdBadge.py +74 -0
  14. package/build/lib/feffery_antd_components/AntdBreadcrumb.py +78 -0
  15. package/build/lib/feffery_antd_components/AntdButton.py +76 -0
  16. package/build/lib/feffery_antd_components/AntdCalendar.py +79 -0
  17. package/build/lib/feffery_antd_components/AntdCard.py +90 -0
  18. package/build/lib/feffery_antd_components/AntdCardGrid.py +56 -0
  19. package/build/lib/feffery_antd_components/AntdCarousel.py +60 -0
  20. package/build/lib/feffery_antd_components/AntdCascader.py +103 -0
  21. package/build/lib/feffery_antd_components/AntdCheckCard.py +64 -0
  22. package/build/lib/feffery_antd_components/AntdCheckCardGroup.py +64 -0
  23. package/build/lib/feffery_antd_components/AntdCheckbox.py +75 -0
  24. package/build/lib/feffery_antd_components/AntdCheckboxGroup.py +83 -0
  25. package/build/lib/feffery_antd_components/AntdCol.py +150 -0
  26. package/build/lib/feffery_antd_components/AntdCollapse.py +85 -0
  27. package/build/lib/feffery_antd_components/AntdComment.py +90 -0
  28. package/build/lib/feffery_antd_components/AntdContent.py +54 -0
  29. package/build/lib/feffery_antd_components/AntdCopyText.py +58 -0
  30. package/build/lib/feffery_antd_components/AntdCountdown.py +76 -0
  31. package/build/lib/feffery_antd_components/AntdCustomSkeleton.py +64 -0
  32. package/build/lib/feffery_antd_components/AntdDatePicker.py +107 -0
  33. package/build/lib/feffery_antd_components/AntdDateRangePicker.py +109 -0
  34. package/build/lib/feffery_antd_components/AntdDescriptionItem.py +62 -0
  35. package/build/lib/feffery_antd_components/AntdDescriptions.py +80 -0
  36. package/build/lib/feffery_antd_components/AntdDivider.py +66 -0
  37. package/build/lib/feffery_antd_components/AntdDraggerUpload.py +126 -0
  38. package/build/lib/feffery_antd_components/AntdDrawer.py +78 -0
  39. package/build/lib/feffery_antd_components/AntdDropdown.py +90 -0
  40. package/build/lib/feffery_antd_components/AntdEmpty.py +60 -0
  41. package/build/lib/feffery_antd_components/AntdFooter.py +54 -0
  42. package/build/lib/feffery_antd_components/AntdForm.py +76 -0
  43. package/build/lib/feffery_antd_components/AntdFormItem.py +88 -0
  44. package/build/lib/feffery_antd_components/AntdHeader.py +54 -0
  45. package/build/lib/feffery_antd_components/AntdIcon.py +56 -0
  46. package/build/lib/feffery_antd_components/AntdImage.py +66 -0
  47. package/build/lib/feffery_antd_components/AntdInput.py +121 -0
  48. package/build/lib/feffery_antd_components/AntdInputNumber.py +109 -0
  49. package/build/lib/feffery_antd_components/AntdLayout.py +54 -0
  50. package/build/lib/feffery_antd_components/AntdMentions.py +80 -0
  51. package/build/lib/feffery_antd_components/AntdMenu.py +85 -0
  52. package/build/lib/feffery_antd_components/AntdMessage.py +60 -0
  53. package/build/lib/feffery_antd_components/AntdModal.py +94 -0
  54. package/build/lib/feffery_antd_components/AntdNotification.py +64 -0
  55. package/build/lib/feffery_antd_components/AntdPageHeader.py +66 -0
  56. package/build/lib/feffery_antd_components/AntdPagination.py +99 -0
  57. package/build/lib/feffery_antd_components/AntdParagraph.py +74 -0
  58. package/build/lib/feffery_antd_components/AntdPasteImage.py +56 -0
  59. package/build/lib/feffery_antd_components/AntdPictureUpload.py +148 -0
  60. package/build/lib/feffery_antd_components/AntdPopconfirm.py +86 -0
  61. package/build/lib/feffery_antd_components/AntdPopover.py +78 -0
  62. package/build/lib/feffery_antd_components/AntdPopupCard.py +72 -0
  63. package/build/lib/feffery_antd_components/AntdProgress.py +92 -0
  64. package/{feffery_antd_components → build/lib/feffery_antd_components}/AntdRadio.py +0 -0
  65. package/build/lib/feffery_antd_components/AntdRadioGroup.py +93 -0
  66. package/build/lib/feffery_antd_components/AntdRate.py +64 -0
  67. package/build/lib/feffery_antd_components/AntdResult.py +58 -0
  68. package/build/lib/feffery_antd_components/AntdRibbon.py +58 -0
  69. package/build/lib/feffery_antd_components/AntdRow.py +76 -0
  70. package/build/lib/feffery_antd_components/AntdSegmented.py +91 -0
  71. package/build/lib/feffery_antd_components/AntdSegmentedColoring.py +86 -0
  72. package/build/lib/feffery_antd_components/AntdSelect.py +127 -0
  73. package/build/lib/feffery_antd_components/AntdSider.py +72 -0
  74. package/build/lib/feffery_antd_components/AntdSkeleton.py +90 -0
  75. package/build/lib/feffery_antd_components/AntdSkeletonAvatar.py +50 -0
  76. package/build/lib/feffery_antd_components/AntdSkeletonButton.py +52 -0
  77. package/build/lib/feffery_antd_components/AntdSkeletonImage.py +44 -0
  78. package/build/lib/feffery_antd_components/AntdSkeletonInput.py +48 -0
  79. package/build/lib/feffery_antd_components/AntdSlider.py +74 -0
  80. package/build/lib/feffery_antd_components/AntdSpace.py +64 -0
  81. package/build/lib/feffery_antd_components/AntdSpin.py +72 -0
  82. package/build/lib/feffery_antd_components/AntdStatistic.py +78 -0
  83. package/build/lib/feffery_antd_components/AntdSteps.py +76 -0
  84. package/build/lib/feffery_antd_components/AntdSwitch.py +81 -0
  85. package/build/lib/feffery_antd_components/AntdTabPane.py +68 -0
  86. package/build/lib/feffery_antd_components/AntdTable.py +361 -0
  87. package/build/lib/feffery_antd_components/AntdTabs.py +97 -0
  88. package/build/lib/feffery_antd_components/AntdTag.py +58 -0
  89. package/{feffery_antd_components → build/lib/feffery_antd_components}/AntdTestLink.py +0 -0
  90. package/build/lib/feffery_antd_components/AntdText.py +76 -0
  91. package/build/lib/feffery_antd_components/AntdTimePicker.py +99 -0
  92. package/build/lib/feffery_antd_components/AntdTimeRangePicker.py +99 -0
  93. package/build/lib/feffery_antd_components/AntdTimeline.py +72 -0
  94. package/build/lib/feffery_antd_components/AntdTitle.py +78 -0
  95. package/build/lib/feffery_antd_components/AntdTooltip.py +68 -0
  96. package/build/lib/feffery_antd_components/AntdTransfer.py +103 -0
  97. package/build/lib/feffery_antd_components/AntdTree.py +109 -0
  98. package/build/lib/feffery_antd_components/AntdTreeSelect.py +115 -0
  99. package/{feffery_antd_components → build/lib/feffery_antd_components}/AntdTypography.py +0 -0
  100. package/build/lib/feffery_antd_components/AntdUpload.py +124 -0
  101. package/build/lib/feffery_antd_components/AntdWatermark.py +68 -0
  102. package/{feffery_antd_components → build/lib/feffery_antd_components}/Link.py +0 -0
  103. package/build/lib/feffery_antd_components/__init__.py +53 -0
  104. package/build/lib/feffery_antd_components/_imports_.py +189 -0
  105. package/build/lib/feffery_antd_components/feffery_antd_components.min.js +1 -0
  106. package/build/lib/feffery_antd_components/metadata.json +19958 -0
  107. package/build/lib/feffery_antd_components/package-info.json +89 -0
  108. package/feffery_antd_components/AntdAlert.py +1 -1
  109. package/feffery_antd_components/AntdAnchor.py +1 -1
  110. package/feffery_antd_components/AntdAvatar.py +1 -1
  111. package/feffery_antd_components/AntdBackTop.py +1 -1
  112. package/feffery_antd_components/AntdButton.py +10 -6
  113. package/feffery_antd_components/AntdCarousel.py +1 -1
  114. package/feffery_antd_components/AntdCascader.py +9 -5
  115. package/feffery_antd_components/AntdCol.py +1 -1
  116. package/feffery_antd_components/AntdContent.py +1 -1
  117. package/feffery_antd_components/AntdCustomSkeleton.py +1 -1
  118. package/feffery_antd_components/AntdDraggerUpload.py +1 -1
  119. package/feffery_antd_components/AntdDrawer.py +1 -1
  120. package/feffery_antd_components/AntdFooter.py +1 -1
  121. package/feffery_antd_components/AntdHeader.py +1 -1
  122. package/feffery_antd_components/AntdIcon.py +8 -4
  123. package/feffery_antd_components/AntdImage.py +1 -1
  124. package/feffery_antd_components/AntdInput.py +16 -8
  125. package/feffery_antd_components/AntdInputNumber.py +11 -7
  126. package/feffery_antd_components/AntdLayout.py +1 -1
  127. package/feffery_antd_components/AntdModal.py +10 -4
  128. package/feffery_antd_components/AntdParagraph.py +1 -1
  129. package/feffery_antd_components/AntdPasteImage.py +1 -1
  130. package/feffery_antd_components/AntdPopupCard.py +72 -0
  131. package/feffery_antd_components/AntdRibbon.py +3 -3
  132. package/feffery_antd_components/AntdRow.py +1 -1
  133. package/feffery_antd_components/AntdSegmented.py +5 -3
  134. package/feffery_antd_components/AntdSegmentedColoring.py +7 -3
  135. package/feffery_antd_components/AntdSider.py +1 -1
  136. package/feffery_antd_components/AntdSkeleton.py +1 -1
  137. package/feffery_antd_components/AntdSpace.py +1 -1
  138. package/feffery_antd_components/AntdSpin.py +2 -2
  139. package/feffery_antd_components/AntdStatistic.py +1 -1
  140. package/feffery_antd_components/AntdTabPane.py +1 -1
  141. package/feffery_antd_components/AntdTable.py +55 -7
  142. package/feffery_antd_components/AntdTag.py +1 -1
  143. package/feffery_antd_components/AntdText.py +1 -1
  144. package/feffery_antd_components/AntdTitle.py +1 -1
  145. package/feffery_antd_components/AntdTree.py +6 -4
  146. package/feffery_antd_components/AntdTreeSelect.py +8 -6
  147. package/feffery_antd_components/_imports_.py +2 -0
  148. package/feffery_antd_components/feffery_antd_components.min.js +1 -1
  149. package/feffery_antd_components/metadata.json +1042 -93
  150. package/feffery_antd_components/package-info.json +6 -2
  151. package/git-operations.md +0 -1
  152. package/images//345/233/275/351/231/205/345/214/226/347/244/272/344/276/213.png +0 -0
  153. package/package.json +6 -2
  154. package/setup.py +0 -1
  155. package/src/FefferyAntdComponents.jl +4 -3
  156. package/src/jl/'feffery'_antdalert.jl +1 -1
  157. package/src/jl/'feffery'_antdanchor.jl +1 -1
  158. package/src/jl/'feffery'_antdavatar.jl +1 -1
  159. package/src/jl/'feffery'_antdbacktop.jl +1 -1
  160. package/src/jl/'feffery'_antdbutton.jl +4 -2
  161. package/src/jl/'feffery'_antdcarousel.jl +1 -1
  162. package/src/jl/'feffery'_antdcascader.jl +4 -2
  163. package/src/jl/'feffery'_antdcol.jl +1 -1
  164. package/src/jl/'feffery'_antdcontent.jl +1 -1
  165. package/src/jl/'feffery'_antdcustomskeleton.jl +1 -1
  166. package/src/jl/'feffery'_antddraggerupload.jl +1 -1
  167. package/src/jl/'feffery'_antddrawer.jl +1 -1
  168. package/src/jl/'feffery'_antdfooter.jl +1 -1
  169. package/src/jl/'feffery'_antdheader.jl +1 -1
  170. package/src/jl/'feffery'_antdicon.jl +4 -2
  171. package/src/jl/'feffery'_antdimage.jl +1 -1
  172. package/src/jl/'feffery'_antdinput.jl +8 -4
  173. package/src/jl/'feffery'_antdinputnumber.jl +5 -3
  174. package/src/jl/'feffery'_antdlayout.jl +1 -1
  175. package/src/jl/'feffery'_antdmodal.jl +5 -2
  176. package/src/jl/'feffery'_antdparagraph.jl +1 -1
  177. package/src/jl/'feffery'_antdpasteimage.jl +1 -1
  178. package/src/jl/'feffery'_antdpopupcard.jl +43 -0
  179. package/src/jl/'feffery'_antdribbon.jl +1 -1
  180. package/src/jl/'feffery'_antdrow.jl +1 -1
  181. package/src/jl/'feffery'_antdsegmented.jl +5 -4
  182. package/src/jl/'feffery'_antdsegmentedcoloring.jl +3 -1
  183. package/src/jl/'feffery'_antdsider.jl +1 -1
  184. package/src/jl/'feffery'_antdskeleton.jl +1 -1
  185. package/src/jl/'feffery'_antdspace.jl +1 -1
  186. package/src/jl/'feffery'_antdspin.jl +2 -2
  187. package/src/jl/'feffery'_antdstatistic.jl +1 -1
  188. package/src/jl/'feffery'_antdtable.jl +31 -4
  189. package/src/jl/'feffery'_antdtabpane.jl +1 -1
  190. package/src/jl/'feffery'_antdtag.jl +1 -1
  191. package/src/jl/'feffery'_antdtext.jl +1 -1
  192. package/src/jl/'feffery'_antdtitle.jl +1 -1
  193. package/src/jl/'feffery'_antdtree.jl +3 -2
  194. package/src/jl/'feffery'_antdtreeselect.jl +3 -2
  195. package/src/lib/components/AntdAlert.react.js +64 -50
  196. package/src/lib/components/AntdAnchor.react.js +79 -70
  197. package/src/lib/components/AntdAvatar.react.js +92 -76
  198. package/src/lib/components/AntdBackTop.react.js +37 -28
  199. package/src/lib/components/AntdButton.react.js +82 -54
  200. package/src/lib/components/AntdCarousel.react.js +43 -34
  201. package/src/lib/components/AntdCascader.react.js +128 -82
  202. package/src/lib/components/AntdCheckboxGroup.react.js +2 -0
  203. package/src/lib/components/AntdDrawer.react.js +68 -59
  204. package/src/lib/components/AntdIcon.react.js +70 -37
  205. package/src/lib/components/AntdImage.react.js +16 -3
  206. package/src/lib/components/AntdInput.react.js +212 -175
  207. package/src/lib/components/AntdInputNumber.react.js +12 -2
  208. package/src/lib/components/AntdModal.react.js +22 -1
  209. package/src/lib/components/AntdPasteImage.react.js +11 -2
  210. package/src/lib/components/AntdPopupCard.react.js +241 -0
  211. package/src/lib/components/AntdRibbon.react.js +1 -1
  212. package/src/lib/components/AntdSegmented.react.js +19 -4
  213. package/src/lib/components/AntdSegmentedColoring.react.js +107 -82
  214. package/src/lib/components/AntdSelect.react.js +5 -0
  215. package/src/lib/components/AntdSpace.react.js +63 -46
  216. package/src/lib/components/AntdSpin.react.js +21 -6
  217. package/src/lib/components/AntdStatistic.react.js +68 -59
  218. package/src/lib/components/AntdTable.react.js +252 -18
  219. package/src/lib/components/AntdTag.react.js +38 -28
  220. package/src/lib/components/AntdTree.react.js +182 -136
  221. package/src/lib/components/AntdTreeSelect.react.js +144 -101
  222. package/src/lib/components/grid/AntdCol.react.js +61 -52
  223. package/src/lib/components/grid/AntdRow.react.js +46 -37
  224. package/src/lib/components/layout/AntdContent.react.js +35 -26
  225. package/src/lib/components/layout/AntdFooter.react.js +36 -27
  226. package/src/lib/components/layout/AntdHeader.react.js +35 -26
  227. package/src/lib/components/layout/AntdLayout.react.js +35 -26
  228. package/src/lib/components/layout/AntdSider.react.js +61 -52
  229. package/src/lib/components/skeleton/AntdCustomSkeleton.react.js +11 -3
  230. package/src/lib/components/skeleton/AntdSkeleton.react.js +11 -2
  231. package/src/lib/components/styles.css +4 -0
  232. package/src/lib/components/tabs/AntdTabPane.react.js +46 -37
  233. package/src/lib/components/typography/AntdParagraph.react.js +59 -50
  234. package/src/lib/components/typography/AntdText.react.js +61 -52
  235. package/src/lib/components/typography/AntdTitle.react.js +63 -54
  236. package/src/lib/components/upload/AntdDraggerUpload.react.js +11 -2
  237. package/src/lib/components/utils.js +17 -2
  238. package/src/lib/index.js +24 -1
  239. package/tests/DebounceTest/app.py +89 -0
  240. package/tests/SegmentedColoringTest/app.py +106 -0
  241. package/tests/TableCellClickTest/app.py +67 -0
  242. package/tests/TableCellRowMergeTest/app.py +88 -0
  243. package/tests/TableEmptyContentTest/app.py +37 -0
  244. package/tests/TableMiniChartAdvanceTest/app.py +85 -0
  245. package/tests/TreeNodeStyleTest/app.py +73 -0
  246. package/tests/TreeTest/app.py +96 -0
  247. package/tests/VirtualClassNameTest/app.py +49 -0
  248. package/usage.py +11 -82
  249. package/webpack.config.js +45 -11
  250. package/tests/UploadTest/app.py +0 -70
@@ -1,165 +1,168 @@
1
- import React, { Component } from 'react';
1
+ import { useEffect, useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Tree } from 'antd';
4
4
  import AntdIcon from './AntdIcon.react';
5
5
  import { omitBy, isUndefined } from 'lodash';
6
+ import { flatToTree } from './utils';
6
7
  import 'antd/dist/antd.css';
7
8
  import './styles.css'
8
9
 
9
- // 定义树形控件AntdTree,api参数参考https://ant.design/components/tree-cn/
10
- export default class AntdTree extends Component {
11
-
12
- constructor(props) {
13
- super(props)
14
- // 初始化expandedKeys
15
- if (props.defaultExpandedKeys && !props.expandedKeys) {
16
- // 当defaultExpandedKeys不为空时,为expandedKeys初始化defaultExpandedKeys对应的expandedKeys值
17
- props.setProps({ expandedKeys: props.defaultExpandedKeys })
18
- }
19
-
20
- // 初始化selectedKeys
21
- if (props.defaultSelectedKeys && !props.selectedKeys) {
22
- // 当defaultSelectedKeys不为空时,为selectedKeys初始化defaultSelectedKeys对应的selectedKeys值
23
- props.setProps({ selectedKeys: props.defaultSelectedKeys })
24
- }
25
10
 
26
- // 初始化selectedKeys
27
- if (props.defaultCheckedKeys && !props.checkedKeys) {
28
- // 当defaultCheckedKeys不为空时,为checkedKeys初始化defaultCheckedKeys对应的checkedKeys值
29
- props.setProps({ checkedKeys: props.defaultCheckedKeys })
30
- }
11
+ // 定义树形控件AntdTree,api参数参考https://ant.design/components/tree-cn/
12
+ const AntdTree = (props) => {
13
+
14
+ // 取得必要属性或参数
15
+ let {
16
+ id,
17
+ className,
18
+ setProps,
19
+ style,
20
+ key,
21
+ checkable,
22
+ selectable,
23
+ selectedKeys,
24
+ expandedKeys,
25
+ checkedKeys,
26
+ defaultExpandAll,
27
+ defaultExpandedKeys,
28
+ defaultExpandParent,
29
+ checkStrictly,
30
+ defaultCheckedKeys,
31
+ defaultSelectedKeys,
32
+ multiple,
33
+ showLine,
34
+ showIcon,
35
+ height,
36
+ persistence,
37
+ persisted_props,
38
+ persistence_type,
39
+ loading_state
40
+ } = props;
41
+
42
+ if (showLine) {
43
+ showLine = { 'showLeafIcon': false }
31
44
  }
32
45
 
33
- render() {
34
- // 取得必要属性或参数
35
- let {
36
- id,
37
- className,
38
- setProps,
39
- style,
40
- key,
41
- checkable,
42
- selectable,
43
- selectedKeys,
44
- expandedKeys,
45
- checkedKeys,
46
- defaultExpandAll,
47
- defaultExpandedKeys,
48
- defaultExpandParent,
49
- checkStrictly,
50
- defaultCheckedKeys,
51
- defaultSelectedKeys,
52
- multiple,
53
- showLine,
54
- showIcon,
55
- height,
56
- persistence,
57
- persisted_props,
58
- persistence_type,
59
- loading_state
60
- } = this.props;
61
-
62
- if (showLine) {
63
- showLine = { 'showLeafIcon': false }
64
- }
46
+ let { treeData, treeDataMode } = props;
65
47
 
66
- let { treeData } = this.props;
48
+ useEffect(() => {
49
+ setProps({
50
+ expandedKeys: defaultExpandedKeys && !expandedKeys ? defaultExpandedKeys : expandedKeys,
51
+ selectedKeys: defaultSelectedKeys && !selectedKeys ? defaultSelectedKeys : selectedKeys,
52
+ checkedKeys: defaultCheckedKeys && !checkedKeys ? defaultCheckedKeys : checkedKeys
53
+ })
54
+ }, [])
67
55
 
68
- // 用于以递归的方式将节点icon属性替换成相应的icon对象
69
- const add_leaf_node_icon = (inputTreeData) => {
70
- if (typeof inputTreeData === typeof {}) {
56
+ const flatToTreeData = useMemo(() => {
57
+ return flatToTree(treeData);
58
+ }, [treeData])
71
59
 
72
- if (inputTreeData.hasOwnProperty('children')) {
73
- if (typeof inputTreeData.icon === typeof "") {
74
- inputTreeData.icon = <AntdIcon icon={inputTreeData.icon} />
75
- }
60
+ // 根据treeDataMode对treeData进行预处理
61
+ if (treeDataMode === 'flat') {
62
+ treeData = flatToTreeData
63
+ }
76
64
 
77
- for (var i = 0; i < inputTreeData.children.length; i++) {
78
- inputTreeData.children[i] = add_leaf_node_icon(inputTreeData.children[i])
79
- }
65
+ // 用于以递归的方式将节点icon属性替换成相应的icon对象
66
+ const add_leaf_node_icon = (inputTreeData) => {
67
+ if (typeof inputTreeData === typeof {}) {
80
68
 
81
- } else {
82
- if (typeof inputTreeData.icon === typeof "") {
83
- inputTreeData.icon = <AntdIcon icon={inputTreeData.icon} />
84
- }
69
+ if (inputTreeData.hasOwnProperty('children')) {
70
+ if (typeof inputTreeData.icon === typeof "") {
71
+ inputTreeData.icon = <AntdIcon icon={inputTreeData.icon} />
85
72
  }
86
- }
87
73
 
88
- if (typeof inputTreeData == typeof []) {
89
- for (var i = 0; i < inputTreeData.length; i++) {
90
- inputTreeData[i] = add_leaf_node_icon(inputTreeData[i])
74
+ for (var i = 0; i < inputTreeData.children.length; i++) {
75
+ inputTreeData.children[i] = add_leaf_node_icon(inputTreeData.children[i])
76
+ }
77
+
78
+ } else {
79
+ if (typeof inputTreeData.icon === typeof "") {
80
+ inputTreeData.icon = <AntdIcon icon={inputTreeData.icon} />
91
81
  }
92
82
  }
83
+ }
93
84
 
94
- return inputTreeData;
85
+ if (typeof inputTreeData == typeof []) {
86
+ for (var i = 0; i < inputTreeData.length; i++) {
87
+ inputTreeData[i] = add_leaf_node_icon(inputTreeData[i])
88
+ }
95
89
  }
96
90
 
97
- treeData = add_leaf_node_icon(treeData)
91
+ return inputTreeData;
92
+ }
98
93
 
99
- const listenSelect = (e) => {
100
- setProps({ selectedKeys: e })
101
- }
94
+ treeData = add_leaf_node_icon(treeData)
102
95
 
103
- const listenCheck = (checkedKeys, e) => {
104
- console.log({ checkedKeys, e })
105
- if (checkStrictly) {
106
- setProps({
107
- checkedKeys: checkedKeys.checked,
108
- halfCheckedKeys: checkedKeys.halfChecked
109
- })
110
- } else {
111
- setProps({
112
- checkedKeys: checkedKeys,
113
- halfCheckedKeys: e.halfCheckedKeys
114
- })
115
- }
116
- }
96
+ const listenSelect = (e) => {
97
+ setProps({ selectedKeys: e })
98
+ }
117
99
 
118
- const listenExpand = (e) => {
119
- setProps({ expandedKeys: e })
100
+ const listenCheck = (checkedKeys, e) => {
101
+ if (checkStrictly) {
102
+ setProps({
103
+ checkedKeys: checkedKeys.checked,
104
+ halfCheckedKeys: checkedKeys.halfChecked
105
+ })
106
+ } else {
107
+ setProps({
108
+ checkedKeys: checkedKeys,
109
+ halfCheckedKeys: e.halfCheckedKeys
110
+ })
120
111
  }
112
+ }
121
113
 
122
- let config = {
123
- expandedKeys
124
- }
114
+ const listenExpand = (e) => {
115
+ setProps({ expandedKeys: e })
116
+ }
125
117
 
126
- config = omitBy(config, isUndefined)
127
-
128
- return (
129
- <Tree
130
- id={id}
131
- className={className}
132
- style={style}
133
- key={key}
134
- treeData={add_leaf_node_icon(treeData)}
135
- selectedKeys={selectedKeys}
136
- checkedKeys={checkedKeys}
137
- selectable={selectable}
138
- checkable={checkable}
139
- defaultExpandAll={defaultExpandAll}
140
- defaultExpandedKeys={defaultExpandedKeys}
141
- defaultExpandParent={defaultExpandParent}
142
- defaultCheckedKeys={defaultCheckedKeys}
143
- defaultSelectedKeys={defaultSelectedKeys}
144
- checkStrictly={checkStrictly}
145
- multiple={multiple}
146
- showLine={showLine}
147
- onSelect={listenSelect}
148
- onCheck={listenCheck}
149
- onExpand={listenExpand}
150
- showIcon={showIcon}
151
- height={height}
152
- showLeafIcon={false}
153
- persistence={persistence}
154
- persisted_props={persisted_props}
155
- persistence_type={persistence_type}
156
- data-dash-is-loading={
157
- (loading_state && loading_state.is_loading) || undefined
158
- }
159
- {...config}
160
- />
161
- );
118
+ let config = {
119
+ expandedKeys
162
120
  }
121
+
122
+ config = omitBy(config, isUndefined)
123
+
124
+ return (
125
+ <Tree
126
+ id={id}
127
+ className={className}
128
+ style={style}
129
+ key={key}
130
+ treeData={add_leaf_node_icon(treeData)}
131
+ selectedKeys={selectedKeys}
132
+ checkedKeys={checkedKeys}
133
+ selectable={selectable}
134
+ checkable={checkable}
135
+ defaultExpandAll={defaultExpandAll}
136
+ defaultExpandedKeys={defaultExpandedKeys}
137
+ defaultExpandParent={defaultExpandParent}
138
+ defaultCheckedKeys={defaultCheckedKeys}
139
+ defaultSelectedKeys={defaultSelectedKeys}
140
+ checkStrictly={checkStrictly}
141
+ multiple={multiple}
142
+ showLine={showLine}
143
+ onSelect={listenSelect}
144
+ onCheck={listenCheck}
145
+ onExpand={listenExpand}
146
+ showIcon={showIcon}
147
+ height={height}
148
+ titleRender={(nodeData) => {
149
+ return (
150
+ <span className={"ant-tree-title"}
151
+ style={nodeData.style}>
152
+ {nodeData.title}
153
+ </span>
154
+ );
155
+ }}
156
+ showLeafIcon={false}
157
+ persistence={persistence}
158
+ persisted_props={persisted_props}
159
+ persistence_type={persistence_type}
160
+ data-dash-is-loading={
161
+ (loading_state && loading_state.is_loading) || undefined
162
+ }
163
+ {...config}
164
+ />
165
+ );
163
166
  }
164
167
 
165
168
  // 定义递归PropTypes
@@ -185,12 +188,44 @@ const PropTreeNodeShape = {
185
188
  // 可选,设置对应节点是否可选
186
189
  selectable: PropTypes.bool,
187
190
 
191
+ // 设置当前节点css样式
192
+ style: PropTypes.object
188
193
  };
189
194
 
190
195
  const PropTreeNode = PropTypes.shape(PropTreeNodeShape);
191
196
  PropTreeNodeShape.children = PropTypes.arrayOf(PropTreeNode);
192
197
  const treeDataPropTypes = PropTypes.arrayOf(PropTreeNode);
193
198
 
199
+ // 定义偏平结构节点类型
200
+ const PropFlatNodeShape = {
201
+ // 标题
202
+ title: PropTypes.string.isRequired,
203
+
204
+ // 唯一识别id
205
+ key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
206
+
207
+ // 可选,设置是否禁用
208
+ disabled: PropTypes.bool,
209
+
210
+ // 可选,设置节点对应icon
211
+ icon: PropTypes.node,
212
+
213
+ // 可选,当树为checkable时,设置对应节点是否展示checkbox
214
+ checkable: PropTypes.bool,
215
+
216
+ // 可选,设置是否禁用checkbox
217
+ disableCheckbox: PropTypes.bool,
218
+
219
+ // 可选,设置对应节点是否可选
220
+ selectable: PropTypes.bool,
221
+
222
+ // 可选,设置对应节点的父节点key值
223
+ parent: PropTypes.string,
224
+
225
+ // 设置当前节点css样式
226
+ style: PropTypes.object
227
+ };
228
+
194
229
  // 定义参数或属性
195
230
  AntdTree.propTypes = {
196
231
  // 组件id
@@ -206,7 +241,15 @@ AntdTree.propTypes = {
206
241
  key: PropTypes.string,
207
242
 
208
243
  // 组织树形结构的json结构数据
209
- treeData: treeDataPropTypes.isRequired,
244
+ treeData: PropTypes.oneOfType([
245
+ // 树结构
246
+ treeDataPropTypes,
247
+ // 偏平结构
248
+ PropTypes.arrayOf(PropFlatNodeShape)
249
+ ]),
250
+
251
+ // 设置treeData模式,可选的有'tree'、'flat',默认为'tree'
252
+ treeDataMode: PropTypes.oneOf(['tree', 'flat']),
210
253
 
211
254
  // 设置是否渲染icon,默认为true
212
255
  showIcon: PropTypes.bool,
@@ -312,5 +355,8 @@ AntdTree.defaultProps = {
312
355
  showLine: { 'showLeafIcon': false },
313
356
  showIcon: true,
314
357
  persisted_props: ['selectedKeys', 'checkedKeys', 'expandedKeys'],
315
- persistence_type: 'local'
316
- }
358
+ persistence_type: 'local',
359
+ treeDataMode: 'tree'
360
+ }
361
+
362
+ export default AntdTree;
@@ -1,126 +1,128 @@
1
- import React, { Component } from 'react';
1
+ import { useEffect, useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { TreeSelect, ConfigProvider } from 'antd';
4
4
  import { str2Locale } from './locales.react';
5
+ import { flatToTree } from './utils';
5
6
  import 'antd/dist/antd.css';
6
7
 
7
8
  const { SHOW_ALL } = TreeSelect;
8
9
 
9
10
  // 定义树选择组件AntdTreeSelect,api参数参考https://ant.design/components/tree-select-cn/
10
- export default class AntdTreeSelect extends Component {
11
-
12
- constructor(props) {
13
- super(props)
14
- if (!props.value) {
15
- props.setProps({ value: props.defaultValue })
11
+ const AntdTreeSelect = (props) => {
12
+ // 取得必要属性或参数
13
+ let {
14
+ id,
15
+ style,
16
+ className,
17
+ key,
18
+ locale,
19
+ treeData,
20
+ treeDataMode,
21
+ allowClear,
22
+ bordered,
23
+ treeLine,
24
+ listHeight,
25
+ placeholder,
26
+ value,
27
+ defaultValue,
28
+ maxTagCount,
29
+ multiple,
30
+ size,
31
+ treeCheckable,
32
+ treeCheckStrictly,
33
+ treeDefaultExpandAll,
34
+ treeDefaultExpandedKeys,
35
+ treeExpandedKeys,
36
+ virtual,
37
+ disabled,
38
+ placement,
39
+ status,
40
+ treeNodeFilterProp,
41
+ setProps,
42
+ persistence,
43
+ persisted_props,
44
+ persistence_type,
45
+ loading_state
46
+ } = props;
47
+
48
+ useEffect(() => {
49
+ if (!value && defaultValue) {
50
+ setProps({ value: defaultValue })
16
51
  }
17
- }
52
+ }, [])
18
53
 
19
- render() {
20
- // 取得必要属性或参数
21
- let {
22
- id,
23
- style,
24
- className,
25
- key,
26
- locale,
27
- treeData,
28
- allowClear,
29
- bordered,
30
- treeLine,
31
- listHeight,
32
- placeholder,
33
- value,
34
- defaultValue,
35
- maxTagCount,
36
- multiple,
37
- size,
38
- treeCheckable,
39
- treeCheckStrictly,
40
- treeDefaultExpandAll,
41
- treeDefaultExpandedKeys,
42
- treeExpandedKeys,
43
- virtual,
44
- disabled,
45
- placement,
46
- status,
47
- treeNodeFilterProp,
48
- setProps,
49
- persistence,
50
- persisted_props,
51
- persistence_type,
52
- loading_state
53
- } = this.props;
54
-
55
- // 用于获取用户已选择值的回调函数
56
- const updateSelectedValue = (value) => {
57
-
58
- if (treeCheckStrictly) {
59
- setProps({ value: value.map(item => item.value) })
60
- } else {
61
- setProps({ value: value })
62
- }
54
+ const flatToTreeData = useMemo(() => {
55
+ return flatToTree(treeData);
56
+ }, [treeData])
63
57
 
58
+ // 用于获取用户已选择值的回调函数
59
+ const updateSelectedValue = (value) => {
60
+
61
+ if (treeCheckStrictly) {
62
+ setProps({ value: value.map(item => item.value) })
63
+ } else {
64
+ setProps({ value: value })
64
65
  }
65
66
 
66
- // 返回定制化的前端组件
67
- return (
68
- <ConfigProvider locale={str2Locale.get(locale)}>
69
- <TreeSelect
70
- id={id}
71
- className={className}
72
- style={{ ...{ width: '100%' }, ...style }}
73
- key={key}
74
- treeData={treeData}
75
- allowClear={allowClear}
76
- bordered={bordered}
77
- treeLine={treeLine}
78
- listHeight={listHeight}
79
- placeholder={placeholder}
80
- value={value}
81
- defaultValue={defaultValue}
82
- maxTagCount={maxTagCount}
83
- multiple={multiple}
84
- size={size}
85
- treeCheckable={treeCheckable}
86
- showCheckedStrategy={SHOW_ALL}
87
- treeCheckStrictly={treeCheckStrictly}
88
- treeDefaultExpandAll={treeDefaultExpandAll}
89
- treeDefaultExpandedKeys={treeDefaultExpandedKeys}
90
- treeExpandedKeys={treeExpandedKeys}
91
- onChange={updateSelectedValue}
92
- showSearch={true}
93
- virtual={virtual}
94
- disabled={disabled}
95
- placement={placement}
96
- status={status}
97
- treeNodeFilterProp={treeNodeFilterProp}
98
- persistence={persistence}
99
- persisted_props={persisted_props}
100
- persistence_type={persistence_type}
101
- data-dash-is-loading={
102
- (loading_state && loading_state.is_loading) || undefined
103
- }
104
- getPopupContainer={(triggerNode) => triggerNode.parentNode}
105
- />
106
- </ConfigProvider>
107
- );
108
67
  }
68
+
69
+ // 返回定制化的前端组件
70
+ return (
71
+ <ConfigProvider locale={str2Locale.get(locale)}>
72
+ <TreeSelect
73
+ id={id}
74
+ className={className}
75
+ style={{ ...{ width: '100%' }, ...style }}
76
+ key={key}
77
+ treeData={treeDataMode === 'flat' ? flatToTreeData : treeData}
78
+ allowClear={allowClear}
79
+ bordered={bordered}
80
+ treeLine={treeLine}
81
+ listHeight={listHeight}
82
+ placeholder={placeholder}
83
+ value={value}
84
+ defaultValue={defaultValue}
85
+ maxTagCount={maxTagCount}
86
+ multiple={multiple}
87
+ size={size}
88
+ treeCheckable={treeCheckable}
89
+ showCheckedStrategy={SHOW_ALL}
90
+ treeCheckStrictly={treeCheckStrictly}
91
+ treeDefaultExpandAll={treeDefaultExpandAll}
92
+ treeDefaultExpandedKeys={treeDefaultExpandedKeys}
93
+ treeExpandedKeys={treeExpandedKeys}
94
+ onChange={updateSelectedValue}
95
+ showSearch={true}
96
+ virtual={virtual}
97
+ disabled={disabled}
98
+ placement={placement}
99
+ status={status}
100
+ treeNodeFilterProp={treeNodeFilterProp}
101
+ persistence={persistence}
102
+ persisted_props={persisted_props}
103
+ persistence_type={persistence_type}
104
+ data-dash-is-loading={
105
+ (loading_state && loading_state.is_loading) || undefined
106
+ }
107
+ getPopupContainer={(triggerNode) => triggerNode.parentNode}
108
+ />
109
+ </ConfigProvider>
110
+ );
109
111
  }
110
112
 
111
113
  // 定义递归PropTypes
112
114
  const PropTreeNodeShape = {
113
115
  // 标题
114
- title: PropTypes.string,
116
+ title: PropTypes.string.isRequired,
115
117
 
116
118
  // 唯一识别id
117
- key: PropTypes.string,
119
+ key: PropTypes.string.isRequired,
118
120
 
119
121
  // 节点对应的值,供搜索筛选时进行匹配使用(具有唯一性)
120
122
  value: PropTypes.oneOfType([
121
123
  PropTypes.string,
122
124
  PropTypes.number
123
- ]),
125
+ ]).isRequired,
124
126
 
125
127
  // 可选,设置是否禁用
126
128
  disabled: PropTypes.bool,
@@ -132,13 +134,43 @@ const PropTreeNodeShape = {
132
134
  disableCheckbox: PropTypes.bool,
133
135
 
134
136
  // 可选,设置对应节点是否可选
135
- selectable: PropTypes.bool,
137
+ selectable: PropTypes.bool
136
138
  };
137
139
 
138
140
  const PropTreeNode = PropTypes.shape(PropTreeNodeShape);
139
141
  PropTreeNodeShape.children = PropTypes.arrayOf(PropTreeNode);
140
142
  const treeDataPropTypes = PropTypes.arrayOf(PropTreeNode);
141
143
 
144
+ // 定义扁平结构节点类型
145
+ const PropFlatNodeShape = {
146
+ // 标题
147
+ title: PropTypes.string.isRequired,
148
+
149
+ // 唯一识别id
150
+ key: PropTypes.string.isRequired,
151
+
152
+ // 节点对应的值,供搜索筛选时进行匹配使用(具有唯一性)
153
+ value: PropTypes.oneOfType([
154
+ PropTypes.string,
155
+ PropTypes.number
156
+ ]).isRequired,
157
+
158
+ // 可选,设置是否禁用
159
+ disabled: PropTypes.bool,
160
+
161
+ // 可选,当树为treeCheckable时,设置对应节点是否展示checkbox
162
+ checkable: PropTypes.bool,
163
+
164
+ // 可选,设置是否禁用checkbox
165
+ disableCheckbox: PropTypes.bool,
166
+
167
+ // 可选,设置对应节点是否可选
168
+ selectable: PropTypes.bool,
169
+
170
+ // 可选,设置对应节点的父节点key值
171
+ parent: PropTypes.string
172
+ };
173
+
142
174
  // 定义参数或属性
143
175
  AntdTreeSelect.propTypes = {
144
176
  // 组件id
@@ -157,7 +189,15 @@ AntdTreeSelect.propTypes = {
157
189
  locale: PropTypes.oneOf(['zh-cn', 'en-us']),
158
190
 
159
191
  // 组织树形结构的json结构数据
160
- treeData: treeDataPropTypes,
192
+ treeData: PropTypes.oneOfType([
193
+ // 树形结构
194
+ treeDataPropTypes,
195
+ // 扁平结构
196
+ PropTypes.arrayOf(PropFlatNodeShape)
197
+ ]).isRequired,
198
+
199
+ // 设置treeData模式,可选的有'tree'、'flat',默认为'tree'
200
+ treeDataMode: PropTypes.oneOf(['tree', 'flat']),
161
201
 
162
202
  // 设置是否渲染内容清空按钮,默认为true
163
203
  allowClear: PropTypes.bool,
@@ -292,10 +332,13 @@ AntdTreeSelect.propTypes = {
292
332
  // 设置默认参数
293
333
  AntdTreeSelect.defaultProps = {
294
334
  listHeight: 256,
295
- virtual: false,
335
+ virtual: true,
296
336
  allowClear: true,
297
337
  persisted_props: ['value'],
298
338
  persistence_type: 'local',
299
339
  locale: 'zh-cn',
300
- treeNodeFilterProp: 'value'
340
+ treeNodeFilterProp: 'value',
341
+ treeDataMode: 'tree'
301
342
  }
343
+
344
+ export default AntdTreeSelect;