cloud-b2b 1.1.58 → 1.1.59

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 (308) hide show
  1. package/package.json +44 -22
  2. package/src/Area/Area.js +94 -0
  3. package/src/Card/Card.js +16 -0
  4. package/src/CodeInput/CodeInput.js +76 -0
  5. package/src/Control/Control.js +338 -0
  6. package/src/Control/event.js +45 -0
  7. package/src/Enhance/Dialogs.js +24 -0
  8. package/src/Enhance/Loading.js +83 -0
  9. package/{es → src}/Enhance/index.js +8 -6
  10. package/src/Header/Header.js +149 -0
  11. package/src/Header/Vertical.js +74 -0
  12. package/src/ImageView/ImageView.js +62 -0
  13. package/src/Indent/Indent.js +12 -0
  14. package/src/InpurCascader/InputCascader.js +83 -0
  15. package/src/InputEditor/InputEditor.js +93 -0
  16. package/src/InputSearch/InputSearch.js +186 -0
  17. package/src/InputSelect/InputSelect.js +103 -0
  18. package/src/InputTreeSelect/InputTreeSelect.js +87 -0
  19. package/src/InputWriting/InputWriting.js +65 -0
  20. package/src/Layout/Layout.js +121 -0
  21. package/src/LayoutLink/LayoutLink.js +59 -0
  22. package/src/Link/Link.js +57 -0
  23. package/src/Loading/Loading.js +15 -0
  24. package/src/Loading2/Loading2.js +15 -0
  25. package/src/ModalWithDrag/ModalWithDrag.js +17 -0
  26. package/{es → src}/ModalWithDrag/drag.js +128 -116
  27. package/src/NumberInput/NumberInput.js +137 -0
  28. package/src/Search/Search.js +368 -0
  29. package/src/Search2/Search.js +436 -0
  30. package/{lib/Search → src/Search2}/Search.less +65 -63
  31. package/{lib/Search → src/Search2}/package.json +6 -6
  32. package/src/Sidebar/Sidebar.js +111 -0
  33. package/src/Sidebar2/Sidebar.js +143 -0
  34. package/src/SuperForm/SuperForm.js +519 -0
  35. package/src/SuperForm2/SuperForm.js +588 -0
  36. package/src/SuperIcon/SuperIcon.js +14 -0
  37. package/src/SuperPagination/SuperPagination.js +65 -0
  38. package/src/SuperTab/SuperTab.js +84 -0
  39. package/src/SuperTab2/SuperTab2.js +94 -0
  40. package/src/SuperTable/DragSortRow.js +62 -0
  41. package/src/SuperTable/FilterDropDown.js +111 -0
  42. package/src/SuperTable/SuperTable.js +590 -0
  43. package/src/SuperTable/fixed.js +34 -0
  44. package/src/SuperTable2/SuperTable2.js +624 -0
  45. package/src/SuperTable2/SuperTableCell.js +175 -0
  46. package/src/SuperTable3/FilterDropDown.js +111 -0
  47. package/src/SuperTable3/SuperTable.js +498 -0
  48. package/src/SuperTable3/fixed.js +34 -0
  49. package/src/SuperToolbar/SuperToolbar.js +128 -0
  50. package/src/SuperUpload/SuperUpload.js +137 -0
  51. package/src/Title/Title.js +18 -0
  52. package/src/Viewer/ImageViews.js +220 -0
  53. package/src/Viewer/Viewer.js +97 -0
  54. package/src/WingBlank/WingBlank.js +14 -0
  55. package/src/helper.js +185 -0
  56. package/{es → src}/history.js +6 -6
  57. package/src/index.js +39 -0
  58. package/src/variables.js +5 -0
  59. package/test/index.html +10 -0
  60. package/test/test.js +16 -0
  61. package/test/test.less +12 -0
  62. package/test/webpack.config.js +71 -0
  63. package/tools/babel.config.js +14 -0
  64. package/tools/build.js +70 -0
  65. package/tools/publish.js +9 -0
  66. package/tools/util.js +53 -0
  67. package/es/Area/Area.js +0 -141
  68. package/es/Card/Card.js +0 -19
  69. package/es/CodeInput/CodeInput.js +0 -123
  70. package/es/Control/Control.js +0 -444
  71. package/es/Control/event.js +0 -43
  72. package/es/Enhance/Dialogs.js +0 -52
  73. package/es/Enhance/Loading.js +0 -131
  74. package/es/Header/Header.js +0 -162
  75. package/es/Header/Vertical.js +0 -106
  76. package/es/ImageView/ImageView.js +0 -100
  77. package/es/Indent/Indent.js +0 -19
  78. package/es/InpurCascader/InputCascader.js +0 -117
  79. package/es/InputEditor/InputEditor.js +0 -173
  80. package/es/InputSearch/InputSearch.js +0 -266
  81. package/es/InputSelect/InputSelect.js +0 -160
  82. package/es/InputTreeSelect/InputTreeSelect.js +0 -121
  83. package/es/InputWriting/InputWriting.js +0 -85
  84. package/es/Layout/Layout.js +0 -201
  85. package/es/LayoutLink/LayoutLink.js +0 -73
  86. package/es/Link/Link.js +0 -85
  87. package/es/Loading/Loading.js +0 -13
  88. package/es/Loading2/Loading2.js +0 -9
  89. package/es/ModalWithDrag/ModalWithDrag.js +0 -29
  90. package/es/NumberInput/NumberInput.js +0 -200
  91. package/es/Search/Search.js +0 -497
  92. package/es/Sidebar/Sidebar.js +0 -144
  93. package/es/Sidebar2/Sidebar.js +0 -165
  94. package/es/SuperForm/SuperForm.js +0 -598
  95. package/es/SuperForm2/SuperForm.js +0 -687
  96. package/es/SuperIcon/SuperIcon.js +0 -27
  97. package/es/SuperPagination/SuperPagination.js +0 -109
  98. package/es/SuperTab/SuperTab.js +0 -107
  99. package/es/SuperTab2/SuperTab2.js +0 -145
  100. package/es/SuperTable/DragSortRow.js +0 -97
  101. package/es/SuperTable/FilterDropDown.js +0 -164
  102. package/es/SuperTable/SuperTable.js +0 -808
  103. package/es/SuperTable/fixed.js +0 -34
  104. package/es/SuperTable2/SuperTable2.js +0 -926
  105. package/es/SuperTable2/SuperTableCell.js +0 -225
  106. package/es/SuperTable3/FilterDropDown.js +0 -164
  107. package/es/SuperTable3/SuperTable.js +0 -665
  108. package/es/SuperTable3/fixed.js +0 -34
  109. package/es/SuperToolbar/SuperToolbar.js +0 -195
  110. package/es/SuperUpload/SuperUpload.js +0 -356
  111. package/es/Title/Title.js +0 -33
  112. package/es/Viewer/ImageViews.js +0 -258
  113. package/es/Viewer/Viewer.js +0 -122
  114. package/es/WingBlank/WingBlank.js +0 -16
  115. package/es/helper.js +0 -240
  116. package/es/index.js +0 -37
  117. package/es/variables.js +0 -6
  118. package/lib/Area/Area.js +0 -149
  119. package/lib/Area/package.json +0 -6
  120. package/lib/Card/Card.js +0 -27
  121. package/lib/Card/package.json +0 -6
  122. package/lib/CodeInput/CodeInput.js +0 -131
  123. package/lib/CodeInput/package.json +0 -6
  124. package/lib/Control/Control.js +0 -450
  125. package/lib/Control/event.js +0 -51
  126. package/lib/Control/package.json +0 -6
  127. package/lib/Enhance/Dialogs.js +0 -60
  128. package/lib/Enhance/Loading.js +0 -138
  129. package/lib/Enhance/index.js +0 -25
  130. package/lib/Enhance/package.json +0 -6
  131. package/lib/Header/Header.js +0 -169
  132. package/lib/Header/Header.less +0 -95
  133. package/lib/Header/Vertical.js +0 -114
  134. package/lib/Header/Vertical.less +0 -60
  135. package/lib/Header/package.json +0 -6
  136. package/lib/ImageView/ImageView.js +0 -108
  137. package/lib/ImageView/ImageView.less +0 -14
  138. package/lib/ImageView/package.json +0 -6
  139. package/lib/Indent/Indent.js +0 -27
  140. package/lib/Indent/package.json +0 -6
  141. package/lib/InpurCascader/InputCascader.js +0 -124
  142. package/lib/InpurCascader/package.json +0 -6
  143. package/lib/InputEditor/InputEditor.js +0 -181
  144. package/lib/InputEditor/inputEditor.less +0 -8
  145. package/lib/InputEditor/package.json +0 -6
  146. package/lib/InputSearch/InputSearch.js +0 -274
  147. package/lib/InputSearch/package.json +0 -6
  148. package/lib/InputSelect/InputSelect.js +0 -168
  149. package/lib/InputSelect/package.json +0 -6
  150. package/lib/InputTreeSelect/InputTreeSelect.js +0 -128
  151. package/lib/InputTreeSelect/package.json +0 -6
  152. package/lib/InputWriting/InputWriting.js +0 -93
  153. package/lib/InputWriting/package.json +0 -6
  154. package/lib/Layout/Layout.js +0 -209
  155. package/lib/Layout/Layout.less +0 -28
  156. package/lib/Layout/package.json +0 -6
  157. package/lib/LayoutLink/LayoutLink.js +0 -86
  158. package/lib/LayoutLink/LayoutLink.less +0 -53
  159. package/lib/LayoutLink/package.json +0 -6
  160. package/lib/Link/Link.js +0 -93
  161. package/lib/Link/package.json +0 -6
  162. package/lib/Loading/Loading.js +0 -21
  163. package/lib/Loading/Loading.less +0 -13
  164. package/lib/Loading/package.json +0 -6
  165. package/lib/Loading2/Loading2.js +0 -17
  166. package/lib/Loading2/Loading2.less +0 -19
  167. package/lib/Loading2/package.json +0 -6
  168. package/lib/ModalWithDrag/ModalWithDrag.js +0 -37
  169. package/lib/ModalWithDrag/ModalWithDrag.less +0 -6
  170. package/lib/ModalWithDrag/drag.js +0 -124
  171. package/lib/ModalWithDrag/package.json +0 -6
  172. package/lib/NumberInput/NumberInput.js +0 -208
  173. package/lib/NumberInput/package.json +0 -6
  174. package/lib/Search/Search.js +0 -510
  175. package/lib/Sidebar/Sidebar.js +0 -152
  176. package/lib/Sidebar/Sidebar.less +0 -78
  177. package/lib/Sidebar/package.json +0 -6
  178. package/lib/Sidebar2/Sidebar.js +0 -173
  179. package/lib/Sidebar2/Sidebar.less +0 -153
  180. package/lib/Sidebar2/package.json +0 -6
  181. package/lib/SuperForm/SuperForm.js +0 -610
  182. package/lib/SuperForm/SuperForm.less +0 -52
  183. package/lib/SuperForm/package.json +0 -6
  184. package/lib/SuperForm2/SuperForm.js +0 -699
  185. package/lib/SuperForm2/SuperForm.less +0 -52
  186. package/lib/SuperForm2/package.json +0 -6
  187. package/lib/SuperIcon/SuperIcon.js +0 -35
  188. package/lib/SuperIcon/package.json +0 -6
  189. package/lib/SuperPagination/SuperPagination.js +0 -117
  190. package/lib/SuperPagination/package.json +0 -6
  191. package/lib/SuperTab/SuperTab.js +0 -115
  192. package/lib/SuperTab/SuperTab.less +0 -43
  193. package/lib/SuperTab/package.json +0 -6
  194. package/lib/SuperTab2/SuperTab2.js +0 -153
  195. package/lib/SuperTab2/SuperTab2.less +0 -18
  196. package/lib/SuperTab2/package.json +0 -6
  197. package/lib/SuperTable/DragSortRow.js +0 -105
  198. package/lib/SuperTable/DragSortRow.less +0 -17
  199. package/lib/SuperTable/FilterDropDown.js +0 -172
  200. package/lib/SuperTable/FilterDropDown.less +0 -30
  201. package/lib/SuperTable/SuperTable.js +0 -816
  202. package/lib/SuperTable/SuperTable.less +0 -132
  203. package/lib/SuperTable/fixed.js +0 -42
  204. package/lib/SuperTable/package.json +0 -6
  205. package/lib/SuperTable2/SuperTable2.js +0 -939
  206. package/lib/SuperTable2/SuperTable2.less +0 -118
  207. package/lib/SuperTable2/SuperTableCell.js +0 -230
  208. package/lib/SuperTable2/package.json +0 -6
  209. package/lib/SuperTable3/FilterDropDown.js +0 -172
  210. package/lib/SuperTable3/FilterDropDown.less +0 -29
  211. package/lib/SuperTable3/SuperTable.js +0 -673
  212. package/lib/SuperTable3/SuperTable.less +0 -99
  213. package/lib/SuperTable3/fixed.js +0 -42
  214. package/lib/SuperTable3/package.json +0 -6
  215. package/lib/SuperToolbar/SuperToolbar.js +0 -203
  216. package/lib/SuperToolbar/SuperToolbar.less +0 -17
  217. package/lib/SuperToolbar/package.json +0 -6
  218. package/lib/SuperUpload/SuperUpload.js +0 -368
  219. package/lib/SuperUpload/SuperUpload.less +0 -28
  220. package/lib/SuperUpload/package.json +0 -6
  221. package/lib/Title/Title.js +0 -41
  222. package/lib/Title/Title.less +0 -35
  223. package/lib/Title/package.json +0 -6
  224. package/lib/Viewer/ImageViews.js +0 -266
  225. package/lib/Viewer/Viewer.js +0 -130
  226. package/lib/Viewer/Viewer.less +0 -67
  227. package/lib/Viewer/imgView.less +0 -59
  228. package/lib/Viewer/package.json +0 -7
  229. package/lib/WingBlank/WingBlank.js +0 -24
  230. package/lib/WingBlank/WingBlank.less +0 -12
  231. package/lib/WingBlank/package.json +0 -6
  232. package/lib/adjust.less +0 -89
  233. package/lib/helper.js +0 -246
  234. package/lib/history.js +0 -12
  235. package/lib/index.js +0 -271
  236. package/lib/index.less +0 -31
  237. package/lib/style.less +0 -30
  238. package/lib/variables.js +0 -14
  239. package/lib/variables.less +0 -73
  240. /package/{es → src}/Area/package.json +0 -0
  241. /package/{es → src}/Card/package.json +0 -0
  242. /package/{es → src}/CodeInput/package.json +0 -0
  243. /package/{es → src}/Control/package.json +0 -0
  244. /package/{es → src}/Enhance/package.json +0 -0
  245. /package/{es → src}/Header/Header.less +0 -0
  246. /package/{es → src}/Header/Vertical.less +0 -0
  247. /package/{es → src}/Header/package.json +0 -0
  248. /package/{es → src}/ImageView/ImageView.less +0 -0
  249. /package/{es → src}/ImageView/package.json +0 -0
  250. /package/{es → src}/Indent/package.json +0 -0
  251. /package/{es → src}/InpurCascader/package.json +0 -0
  252. /package/{es → src}/InputEditor/inputEditor.less +0 -0
  253. /package/{es → src}/InputEditor/package.json +0 -0
  254. /package/{es → src}/InputSearch/package.json +0 -0
  255. /package/{es → src}/InputSelect/package.json +0 -0
  256. /package/{es → src}/InputTreeSelect/package.json +0 -0
  257. /package/{es → src}/InputWriting/package.json +0 -0
  258. /package/{es → src}/Layout/Layout.less +0 -0
  259. /package/{es → src}/Layout/package.json +0 -0
  260. /package/{es → src}/LayoutLink/LayoutLink.less +0 -0
  261. /package/{es → src}/LayoutLink/package.json +0 -0
  262. /package/{es → src}/Link/package.json +0 -0
  263. /package/{es → src}/Loading/Loading.less +0 -0
  264. /package/{es → src}/Loading/package.json +0 -0
  265. /package/{es → src}/Loading2/Loading2.less +0 -0
  266. /package/{es → src}/Loading2/package.json +0 -0
  267. /package/{es → src}/ModalWithDrag/ModalWithDrag.less +0 -0
  268. /package/{es → src}/ModalWithDrag/package.json +0 -0
  269. /package/{es → src}/NumberInput/package.json +0 -0
  270. /package/{es → src}/Search/Search.less +0 -0
  271. /package/{es → src}/Search/package.json +0 -0
  272. /package/{es → src}/Sidebar/Sidebar.less +0 -0
  273. /package/{es → src}/Sidebar/package.json +0 -0
  274. /package/{es → src}/Sidebar2/Sidebar.less +0 -0
  275. /package/{es → src}/Sidebar2/package.json +0 -0
  276. /package/{es → src}/SuperForm/SuperForm.less +0 -0
  277. /package/{es → src}/SuperForm/package.json +0 -0
  278. /package/{es → src}/SuperForm2/SuperForm.less +0 -0
  279. /package/{es → src}/SuperForm2/package.json +0 -0
  280. /package/{es → src}/SuperIcon/package.json +0 -0
  281. /package/{es → src}/SuperPagination/package.json +0 -0
  282. /package/{es → src}/SuperTab/SuperTab.less +0 -0
  283. /package/{es → src}/SuperTab/package.json +0 -0
  284. /package/{es → src}/SuperTab2/SuperTab2.less +0 -0
  285. /package/{es → src}/SuperTab2/package.json +0 -0
  286. /package/{es → src}/SuperTable/DragSortRow.less +0 -0
  287. /package/{es → src}/SuperTable/FilterDropDown.less +0 -0
  288. /package/{es → src}/SuperTable/SuperTable.less +0 -0
  289. /package/{es → src}/SuperTable/package.json +0 -0
  290. /package/{es → src}/SuperTable2/SuperTable2.less +0 -0
  291. /package/{es → src}/SuperTable2/package.json +0 -0
  292. /package/{es → src}/SuperTable3/FilterDropDown.less +0 -0
  293. /package/{es → src}/SuperTable3/SuperTable.less +0 -0
  294. /package/{es → src}/SuperTable3/package.json +0 -0
  295. /package/{es → src}/SuperToolbar/SuperToolbar.less +0 -0
  296. /package/{es → src}/SuperToolbar/package.json +0 -0
  297. /package/{es → src}/SuperUpload/SuperUpload.less +0 -0
  298. /package/{es → src}/SuperUpload/package.json +0 -0
  299. /package/{es → src}/Title/Title.less +0 -0
  300. /package/{es → src}/Title/package.json +0 -0
  301. /package/{es → src}/Viewer/Viewer.less +0 -0
  302. /package/{es → src}/Viewer/imgView.less +0 -0
  303. /package/{es → src}/Viewer/package.json +0 -0
  304. /package/{es → src}/WingBlank/WingBlank.less +0 -0
  305. /package/{es → src}/WingBlank/package.json +0 -0
  306. /package/{es → src}/adjust.less +0 -0
  307. /package/{es → src}/style.less +0 -0
  308. /package/{es → src}/variables.less +0 -0
@@ -0,0 +1,498 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import ReactDOM from 'react-dom';
4
+ import {getTitle} from '../Control';
5
+ import {Table, Tooltip} from 'antd';
6
+ import FilterDropDown from './FilterDropDown';
7
+ import fixed from './fixed';
8
+ import variables from '../variables';
9
+
10
+ /**
11
+ * sorter: [可选],不传表示该列不支持排序;为string表示按字符串排序;为number表示按数字大小排序
12
+ * filter: [可选],是否支持过滤,默认为false
13
+ * link: [可选],为true表示超链接,内容来至items;为字符串表示超链接,内容就是该字符串;为字符串‘list’表示超链接数组,内容就是该items对应key对象数组的linkTitleKey属性拼接
14
+ * linkTitleKey: [可选],当link为'list'表示超链接组时,该值表示要拼接展示的属性key值
15
+ * isDateFilterByStartAndEnd: [可选],为true时做过滤操作会显示时间段搜索,默认为false
16
+ *
17
+ */
18
+ const ColType = {
19
+ key: PropTypes.string.isRequired,
20
+ title: PropTypes.string,
21
+ align: PropTypes.oneOf(['left', 'center', 'right']),
22
+ sorter: PropTypes.oneOf(['string', 'number']),
23
+ filter: PropTypes.bool,
24
+ hide: PropTypes.bool,
25
+ options: PropTypes.array,
26
+ link: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
27
+ linkTitleKey: PropTypes.string,
28
+ noWrap: PropTypes.bool,
29
+ isDateFilterByStartAndEnd: PropTypes.bool,
30
+ };
31
+
32
+ const ItemType = {
33
+ checked: PropTypes.bool
34
+ };
35
+
36
+ /**
37
+ * onCheck:点击复选框时触发, 原型为onCheck(checkedRows)
38
+ * onRadio: 点击单选按钮时触发,原型为func(checkedRows)
39
+ * onDoubleClick: 行双击时触发,原型func(rowIndex)
40
+ * onLink: 点击超链接时触发,原型为func(key, rowIndex, item)
41
+ * onTableChange: 排序信息改变时触发,原型为func(sortInfo, filterInfo)
42
+ */
43
+ const CallbackType = {
44
+ onCheck: PropTypes.func,
45
+ onRadio: PropTypes.func,
46
+ onDoubleClick: PropTypes.func,
47
+ onLink: PropTypes.func,
48
+ onTableChange: PropTypes.func,
49
+ };
50
+
51
+ /**
52
+ * checkbox: [可选],是否有复选框,默认为true
53
+ * isPaging: [可选],是否分页,默认为false
54
+ * radio: [可选],是否为单选按钮,当checkbox为true时生效,默认值为false
55
+ * checkedRows: [可选],选中的行数,radio为true时生效
56
+ * index: [可选],是否有序号,默认值为true
57
+ * indexTitle:[可选],序号标题,默认为'序号'
58
+ * sortInfo: [可选],排序信息,默认为null
59
+ * filterInfo: [可选],过滤信息,默认为null
60
+ * maxHeight: [可选],设置表格的最大高度
61
+ * childrenKey: [可选],设置子列表数据的key,默认children
62
+ */
63
+ class SuperTable extends React.Component {
64
+ static propTypes = {
65
+ cols: PropTypes.arrayOf(PropTypes.shape(ColType)).isRequired,
66
+ items: PropTypes.arrayOf(PropTypes.shape(ItemType)).isRequired,
67
+ isPaging:PropTypes.bool,
68
+ checkbox: PropTypes.bool,
69
+ radio: PropTypes.bool,
70
+ checkedRows: PropTypes.array,
71
+ index: PropTypes.bool,
72
+ indexTitle: PropTypes.string,
73
+ sortInfo: PropTypes.object,
74
+ filterInfo: PropTypes.object,
75
+ maxHeight: PropTypes.string,
76
+ callback: PropTypes.shape(CallbackType),
77
+ childrenKey: PropTypes.string,
78
+ };
79
+
80
+ state = {filterVisibleKey: ''};
81
+
82
+ onTableChange = (pagination, filters, sorter) => {
83
+ const {onTableChange} = this.props.callback || {};
84
+ const {filterInfo=null} = this.props;
85
+ onTableChange && onTableChange(sorter, filterInfo);
86
+ };
87
+
88
+ onChange = (selectedKeyArr=[]) => {
89
+ const {onCheck} = this.props.callback || {};
90
+ if (onCheck) {
91
+ const {items=[]} = this.props;
92
+ let offset = 0;
93
+ const realSlectedList = selectedKeyArr.length > items.length ? selectedKeyArr.slice(0, selectedKeyArr.length + offset) : selectedKeyArr;
94
+ const selectedKeys = realSlectedList;
95
+ const newItems = items;
96
+ if (selectedKeys.length === 0) {
97
+ onCheck(true, false, -1);
98
+ } else if (selectedKeys.length === newItems.length) {
99
+ const checked = newItems.every(o => o.checked);
100
+ onCheck(true, !checked, -1);
101
+ } else {
102
+ const defaultSelectedKeys = this.getSelectedRowKeys(newItems);
103
+ if (selectedKeys.length > defaultSelectedKeys.length) {
104
+ if (this.props.isPaging && selectedKeys.length - defaultSelectedKeys.length > 1) {
105
+ return onCheck(true, true, -1);
106
+ }
107
+ onCheck(false, true, selectedKeys[selectedKeys.length - 1]);
108
+ } else {
109
+ const index = defaultSelectedKeys.findIndex(key => !selectedKeys.some(select => select === key));
110
+ onCheck(false, false, defaultSelectedKeys[index]);
111
+ }
112
+ }
113
+ }
114
+ };
115
+
116
+ onCheckChange = (selectedKeys) => {
117
+ const {onCheck} = this.props.callback || {};
118
+ onCheck && onCheck(selectedKeys);
119
+ };
120
+
121
+ onRadioChange = (selectedKeys) => {
122
+ const {onRadio} = this.props.callback || {};
123
+ onRadio && onRadio(selectedKeys);
124
+ };
125
+
126
+ onRadioRowClick = (record) => {
127
+ const {onRadio} = this.props.callback || {};
128
+ onRadio && onRadio([record.key]);
129
+ };
130
+
131
+ onRowClick = (record) => {
132
+ const {items} = this.props;
133
+ if (items.length <= record.key) return;
134
+ clearTimeout(this.timer);
135
+ this.timer = setTimeout(() => {
136
+ const {onCheck} = this.props.callback || {};
137
+ if (onCheck) {
138
+ const {checkedRows=[]} = this.props;
139
+ if (checkedRows.includes(record.key)) {
140
+ onCheck(checkedRows.filter(key => record.key !== key));
141
+ } else {
142
+ onCheck(checkedRows.concat(record.key));
143
+ }
144
+ }
145
+ }, 250);
146
+ };
147
+
148
+ onDoubleClick = (record) => {
149
+ clearTimeout(this.timer);
150
+ const {onDoubleClick} = this.props.callback || {};
151
+ onDoubleClick && onDoubleClick(record.key);
152
+ };
153
+
154
+ onLink = (key, index, item, e) => {
155
+ const {onLink} = this.props.callback || {};
156
+ onLink && onLink(key, index, item);
157
+ e.stopPropagation();
158
+ };
159
+
160
+ onLinkDouble = (e) => {
161
+ e.stopPropagation();
162
+ };
163
+
164
+ getSelectedRowKeys = (items) => {
165
+ return items.reduce((result, item, index) => {
166
+ item.checked && result.push(index);
167
+ return result;
168
+ }, []);
169
+ };
170
+
171
+ getIndexInfo = (items=[]) => {
172
+ const {index=true, indexTitle='序号'} = this.props;
173
+ return index ? [{key: 'index', title: indexTitle, render: (text, record, index) => (index + 1)}] : [];
174
+ };
175
+
176
+ setSortInfo = (col, sortInfo) => {
177
+ if (col.sorter === 'string') {
178
+ col.sortOrder = sortInfo.columnKey === col.key && sortInfo.order;
179
+ col.sorter = (row1, row2) => {
180
+ const a = !col.link ? row1[col.key] : row1[col.key].props.children;
181
+ const b = !col.link ? row2[col.key] : row2[col.key].props.children;
182
+ if (a > b) {
183
+ return 1;
184
+ } else if (a === b) {
185
+ return 0;
186
+ } else {
187
+ return -1;
188
+ }
189
+ };
190
+ } else if (col.sorter === 'number') {
191
+ col.sortOrder = sortInfo.columnKey === col.key && sortInfo.order;
192
+ col.sorter = (a, b) => a[col.key] - b[col.key];
193
+ } else {
194
+ delete col.sorter;
195
+ }
196
+ };
197
+
198
+ setFilterInfo = (col, filterInfo, visibleKey) => {
199
+ if (col.filter) {
200
+ const {isDateFilterByStartAndEnd=false} = col;
201
+ const onSearch = (value) => {
202
+ const {onTableChange} = this.props.callback || {};
203
+ const {sortInfo=null} = this.props;
204
+ const newFilterInfo = Object.assign({}, filterInfo, {[col.key]: value});
205
+ this.setState({filterVisibleKey: ''});
206
+ onTableChange && onTableChange(sortInfo, newFilterInfo);
207
+ };
208
+ const value = filterInfo[col.key];
209
+ col.filteredValue = value ? [value] : null;
210
+ col.filterDropdownVisible = visibleKey === col.key;
211
+ const onClose = () => {
212
+ this.setState({filterVisibleKey: ''});
213
+ };
214
+ col.filterDropdown = <FilterDropDown {...{value, onSearch, onClose, isDateFilterByStartAndEnd}} />;
215
+ col.onFilterDropdownVisibleChange = (visible) => {
216
+ if (isDateFilterByStartAndEnd) {
217
+ visible && this.setState({filterVisibleKey: col.key});
218
+ } else {
219
+ this.setState({filterVisibleKey: visible ? col.key : ''});
220
+ }
221
+ };
222
+ col.onFilter = (value, record) => {
223
+ const content = !col.link ? record[col.key] : record[col.key].props.children;
224
+ if(!col.isDateFilterByStartAndEnd){
225
+ const con = Array.isArray(content) ? content : String(content);
226
+ return con.includes(value);
227
+ } else {
228
+ return !((value.start && new Date(value.start) > new Date(content)) || (value.end && value.end < content));
229
+ }
230
+ }
231
+ }
232
+ delete col.filter;
233
+ };
234
+
235
+ linkList = (key, index, item, linkTitleKey='fileName') => {
236
+ const list = item[key] || [];
237
+ return (
238
+ <div>
239
+ {list.map((item2, index2) => {
240
+ const split = index2 === list.length-1 ? '' : ',';
241
+ const onClick = this.onLink.bind(null, key, index, item2);
242
+ return <a key={index2} onClick={onClick} onDoubleClick={this.onLinkDouble}>{`${item2[linkTitleKey]}${split}`}</a>;
243
+ })}
244
+ </div>
245
+ )
246
+ };
247
+
248
+ waring = (key,index,item,warningKey) => {
249
+ const text = item[key] ? item[key] : '';
250
+ const color = item[warningKey] == 1 ?'red' :'rgba(0, 0, 0, 0.65)';
251
+ return (
252
+ <div>
253
+ <p style={{color:color}}>{text.title ? text.title : text}</p>
254
+ </div>
255
+ )
256
+ };
257
+
258
+ defaultList = (key,index,item,text,link) => {
259
+ const onClick = this.onLink.bind(null, key, index, item);
260
+ if (link && (typeof link === 'string')) {
261
+ return <a onClick={onClick} onDoubleClick={this.onLinkDouble}>{text}</a>;
262
+ }
263
+ return (
264
+ <div>
265
+ <p>{text}</p>
266
+ </div>
267
+ )
268
+ };
269
+
270
+ getColumns = (cols, items) => {
271
+ const {sortInfo, filterInfo} = this.props;
272
+ const {filterVisibleKey} = this.state;
273
+ return this.getIndexInfo(items).concat(cols.filter(col => !col.hide)).map(({...col}) => {
274
+ col.dataIndex = col.key;
275
+ col.className = col.key === 'index' ? 'ant-table-selection-column' : (col.align ? s[col.align] : '');
276
+ col.noWrap && (col.className = variables('SuperTable3').noWrap);
277
+ this.setSortInfo(col, sortInfo || {});
278
+ this.setFilterInfo(col, filterInfo || {}, filterVisibleKey);
279
+
280
+ if(col.defaultValue){
281
+ col.render = (text, record, index) => this.defaultList(col.key, index, items[index],col.defaultValue,col.link)
282
+ }else if (col.link === 'list') {
283
+ col.render = (text, record, index) => this.linkList(col.key, index, items[index], col.linkTitleKey);
284
+ }else if (col.link && (typeof col.link === 'string')) {
285
+ col.render = (text, record, index) => this.link(col.key, index, items[index], col.link);
286
+ }else if(col.isWarning){
287
+ col.render = (text, record, index) => this.waring(col.key, index, items[index],col.warningKey);
288
+ }else if (col.tooltip) {
289
+ col.render = (text, record, index) => this.tooltip(col.key, index, items[index], col);
290
+ }
291
+ return col;
292
+ });
293
+ };
294
+
295
+ getText = (value, options) => {
296
+ if (Array.isArray(value)) {
297
+ return value.map(v => getTitle(v, options)).toString();
298
+ } else {
299
+ return getTitle(value, options);
300
+ }
301
+ };
302
+
303
+ link = (key, index, item, text) => {
304
+ const onClick = this.onLink.bind(null, key, index, item);
305
+ return <a onClick={onClick} onDoubleClick={this.onLinkDouble}>{text}</a>;
306
+ };
307
+
308
+ tooltip = (key, index, item, {tooltip:tipLen, options}) => {
309
+ const text = this.getText(item[key], options);
310
+ const needTip = tipLen > 1 && text && typeof text === 'string' && text.length > tipLen;
311
+ return needTip ? (
312
+ <Tooltip title={text}>
313
+ <span>{text.slice(0, tipLen) + '...'}</span>
314
+ </Tooltip>
315
+ ) : <span>{Array.isArray(text) ? text.join(',') : text}</span>;
316
+ };
317
+
318
+ getImgSrc = (value, options) => {
319
+ const index = options.findIndex(obj => obj.value == value);
320
+ return index === -1 ? null : options[index].img;
321
+ };
322
+
323
+ /**
324
+ *
325
+ * @param item{array}:列数据
326
+ * @param key{string}:字段key
327
+ * @param options{array}:字段options
328
+ * @param dataSource{string,array}:数据源,如果列数据有多层则用此决定
329
+ */
330
+ getSourceText = (item,key,options,dataSource) => {
331
+ let value = {};
332
+ if(typeof dataSource === 'string'){
333
+ value = item[dataSource] || {};
334
+ }else if(Array.isArray(dataSource)){
335
+ dataSource.forEach((source,index) => {
336
+ /*如果字段重复则用dataSource取到结果,key不作为取字段的标准*/
337
+ if(index === 0){
338
+ value = item[source] || {};
339
+ }else {
340
+ value = value[source] || {}
341
+ }
342
+ })
343
+ }
344
+ /*如果上面已经取到结果则不进入*/
345
+ if(typeof value !== 'string'){
346
+ value = value[key];
347
+ }
348
+ return this.getText(value, options);
349
+ };
350
+
351
+
352
+ getDataSource = (items, cols) => {
353
+ const getItemObj = (item, index) => {
354
+ return cols.reduce((result, {key, options, link, icon,dataSource}) => {
355
+ if (link) {
356
+ if (typeof link === 'boolean') {
357
+ result[key] = this.link(key, index, item, this.getText(item[key], options));
358
+ }
359
+ } else if (icon) { //单独的icon列,icon=true数据值根据options获得显示的图片url
360
+ const src = this.getImgSrc(item[key], options);
361
+ const onClick = this.onLink.bind(null, key, index, item);
362
+ result[key] = src ? <img src={src} onClick={onClick} /> : '';
363
+ } else if(dataSource){
364
+ result[key] = this.getSourceText(item,key,options,dataSource);
365
+ }else {
366
+ result[key] = this.getText(item[key], options);
367
+ }
368
+ return result;
369
+ }, {key: index, checked: !!item.checked});
370
+ };
371
+
372
+ const data = items.map((item, index) => {
373
+ return {
374
+ ...getItemObj(item, index),
375
+ children: item.children ? item.children.map((item2, index2) => getItemObj(item2, `${index}-${index2}`)) : null
376
+ };
377
+ });
378
+ return data;
379
+ };
380
+
381
+ getPropsByCheckbox = () => {
382
+ const {checkbox=true, checkedRows=[]} = this.props;
383
+ const rowClassName1 = (record) => {
384
+ return checkedRows.includes(record.key) ? variables('SuperTable3').select : '';
385
+ };
386
+ if (checkbox) {
387
+ return {
388
+ rowClassName: rowClassName1,
389
+ onRowClick: this.onRowClick,
390
+ rowSelection: {
391
+ selectedRowKeys: checkedRows,
392
+ onChange: this.onCheckChange,
393
+ getCheckboxProps: (record) => {
394
+ const checked = checkedRows.includes(record.key);
395
+ return {
396
+ checked,
397
+ }
398
+ },
399
+ }
400
+ }
401
+ }
402
+ };
403
+
404
+ getRowProps = (onRowClick) => {
405
+ return (record) => {
406
+ return {
407
+ onClick: () => onRowClick && onRowClick(record),
408
+ onDoubleClick: () => this.onDoubleClick(record)
409
+ };
410
+ };
411
+ };
412
+
413
+ getItems = () => {
414
+ const {items, childrenKey} = this.props;
415
+ let resItems = items;
416
+ if (childrenKey) {
417
+ resItems = items.map(o => o[childrenKey] && o[childrenKey].length ? {...o, children: o[childrenKey]} : o);
418
+ }
419
+ return resItems;
420
+ };
421
+
422
+ toTotalFooter = () => {
423
+ const {cols, items, checkedRows} = this.props;
424
+ const totalCols = cols.filter(item => item.total);
425
+ if (totalCols.length > 0) {
426
+ const checkedItems = items.filter((item, index) => checkedRows.includes(index));
427
+ const countItems = checkedItems.length ? checkedItems : items;
428
+ const totalItems = totalCols.map(({title, key, props={}}) => {
429
+ const value = countItems.reduce((result, item) => parseFloat((result + Number(item[key] || 0)).toFixed(props.precision || 6)), 0);
430
+ return {title, value};
431
+ });
432
+ return (
433
+ <div style={{height: '36px',lineHeight: '36px'}}>
434
+ <span style={{marginRight: `15px`}}>{checkedItems.length ? '【当页勾选汇总】' : '【当页汇总】'}</span>
435
+ {totalItems.map(({title, value}, index) => {
436
+ return (
437
+ <span key={index} style={{marginRight: `10px`}}>
438
+ <span>{title}: </span>
439
+ <span style={{color: '#01a4ff'}}>{value}</span>
440
+ </span>
441
+ )
442
+ })}
443
+ </div>
444
+ );
445
+ } else {
446
+ return null;
447
+ }
448
+ };
449
+
450
+ getProps = () => {
451
+ const {cols, isPaging=false, footer = null} = this.props;
452
+ const items = this.getItems();
453
+ const {onRowClick, ...extraProps} = this.getPropsByCheckbox(items);
454
+ const renderProps = {
455
+ className: variables('SuperTable3'),
456
+ columns: this.getColumns(cols, items),
457
+ dataSource: this.getDataSource(items, cols),
458
+ size: 'small',
459
+ pagination: isPaging,
460
+ scroll: {x: true},
461
+ onChange: this.onTableChange,
462
+ onRow: this.getRowProps(onRowClick),
463
+ components: {},
464
+ footer: footer ? footer : this.toTotalFooter,
465
+ ...extraProps
466
+ };
467
+ return renderProps;
468
+ };
469
+
470
+ setScroll = () => {
471
+ const {maxHeight} = this.props;
472
+ if (maxHeight && this.getItems().length) {
473
+ const root = ReactDOM.findDOMNode(this);
474
+ const container = root.getElementsByClassName('ant-table-body')[0];
475
+ const header = root.getElementsByClassName('ant-table-thead')[0];
476
+ fixed(container, header, maxHeight);
477
+ }
478
+ };
479
+
480
+ shouldComponentUpdate(props, state) {
481
+ const keys = ['cols', 'items', 'maxHeight', 'checkedRows', 'sortInfo', 'filterInfo'];
482
+ return keys.some(key => props[key] !== this.props[key]) || state.filterVisibleKey !== this.state.filterVisibleKey;
483
+ }
484
+
485
+ componentDidMount() {
486
+ this.setScroll();
487
+ }
488
+
489
+ componentDidUpdate() {
490
+ this.setScroll();
491
+ }
492
+
493
+ render() {
494
+ return <Table {...this.getProps()} key={this.props.items.length} />;
495
+ }
496
+ }
497
+
498
+ export default SuperTable;
@@ -0,0 +1,34 @@
1
+
2
+ const isFirefox = () => {
3
+ return navigator.userAgent.indexOf('Firefox') > 0;
4
+ };
5
+
6
+ const getComputedStyle = (element) => {
7
+ return window.getComputedStyle ? window.getComputedStyle(element, null) : element.currentStyle;
8
+ }
9
+
10
+ const fixed = (container, header, maxHeight, totalFooter={}) => {
11
+ container.style.overflowY = 'auto';
12
+ container.style.maxHeight = maxHeight;
13
+ if (isFirefox()) {
14
+ container.style.position = 'relative';
15
+ header.style.top = '0';
16
+ header.style.position = 'sticky';
17
+ header.style.zIndex = '1';
18
+ } else {
19
+ header.parentNode.appendChild(header);
20
+ }
21
+ const containerHeight = Number(getComputedStyle(container).height.replace('px', ''))
22
+ const translateHeight = containerHeight - 10 - container.scrollHeight;
23
+ const {pageTotalElement, searchTotalElement} = totalFooter;
24
+ pageTotalElement && (pageTotalElement.style.transform = `translateY(${translateHeight + container.scrollTop}px)`);
25
+ searchTotalElement && (searchTotalElement.style.transform = `translateY(${translateHeight + container.scrollTop}px)`);
26
+ container.onscroll = () => {
27
+ if (container.scrollTop + containerHeight - 10 > container.scrollHeight) return;
28
+ !isFirefox() && (header.style.transform = `translateY(${container.scrollTop}px)`);
29
+ pageTotalElement && (pageTotalElement.style.transform = `translateY(${translateHeight + container.scrollTop}px)`);
30
+ searchTotalElement && (searchTotalElement.style.transform = `translateY(${translateHeight + container.scrollTop}px)`);
31
+ };
32
+ };
33
+
34
+ export default fixed;
@@ -0,0 +1,128 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {Button, Popconfirm, Icon, Dropdown, Menu} from 'antd';
4
+ import variables from '../variables';
5
+ const MenuItem = Menu.Item;
6
+ const SubMenu = Menu.SubMenu;
7
+
8
+ let clicktag = 0; //被点击标识
9
+
10
+ /**
11
+ * key: 用于标识菜单项
12
+ * title: 菜单项上的文字
13
+ * subMenu: [可选],菜单项子列表,包含key和title的对象数组,此时点击菜单项不触发事件,只有点击子列表项才会触发onSubClick事件
14
+ */
15
+ const MenuType = {
16
+ key: PropTypes.string.isRequired,
17
+ title: PropTypes.string.isRequired,
18
+ subMenu: PropTypes.array
19
+ };
20
+
21
+ /**
22
+ * key: 用于标识按钮
23
+ * title: 按钮上的文字
24
+ * bsStyle: 按钮样式,与antd中Button的type取值一样
25
+ * confirm: 触发按钮事件前,是否需要用户确认,以及确认的提示文字;为空串则不会触发确认提示
26
+ * menu: [可选],下拉菜单项,有此属性时点击按钮不触发事件,菜单项如果仅是包含key和title的对象,点击菜单项会触发onClick事件
27
+ * 菜单项如果是包含key、title、subMenu的对象,则点击此菜单项不触发事件,必须点击子列表项时才会触发onSubClick事件
28
+ * loading: 是否正在加载,与antd中Button的loading取值一样
29
+ */
30
+ const ButtonType = {
31
+ key: PropTypes.string.isRequired,
32
+ title: PropTypes.string.isRequired,
33
+ bsStyle: PropTypes.string,
34
+ confirm: PropTypes.string,
35
+ menu: PropTypes.arrayOf(PropTypes.shape(MenuType)),
36
+ loading: PropTypes.bool,
37
+ };
38
+
39
+ const ButtonEx = ({type, children, ...props}) => {
40
+ props[type === 'primary-o' ? 'data-btn-type' : 'type'] = type;
41
+ return <Button {...props}>{children}</Button>;
42
+ };
43
+
44
+ /**
45
+ * onClick: 纯按钮点击时或按钮下拉项中无子菜单列表项点击触发,原型为function(key)
46
+ * onSubClick: 按钮为下拉时下拉项子列表项点击时触发,原型为function(key, subKey)
47
+ */
48
+ class SuperToolbar extends React.Component {
49
+ static propTypes = {
50
+ buttons: PropTypes.arrayOf(PropTypes.shape(ButtonType)).isRequired,
51
+ size: PropTypes.oneOf(['small', 'default', 'large']),
52
+ onClick: PropTypes.func,
53
+ onSubClick: PropTypes.func
54
+ };
55
+
56
+ onClick = (e) => {
57
+ const {onClick, onSubClick} = this.props;
58
+ const key = typeof e === 'object' ? e.key : e;
59
+ if (typeof e === 'object' && e.keyPath.length === 2 && onSubClick) {
60
+ onSubClick(e.keyPath[1], e.keyPath[0]);
61
+ } else if (onClick) {
62
+ if(clicktag === 0){
63
+ clicktag = 1;
64
+ onClick(key);
65
+ //1秒过后可以再次点击
66
+ setTimeout(function () { clicktag = 0 }, 1000);
67
+ }else{
68
+ console.log('请勿频繁操作!');
69
+ }
70
+ }
71
+ };
72
+
73
+ toSubMenu = ({key, title, subMenu=[]}) => {
74
+ return (
75
+ <SubMenu key={key} title={title}>
76
+ {subMenu.map(({key, title}) => <MenuItem key={key}>{title}</MenuItem>)}
77
+ </SubMenu>
78
+ );
79
+ };
80
+
81
+ toMenu = (menu) => {
82
+ return (
83
+ <Menu onClick={this.onClick}>
84
+ {
85
+ menu.map((item) => {
86
+ const {key, title, subMenu} = item;
87
+ if (subMenu) {
88
+ return this.toSubMenu(item);
89
+ } else {
90
+ return <MenuItem key={key}>{title}</MenuItem>;
91
+ }
92
+ })
93
+ }
94
+ </Menu>
95
+ );
96
+ };
97
+
98
+ toButton = ({key, title, bsStyle: type, confirm, menu, loading}) => {
99
+ const onClick = this.onClick.bind(this, key);
100
+ const {size='small'} = this.props;
101
+ if (menu && menu.length) {
102
+ return (
103
+ <Dropdown key={key} trigger={['hover']} overlay={this.toMenu(menu)}>
104
+ <ButtonEx {...{size, type}}>{title}<Icon type='down'/></ButtonEx>
105
+ </Dropdown>
106
+ );
107
+ } else if (!confirm) {
108
+ return <ButtonEx {...{key, size, type, onClick, loading}}>{title}</ButtonEx>;
109
+ } else {
110
+ return (
111
+ <Popconfirm key={key} title={confirm} onConfirm={onClick}>
112
+ <ButtonEx {...{size, type, loading}}>{title}</ButtonEx>
113
+ </Popconfirm>
114
+ );
115
+ }
116
+ };
117
+
118
+ render() {
119
+ const {buttons} = this.props;
120
+ return (
121
+ <div className={variables('SuperToolbar')} role='toolbar'>
122
+ {buttons.map(this.toButton)}
123
+ </div>
124
+ );
125
+ }
126
+ }
127
+
128
+ export default SuperToolbar;