vxe-pc-ui 3.15.10 → 3.15.12

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 (288) hide show
  1. package/es/calendar/style.css +234 -311
  2. package/es/calendar/style.min.css +1 -1
  3. package/es/cascader/src/cascader.js +3 -3
  4. package/es/collapse/src/collapse.js +72 -36
  5. package/es/components.js +6 -0
  6. package/es/date-picker/src/date-picker.js +1 -4
  7. package/es/icon/style.css +1 -1
  8. package/es/image/src/image.js +14 -14
  9. package/es/language/ar-EG.js +4 -0
  10. package/es/language/de-DE.js +4 -0
  11. package/es/language/en-US.js +5 -1
  12. package/es/language/es-ES.js +4 -0
  13. package/es/language/fr-FR.js +4 -0
  14. package/es/language/hu-HU.js +4 -0
  15. package/es/language/hy-AM.js +4 -0
  16. package/es/language/id-ID.js +4 -0
  17. package/es/language/it-IT.js +4 -0
  18. package/es/language/ja-JP.js +4 -0
  19. package/es/language/ko-KR.js +4 -0
  20. package/es/language/ms-MY.js +4 -0
  21. package/es/language/nb-NO.js +4 -0
  22. package/es/language/pt-BR.js +4 -0
  23. package/es/language/ru-RU.js +4 -0
  24. package/es/language/th-TH.js +4 -0
  25. package/es/language/ug-CN.js +4 -0
  26. package/es/language/uk-UA.js +4 -0
  27. package/es/language/uz-UZ.js +4 -0
  28. package/es/language/vi-VN.js +4 -0
  29. package/es/language/zh-CHT.js +4 -0
  30. package/es/language/zh-CN.js +4 -0
  31. package/es/list/src/list.js +1260 -32
  32. package/es/list/src/store.js +8 -0
  33. package/es/list/style.css +333 -0
  34. package/es/list/style.min.css +1 -1
  35. package/es/print/src/util.js +1 -1
  36. package/es/pulldown/src/pulldown.js +4 -4
  37. package/es/select/style.css +9 -3
  38. package/es/select/style.min.css +1 -1
  39. package/es/style.css +1 -1
  40. package/es/style.min.css +1 -1
  41. package/es/table-transfer/index.js +12 -0
  42. package/es/table-transfer/src/table-transfer.js +71 -0
  43. package/es/table-transfer/style.css +0 -0
  44. package/es/table-transfer/style.min.css +0 -0
  45. package/es/transfer/index.js +12 -0
  46. package/es/transfer/src/transfer.js +86 -0
  47. package/es/transfer/style.css +0 -0
  48. package/es/transfer/style.min.css +0 -0
  49. package/es/tree/src/tree.js +20 -26
  50. package/es/tree/src/util.js +0 -7
  51. package/es/tree-select/src/tree-select.js +8 -7
  52. package/es/tree-select/style.css +9 -3
  53. package/es/tree-select/style.min.css +1 -1
  54. package/es/ui/index.js +14 -2
  55. package/es/ui/src/log.js +1 -1
  56. package/es/ui/src/utils.js +12 -0
  57. package/es/vxe-calendar/style.css +234 -311
  58. package/es/vxe-calendar/style.min.css +1 -1
  59. package/es/vxe-list/style.css +333 -0
  60. package/es/vxe-list/style.min.css +1 -1
  61. package/es/vxe-select/style.css +9 -3
  62. package/es/vxe-select/style.min.css +1 -1
  63. package/es/vxe-table-transfer/index.js +3 -0
  64. package/es/vxe-table-transfer/style.css +0 -0
  65. package/es/vxe-table-transfer/style.min.css +0 -0
  66. package/es/vxe-transfer/index.js +3 -0
  67. package/es/vxe-transfer/style.css +0 -0
  68. package/es/vxe-transfer/style.min.css +0 -0
  69. package/es/vxe-tree-select/style.css +9 -3
  70. package/es/vxe-tree-select/style.min.css +1 -1
  71. package/lib/calendar/style/style.css +234 -311
  72. package/lib/calendar/style/style.min.css +1 -1
  73. package/lib/cascader/src/cascader.js +3 -3
  74. package/lib/cascader/src/cascader.min.js +1 -1
  75. package/lib/collapse/src/collapse.js +74 -37
  76. package/lib/collapse/src/collapse.min.js +1 -1
  77. package/lib/components.js +25 -1
  78. package/lib/components.min.js +1 -1
  79. package/lib/date-picker/src/date-picker.js +1 -4
  80. package/lib/date-picker/src/date-picker.min.js +1 -1
  81. package/lib/icon/style/style.css +1 -1
  82. package/lib/icon/style/style.min.css +1 -1
  83. package/lib/image/src/image.js +17 -17
  84. package/lib/image/src/image.min.js +1 -1
  85. package/lib/index.umd.js +1795 -209
  86. package/lib/index.umd.min.js +1 -1
  87. package/lib/language/ar-EG.js +4 -0
  88. package/lib/language/ar-EG.min.js +1 -1
  89. package/lib/language/ar-EG.umd.js +4 -0
  90. package/lib/language/de-DE.js +4 -0
  91. package/lib/language/de-DE.min.js +1 -1
  92. package/lib/language/de-DE.umd.js +4 -0
  93. package/lib/language/en-US.js +5 -1
  94. package/lib/language/en-US.min.js +1 -1
  95. package/lib/language/en-US.umd.js +5 -1
  96. package/lib/language/es-ES.js +4 -0
  97. package/lib/language/es-ES.min.js +1 -1
  98. package/lib/language/es-ES.umd.js +4 -0
  99. package/lib/language/fr-FR.js +4 -0
  100. package/lib/language/fr-FR.min.js +1 -1
  101. package/lib/language/fr-FR.umd.js +4 -0
  102. package/lib/language/hu-HU.js +4 -0
  103. package/lib/language/hu-HU.min.js +1 -1
  104. package/lib/language/hu-HU.umd.js +4 -0
  105. package/lib/language/hy-AM.js +4 -0
  106. package/lib/language/hy-AM.min.js +1 -1
  107. package/lib/language/hy-AM.umd.js +4 -0
  108. package/lib/language/id-ID.js +4 -0
  109. package/lib/language/id-ID.min.js +1 -1
  110. package/lib/language/id-ID.umd.js +4 -0
  111. package/lib/language/it-IT.js +4 -0
  112. package/lib/language/it-IT.min.js +1 -1
  113. package/lib/language/it-IT.umd.js +4 -0
  114. package/lib/language/ja-JP.js +4 -0
  115. package/lib/language/ja-JP.min.js +1 -1
  116. package/lib/language/ja-JP.umd.js +4 -0
  117. package/lib/language/ko-KR.js +4 -0
  118. package/lib/language/ko-KR.min.js +1 -1
  119. package/lib/language/ko-KR.umd.js +4 -0
  120. package/lib/language/ms-MY.js +4 -0
  121. package/lib/language/ms-MY.min.js +1 -1
  122. package/lib/language/ms-MY.umd.js +4 -0
  123. package/lib/language/nb-NO.js +4 -0
  124. package/lib/language/nb-NO.min.js +1 -1
  125. package/lib/language/nb-NO.umd.js +4 -0
  126. package/lib/language/pt-BR.js +4 -0
  127. package/lib/language/pt-BR.min.js +1 -1
  128. package/lib/language/pt-BR.umd.js +4 -0
  129. package/lib/language/ru-RU.js +4 -0
  130. package/lib/language/ru-RU.min.js +1 -1
  131. package/lib/language/ru-RU.umd.js +4 -0
  132. package/lib/language/th-TH.js +4 -0
  133. package/lib/language/th-TH.min.js +1 -1
  134. package/lib/language/th-TH.umd.js +4 -0
  135. package/lib/language/ug-CN.js +4 -0
  136. package/lib/language/ug-CN.min.js +1 -1
  137. package/lib/language/ug-CN.umd.js +4 -0
  138. package/lib/language/uk-UA.js +4 -0
  139. package/lib/language/uk-UA.min.js +1 -1
  140. package/lib/language/uk-UA.umd.js +4 -0
  141. package/lib/language/uz-UZ.js +4 -0
  142. package/lib/language/uz-UZ.min.js +1 -1
  143. package/lib/language/uz-UZ.umd.js +4 -0
  144. package/lib/language/vi-VN.js +4 -0
  145. package/lib/language/vi-VN.min.js +1 -1
  146. package/lib/language/vi-VN.umd.js +4 -0
  147. package/lib/language/zh-CHT.js +4 -0
  148. package/lib/language/zh-CHT.min.js +1 -1
  149. package/lib/language/zh-CHT.umd.js +4 -0
  150. package/lib/language/zh-CN.js +4 -0
  151. package/lib/language/zh-CN.min.js +1 -1
  152. package/lib/language/zh-CN.umd.js +4 -0
  153. package/lib/list/src/list.js +1347 -36
  154. package/lib/list/src/list.min.js +1 -1
  155. package/lib/list/src/store.js +15 -0
  156. package/lib/list/src/store.min.js +1 -0
  157. package/lib/list/style/style.css +333 -0
  158. package/lib/list/style/style.min.css +1 -1
  159. package/lib/print/src/util.js +1 -1
  160. package/lib/print/src/util.min.js +1 -1
  161. package/lib/pulldown/src/pulldown.js +4 -0
  162. package/lib/pulldown/src/pulldown.min.js +1 -1
  163. package/lib/select/style/style.css +9 -3
  164. package/lib/select/style/style.min.css +1 -1
  165. package/lib/style.css +1 -1
  166. package/lib/style.min.css +1 -1
  167. package/lib/table-transfer/index.js +19 -0
  168. package/lib/table-transfer/index.min.js +1 -0
  169. package/lib/table-transfer/src/table-transfer.js +84 -0
  170. package/lib/table-transfer/src/table-transfer.min.js +1 -0
  171. package/lib/table-transfer/style/index.js +1 -0
  172. package/lib/table-transfer/style/style.css +0 -0
  173. package/lib/table-transfer/style/style.min.css +0 -0
  174. package/lib/transfer/index.js +19 -0
  175. package/lib/transfer/index.min.js +1 -0
  176. package/lib/transfer/src/transfer.js +93 -0
  177. package/lib/transfer/src/transfer.min.js +1 -0
  178. package/lib/transfer/style/index.js +1 -0
  179. package/lib/transfer/style/style.css +0 -0
  180. package/lib/transfer/style/style.min.css +0 -0
  181. package/lib/tree/src/tree.js +18 -28
  182. package/lib/tree/src/tree.min.js +1 -1
  183. package/lib/tree/src/util.js +0 -10
  184. package/lib/tree/src/util.min.js +1 -1
  185. package/lib/tree-select/src/tree-select.js +9 -6
  186. package/lib/tree-select/src/tree-select.min.js +1 -1
  187. package/lib/tree-select/style/style.css +9 -3
  188. package/lib/tree-select/style/style.min.css +1 -1
  189. package/lib/ui/index.js +14 -2
  190. package/lib/ui/index.min.js +1 -1
  191. package/lib/ui/src/log.js +1 -1
  192. package/lib/ui/src/log.min.js +1 -1
  193. package/lib/ui/src/utils.js +15 -0
  194. package/lib/ui/src/utils.min.js +1 -1
  195. package/lib/vxe-calendar/style/style.css +234 -311
  196. package/lib/vxe-calendar/style/style.min.css +1 -1
  197. package/lib/vxe-list/style/style.css +333 -0
  198. package/lib/vxe-list/style/style.min.css +1 -1
  199. package/lib/vxe-select/style/style.css +9 -3
  200. package/lib/vxe-select/style/style.min.css +1 -1
  201. package/lib/vxe-table-transfer/index.js +22 -0
  202. package/lib/vxe-table-transfer/index.min.js +1 -0
  203. package/lib/vxe-table-transfer/style/index.js +1 -0
  204. package/lib/vxe-table-transfer/style/style.css +0 -0
  205. package/lib/vxe-table-transfer/style/style.min.css +0 -0
  206. package/lib/vxe-transfer/index.js +22 -0
  207. package/lib/vxe-transfer/index.min.js +1 -0
  208. package/lib/vxe-transfer/style/index.js +1 -0
  209. package/lib/vxe-transfer/style/style.css +0 -0
  210. package/lib/vxe-transfer/style/style.min.css +0 -0
  211. package/lib/vxe-tree-select/style/style.css +9 -3
  212. package/lib/vxe-tree-select/style/style.min.css +1 -1
  213. package/package.json +1 -1
  214. package/packages/cascader/src/cascader.ts +3 -3
  215. package/packages/collapse/src/collapse.ts +79 -36
  216. package/packages/components.ts +6 -0
  217. package/packages/date-picker/src/date-picker.ts +1 -4
  218. package/packages/image/src/image.ts +14 -14
  219. package/packages/language/ar-EG.ts +4 -0
  220. package/packages/language/de-DE.ts +4 -0
  221. package/packages/language/en-US.ts +5 -1
  222. package/packages/language/es-ES.ts +4 -0
  223. package/packages/language/fr-FR.ts +4 -0
  224. package/packages/language/hu-HU.ts +4 -0
  225. package/packages/language/hy-AM.ts +4 -0
  226. package/packages/language/id-ID.ts +4 -0
  227. package/packages/language/it-IT.ts +4 -0
  228. package/packages/language/ja-JP.ts +4 -0
  229. package/packages/language/ko-KR.ts +4 -0
  230. package/packages/language/ms-MY.ts +4 -0
  231. package/packages/language/nb-NO.ts +4 -0
  232. package/packages/language/pt-BR.ts +4 -0
  233. package/packages/language/ru-RU.ts +4 -0
  234. package/packages/language/th-TH.ts +4 -0
  235. package/packages/language/ug-CN.ts +4 -0
  236. package/packages/language/uk-UA.ts +4 -0
  237. package/packages/language/uz-UZ.ts +4 -0
  238. package/packages/language/vi-VN.ts +4 -0
  239. package/packages/language/zh-CHT.ts +4 -0
  240. package/packages/language/zh-CN.ts +4 -0
  241. package/packages/list/src/list.ts +1366 -35
  242. package/packages/list/src/store.ts +15 -0
  243. package/packages/print/src/util.ts +1 -2
  244. package/packages/pulldown/src/pulldown.ts +4 -4
  245. package/packages/table-transfer/index.ts +16 -0
  246. package/packages/table-transfer/src/table-transfer.ts +88 -0
  247. package/packages/transfer/index.ts +16 -0
  248. package/packages/transfer/src/transfer.ts +103 -0
  249. package/packages/tree/src/tree.ts +20 -26
  250. package/packages/tree/src/util.ts +0 -10
  251. package/packages/tree-select/src/tree-select.ts +8 -7
  252. package/packages/ui/index.ts +14 -1
  253. package/packages/ui/src/utils.ts +15 -0
  254. package/styles/all.scss +2 -0
  255. package/styles/components/calendar.scss +160 -395
  256. package/styles/components/list.scss +245 -0
  257. package/styles/components/select.scss +8 -3
  258. package/styles/components/table-transfer.scss +0 -0
  259. package/styles/components/transfer.scss +0 -0
  260. package/styles/components/tree-select.scss +8 -3
  261. package/styles/components/tree.scss +1 -0
  262. package/styles/theme/base.scss +3 -0
  263. package/styles/theme/dark.scss +10 -0
  264. package/styles/theme/light.scss +10 -0
  265. package/styles/variable.scss +11 -1
  266. package/types/all.d.ts +6 -0
  267. package/types/components/collapse.d.ts +5 -2
  268. package/types/components/list.d.ts +357 -17
  269. package/types/components/pulldown.d.ts +1 -0
  270. package/types/components/table-transfer.d.ts +77 -0
  271. package/types/components/table.d.ts +4 -0
  272. package/types/components/transfer.d.ts +77 -0
  273. package/types/components/tree-select.d.ts +4 -0
  274. package/types/components/tree.d.ts +1 -1
  275. package/types/ui/global-config.d.ts +4 -0
  276. package/types/ui/global-icon.d.ts +6 -1
  277. /package/es/icon/{iconfont.1782286917398.ttf → iconfont.1782655694572.ttf} +0 -0
  278. /package/es/icon/{iconfont.1782286917398.woff → iconfont.1782655694572.woff} +0 -0
  279. /package/es/icon/{iconfont.1782286917398.woff2 → iconfont.1782655694572.woff2} +0 -0
  280. /package/es/{iconfont.1782286917398.ttf → iconfont.1782655694572.ttf} +0 -0
  281. /package/es/{iconfont.1782286917398.woff → iconfont.1782655694572.woff} +0 -0
  282. /package/es/{iconfont.1782286917398.woff2 → iconfont.1782655694572.woff2} +0 -0
  283. /package/lib/icon/style/{iconfont.1782286917398.ttf → iconfont.1782655694572.ttf} +0 -0
  284. /package/lib/icon/style/{iconfont.1782286917398.woff → iconfont.1782655694572.woff} +0 -0
  285. /package/lib/icon/style/{iconfont.1782286917398.woff2 → iconfont.1782655694572.woff2} +0 -0
  286. /package/lib/{iconfont.1782286917398.ttf → iconfont.1782655694572.ttf} +0 -0
  287. /package/lib/{iconfont.1782286917398.woff → iconfont.1782655694572.woff} +0 -0
  288. /package/lib/{iconfont.1782286917398.woff2 → iconfont.1782655694572.woff2} +0 -0
@@ -1,25 +1,52 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
- import { getConfig, globalEvents, globalResize, createEvent, globalMixins } from '../../ui';
4
- import { isScale } from '../../ui/src/dom';
3
+ import { getConfig, getIcon, getI18n, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui';
4
+ import { crossListDragRowGlobal, getCrossListDragRowInfo } from './store';
5
+ import { addClass, getTpImg, isScale, removeClass, toCssUnit } from '../../ui/src/dom';
6
+ import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils';
5
7
  import { getSlotVNs } from '../../ui/src/vn';
8
+ import { createComponentLog } from '../../ui/src/log';
9
+ import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
6
10
  import VxeLoadingComponent from '../../loading/src/loading';
7
- const browseObj = XEUtils.browse();
11
+ const { errLog } = createComponentLog('tree');
12
+ function eqRowKey(rowKey1, rowKey2) {
13
+ return ('' + rowKey1) === ('' + rowKey2);
14
+ }
15
+ function getRowKeyByField(row, keyField) {
16
+ return row ? ('' + (row[keyField] || '')) : '';
17
+ }
18
+ function getRowIdByField(row, keyField) {
19
+ if (!row) {
20
+ return '';
21
+ }
22
+ const rowKey = getRowKeyByField(row, keyField);
23
+ return enModelValue(rowKey);
24
+ }
8
25
  function createReactData() {
9
26
  return {
10
27
  scrollYLoad: false,
11
28
  bodyHeight: 0,
29
+ headHeight: 0,
30
+ footHeight: 0,
12
31
  customHeight: 0,
13
32
  customMaxHeight: 0,
14
33
  parentHeight: 0,
15
34
  topSpaceHeight: 0,
16
- items: []
35
+ rowList: [],
36
+ selectRadioRow: null,
37
+ currRowFlag: 1,
38
+ updateCheckboxFlag: 1,
39
+ isAllChecked: false,
40
+ isAllIndeterminate: false,
41
+ dragRow: null,
42
+ dragTipText: ''
17
43
  };
18
44
  }
19
45
  function createInternalData() {
20
46
  return {
21
47
  resizeObserver: undefined,
22
48
  fullData: [],
49
+ fullKeyMaps: {},
23
50
  lastScrollLeft: 0,
24
51
  lastScrollTop: 0,
25
52
  scrollYStore: {
@@ -28,7 +55,11 @@ function createInternalData() {
28
55
  visibleSize: 0,
29
56
  offsetSize: 0,
30
57
  rowHeight: 0
31
- }
58
+ },
59
+ currentRow: null,
60
+ selectCheckboxMaps: {}
61
+ // prevDragRow: null,
62
+ // prevDragPos: ''
32
63
  };
33
64
  }
34
65
  export default {
@@ -51,6 +82,20 @@ export default {
51
82
  default: () => getConfig().list.autoResize
52
83
  },
53
84
  syncResize: [Boolean, String, Number],
85
+ showRadio: {
86
+ type: Boolean,
87
+ default: () => getConfig().list.showRadio
88
+ },
89
+ checkRowKey: [String, Number],
90
+ radioConfig: Object,
91
+ showCheckbox: {
92
+ type: Boolean,
93
+ default: () => getConfig().list.showCheckbox
94
+ },
95
+ checkRowKeys: Array,
96
+ checkboxConfig: Object,
97
+ rowConfig: Object,
98
+ dragConfig: Object,
54
99
  virtualYConfig: Object,
55
100
  scrollY: Object
56
101
  },
@@ -58,26 +103,74 @@ export default {
58
103
  const xID = XEUtils.uniqueId();
59
104
  const reactData = createReactData();
60
105
  return Object.assign(Object.assign({}, {}), { xID,
61
- reactData });
106
+ reactData, crossListDragRowInfo: crossListDragRowGlobal, reFlag: 0 });
62
107
  },
63
- computed: Object.assign(Object.assign({}, {}), { computeSYOpts() {
108
+ computed: Object.assign(Object.assign({}, {}), { computeRowOpts() {
109
+ const $xeList = this;
110
+ const props = $xeList;
111
+ return Object.assign({}, getConfig().list.rowConfig, props.rowConfig);
112
+ },
113
+ computeDragOpts() {
114
+ const $xeList = this;
115
+ const props = $xeList;
116
+ return Object.assign({}, getConfig().list.dragConfig, props.dragConfig);
117
+ },
118
+ computeSYOpts() {
64
119
  const $xeList = this;
65
120
  const props = $xeList;
66
121
  return Object.assign({}, getConfig().list.virtualYConfig || getConfig().list.scrollY, props.virtualYConfig || props.scrollY);
67
122
  },
68
- computeStyles() {
123
+ computeKeyField() {
124
+ const $xeList = this;
125
+ const rowOpts = $xeList.computeRowOpts;
126
+ const { keyField } = rowOpts;
127
+ return keyField || '';
128
+ },
129
+ computeIsDrag() {
130
+ const $xeList = this;
131
+ const props = $xeList;
132
+ const { dragConfig } = props;
133
+ const dragOpts = $xeList.computeDragOpts;
134
+ return dragConfig && isEnableConf(dragOpts);
135
+ },
136
+ computeRowHeight() {
137
+ const $xeList = this;
138
+ const rowOpts = $xeList.computeRowOpts;
139
+ const { height } = rowOpts;
140
+ return height;
141
+ },
142
+ computeRadioOpts() {
143
+ const $xeList = this;
144
+ const props = $xeList;
145
+ return Object.assign({ showIcon: true }, getConfig().list.radioConfig, props.radioConfig);
146
+ },
147
+ computeCheckboxOpts() {
148
+ const $xeList = this;
149
+ const props = $xeList;
150
+ return Object.assign({ showIcon: true }, getConfig().list.checkboxConfig, props.checkboxConfig);
151
+ },
152
+ computeWrapperStyles() {
153
+ const $xeList = this;
154
+ const rowHeight = $xeList.computeRowHeight;
155
+ const style = {};
156
+ if (rowHeight) {
157
+ style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
158
+ }
159
+ return style;
160
+ },
161
+ computeVirtualStyles() {
69
162
  const $xeList = this;
70
163
  const props = $xeList;
71
164
  const reactData = $xeList.reactData;
72
165
  const { height, maxHeight } = props;
73
- const { customHeight, customMaxHeight } = reactData;
166
+ const { customHeight, customMaxHeight, headHeight, footHeight } = reactData;
74
167
  const style = {};
75
168
  if (height) {
76
- style.height = `${customHeight}px`;
169
+ style.height = toCssUnit(Math.max(20, customHeight - headHeight - footHeight));
77
170
  }
78
171
  else if (maxHeight) {
79
172
  style.height = 'auto';
80
- style.maxHeight = `${customMaxHeight}px`;
173
+ style.maxHeight = toCssUnit(Math.max(20, customMaxHeight - headHeight - footHeight));
81
174
  }
82
175
  return style;
83
176
  } }),
@@ -89,6 +182,14 @@ export default {
89
182
  const $xeList = this;
90
183
  $xeList.$emit(type, createEvent(evnt, { $list: $xeList }, params));
91
184
  },
185
+ emitCheckboxMode(value) {
186
+ const $xeList = this;
187
+ $xeList.$emit('update:checkRowKeys', value);
188
+ },
189
+ emitRadioMode(value) {
190
+ const $xeList = this;
191
+ $xeList.$emit('update:checkRowKey', value);
192
+ },
92
193
  callSlot(slotFunc, params, h) {
93
194
  const $xeList = this;
94
195
  const slots = $xeList.$scopedSlots;
@@ -102,6 +203,58 @@ export default {
102
203
  }
103
204
  return [];
104
205
  },
206
+ getRowId(row) {
207
+ const $xeList = this;
208
+ const keyField = $xeList.computeKeyField;
209
+ return getRowIdByField(row, keyField);
210
+ },
211
+ updateRadioModeValue() {
212
+ const $xeList = this;
213
+ const props = $xeList;
214
+ const reactData = $xeList.reactData;
215
+ const internalData = $xeList.internalData;
216
+ const { checkRowKey } = props;
217
+ const { fullKeyMaps } = internalData;
218
+ if (checkRowKey) {
219
+ const row = fullKeyMaps[checkRowKey];
220
+ reactData.selectRadioRow = row || null;
221
+ }
222
+ else {
223
+ reactData.selectRadioRow = null;
224
+ }
225
+ },
226
+ updateCheckboxModeValue() {
227
+ const $xeList = this;
228
+ const props = $xeList;
229
+ const internalData = $xeList.internalData;
230
+ const { checkRowKeys } = props;
231
+ const { fullKeyMaps } = internalData;
232
+ const keyField = $xeList.computeKeyField;
233
+ const selectMaps = {};
234
+ if (checkRowKeys && checkRowKeys.length) {
235
+ for (const rowKey of checkRowKeys) {
236
+ const row = fullKeyMaps[rowKey];
237
+ if (row) {
238
+ const rowid = getRowIdByField(row, keyField);
239
+ selectMaps[rowid] = row;
240
+ }
241
+ }
242
+ }
243
+ internalData.selectCheckboxMaps = selectMaps;
244
+ $xeList.updateCheckboxStatus();
245
+ },
246
+ cacheRowMap() {
247
+ const $xeList = this;
248
+ const internalData = $xeList.internalData;
249
+ const { fullData } = internalData;
250
+ const keyField = $xeList.computeKeyField;
251
+ const keyMaps = {};
252
+ fullData.forEach(row => {
253
+ const rowKey = getRowKeyByField(row, keyField);
254
+ keyMaps[rowKey] = row;
255
+ });
256
+ internalData.fullKeyMaps = keyMaps;
257
+ },
105
258
  /**
106
259
  * 加载数据
107
260
  * @param {Array} datas 数据
@@ -121,7 +274,10 @@ export default {
121
274
  internalData.fullData = fullData;
122
275
  // 如果gt为0,则总是启用
123
276
  reactData.scrollYLoad = !!sYOpts.enabled && sYOpts.gt > -1 && (sYOpts.gt === 0 || sYOpts.gt <= fullData.length);
277
+ $xeList.cacheRowMap();
124
278
  $xeList.handleData();
279
+ $xeList.updateRadioModeValue();
280
+ $xeList.updateCheckboxModeValue();
125
281
  return $xeList.computeScrollLoad().then(() => {
126
282
  $xeList.refreshScroll();
127
283
  });
@@ -135,6 +291,12 @@ export default {
135
291
  $xeList.clearScroll();
136
292
  return $xeList.loadData(datas);
137
293
  },
294
+ getFullData() {
295
+ const $xeList = this;
296
+ const internalData = $xeList.internalData;
297
+ const { fullData } = internalData;
298
+ return fullData;
299
+ },
138
300
  calcTableHeight(key) {
139
301
  const $xeList = this;
140
302
  const props = $xeList;
@@ -161,6 +323,10 @@ export default {
161
323
  updateHeight() {
162
324
  const $xeList = this;
163
325
  const reactData = $xeList.reactData;
326
+ const headEl = $xeList.$refs.refHeaderElem;
327
+ const footEl = $xeList.$refs.refFooterElem;
328
+ reactData.headHeight = headEl ? Math.floor(headEl.offsetHeight) : 0;
329
+ reactData.footHeight = footEl ? Math.floor(footEl.offsetHeight) : 0;
164
330
  reactData.customHeight = $xeList.calcTableHeight('height');
165
331
  reactData.customMaxHeight = $xeList.calcTableHeight('maxHeight');
166
332
  },
@@ -179,7 +345,7 @@ export default {
179
345
  const internalData = $xeList.internalData;
180
346
  const { scrollYLoad } = reactData;
181
347
  const { fullData, scrollYStore } = internalData;
182
- reactData.items = scrollYLoad ? fullData.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullData.slice(0);
348
+ reactData.rowList = scrollYLoad ? fullData.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullData.slice(0);
183
349
  return $xeList.$nextTick();
184
350
  },
185
351
  updateYData() {
@@ -191,23 +357,24 @@ export default {
191
357
  const $xeList = this;
192
358
  const reactData = $xeList.reactData;
193
359
  const internalData = $xeList.internalData;
360
+ const browseObj = $xeList.browseObj;
194
361
  return $xeList.$nextTick().then(() => {
195
362
  const { scrollYLoad } = reactData;
196
363
  const { scrollYStore } = internalData;
197
364
  const virtualBodyElem = $xeList.$refs.refVirtualBody;
198
365
  const sYOpts = $xeList.computeSYOpts;
199
366
  let rowHeight = 0;
200
- let firstItemElem;
367
+ let firstRowElem;
201
368
  if (virtualBodyElem) {
202
369
  if (sYOpts.sItem) {
203
- firstItemElem = virtualBodyElem.querySelector(sYOpts.sItem);
370
+ firstRowElem = virtualBodyElem.querySelector(sYOpts.sItem);
204
371
  }
205
- if (!firstItemElem) {
206
- firstItemElem = virtualBodyElem.children[0];
372
+ if (!firstRowElem) {
373
+ firstRowElem = virtualBodyElem.children[0];
207
374
  }
208
375
  }
209
- if (firstItemElem) {
210
- rowHeight = firstItemElem.offsetHeight;
376
+ if (firstRowElem) {
377
+ rowHeight = firstRowElem.offsetHeight;
211
378
  }
212
379
  rowHeight = Math.max(12, rowHeight);
213
380
  scrollYStore.rowHeight = rowHeight;
@@ -333,30 +500,1041 @@ export default {
333
500
  }
334
501
  $xeList.dispatchEvent('scroll', { scrollLeft, scrollTop, isX, isY }, evnt);
335
502
  },
503
+ getRowKey(row) {
504
+ const $xeList = this;
505
+ const keyField = $xeList.computeKeyField;
506
+ return getRowKeyByField(row, keyField);
507
+ },
508
+ eqRowKey,
509
+ eqRow(row1, row2) {
510
+ const $xeList = this;
511
+ if (row1 && row2) {
512
+ if (row1 === row2) {
513
+ return true;
514
+ }
515
+ return eqRowKey($xeList.getRowId(row1), $xeList.getRowId(row2));
516
+ }
517
+ return false;
518
+ },
519
+ eqRowByKey(row, rowKey) {
520
+ const $xeList = this;
521
+ return row && eqRowKey($xeList.getRowKey(row), rowKey);
522
+ },
523
+ findRow(list, row) {
524
+ const $xeList = this;
525
+ return row ? XEUtils.find(list, obj => $xeList.eqRow(obj, row)) : null;
526
+ },
527
+ findRowByKey(list, rowId) {
528
+ const $xeList = this;
529
+ const keyField = $xeList.computeKeyField;
530
+ return XEUtils.find(list, obj => eqRowKey(getRowIdByField(obj, keyField), rowId));
531
+ },
532
+ findRowIndexOf(list, row) {
533
+ const $xeList = this;
534
+ return row ? XEUtils.findIndexOf(list, obj => $xeList.eqRow(obj, row)) : -1;
535
+ },
536
+ findRowIndexOfByKey(list, rowKey) {
537
+ const $xeList = this;
538
+ const keyField = $xeList.computeKeyField;
539
+ return XEUtils.findIndexOf(list, obj => eqRowKey(getRowIdByField(obj, keyField), rowKey));
540
+ },
541
+ isCheckedByRadioRowKey(rowKey) {
542
+ const $xeList = this;
543
+ const reactData = $xeList.reactData;
544
+ const { selectRadioRow } = reactData;
545
+ return $xeList.getRowKey(selectRadioRow) === rowKey;
546
+ },
547
+ isCheckedByRadioRow(row) {
548
+ const $xeList = this;
549
+ return $xeList.isCheckedByRadioRowKey($xeList.getRowKey(row));
550
+ },
551
+ isCheckedByCheckboxRowKey(rowid) {
552
+ const $xeList = this;
553
+ const reactData = $xeList.reactData;
554
+ const internalData = $xeList.internalData;
555
+ const { updateCheckboxFlag } = reactData;
556
+ const { selectCheckboxMaps } = internalData;
557
+ return !!(updateCheckboxFlag && selectCheckboxMaps[rowid]);
558
+ },
559
+ isCheckedByCheckboxRow(row) {
560
+ const $xeList = this;
561
+ return $xeList.isCheckedByCheckboxRowKey($xeList.getRowKey(row));
562
+ },
563
+ setCurrentRow(row) {
564
+ const $xeList = this;
565
+ const reactData = $xeList.reactData;
566
+ const internalData = $xeList.internalData;
567
+ internalData.currentRow = row;
568
+ reactData.currRowFlag++;
569
+ return $xeList.$nextTick();
570
+ },
571
+ setCurrentRowByKey(rowKey) {
572
+ const $xeList = this;
573
+ const reactData = $xeList.reactData;
574
+ const internalData = $xeList.internalData;
575
+ const { fullData } = internalData;
576
+ internalData.currentRow = $xeList.findRowByKey(fullData, rowKey);
577
+ reactData.currRowFlag++;
578
+ return $xeList.$nextTick();
579
+ },
580
+ getCurrentRow() {
581
+ const $xeList = this;
582
+ const internalData = $xeList.internalData;
583
+ const { currentRow } = internalData;
584
+ return currentRow;
585
+ },
586
+ getCurrentRowKey() {
587
+ const $xeList = this;
588
+ const internalData = $xeList.internalData;
589
+ const { currentRow } = internalData;
590
+ return currentRow ? $xeList.getRowKey(currentRow) : null;
591
+ },
592
+ clearCurrentRow() {
593
+ const $xeList = this;
594
+ const reactData = $xeList.reactData;
595
+ const internalData = $xeList.internalData;
596
+ internalData.currentRow = null;
597
+ reactData.currRowFlag++;
598
+ return $xeList.$nextTick();
599
+ },
600
+ setRadioRow(row) {
601
+ const $xeList = this;
602
+ const reactData = $xeList.reactData;
603
+ reactData.selectRadioRow = row;
604
+ const value = $xeList.getRowKey(row);
605
+ $xeList.emitRadioMode(value);
606
+ return $xeList.$nextTick();
607
+ },
608
+ setRadioRowByKey(rowKey) {
609
+ const $xeList = this;
610
+ const reactData = $xeList.reactData;
611
+ const internalData = $xeList.internalData;
612
+ const { fullData } = internalData;
613
+ reactData.selectRadioRow = $xeList.findRowByKey(fullData, rowKey);
614
+ const value = rowKey;
615
+ $xeList.emitRadioMode(value);
616
+ return $xeList.$nextTick();
617
+ },
618
+ getRadioRow() {
619
+ const $xeList = this;
620
+ const reactData = $xeList.reactData;
621
+ const { selectRadioRow } = reactData;
622
+ return selectRadioRow;
623
+ },
624
+ getRadioRowKey() {
625
+ const $xeList = this;
626
+ const reactData = $xeList.reactData;
627
+ const { selectRadioRow } = reactData;
628
+ return selectRadioRow ? $xeList.getRowKey(selectRadioRow) : null;
629
+ },
630
+ clearRadioRow() {
631
+ const $xeList = this;
632
+ const reactData = $xeList.reactData;
633
+ const value = null;
634
+ reactData.selectRadioRow = value;
635
+ $xeList.emitRadioMode(value);
636
+ return $xeList.$nextTick();
637
+ },
638
+ setCheckboxRow(row, checked) {
639
+ const $xeList = this;
640
+ const internalData = $xeList.internalData;
641
+ const { selectCheckboxMaps } = internalData;
642
+ const keyField = $xeList.computeKeyField;
643
+ const rowList = row ? (XEUtils.isArray(row) ? row : [row]) : [];
644
+ rowList.forEach(checked
645
+ ? (obj) => {
646
+ const rowid = getRowIdByField(obj, keyField);
647
+ if (!selectCheckboxMaps[rowid]) {
648
+ selectCheckboxMaps[rowid] = obj;
649
+ }
650
+ }
651
+ : (obj) => {
652
+ const rowid = getRowIdByField(obj, keyField);
653
+ if (selectCheckboxMaps[rowid]) {
654
+ delete selectCheckboxMaps[rowid];
655
+ }
656
+ });
657
+ const value = $xeList.getCheckboxRowKeys();
658
+ $xeList.emitCheckboxMode(value);
659
+ return $xeList.updateCheckboxStatus();
660
+ },
661
+ setCheckboxRowByKey(rowKey, checked) {
662
+ const $xeList = this;
663
+ const internalData = $xeList.internalData;
664
+ const { selectCheckboxMaps, fullKeyMaps } = internalData;
665
+ const keyField = $xeList.computeKeyField;
666
+ const rowKeys = rowKey ? (XEUtils.isArray(rowKey) ? rowKey : [rowKey]) : [];
667
+ rowKeys.forEach(checked
668
+ ? (key) => {
669
+ const row = fullKeyMaps[key || ''];
670
+ if (row) {
671
+ const rowid = getRowIdByField(row, keyField);
672
+ if (row && !selectCheckboxMaps[rowid]) {
673
+ selectCheckboxMaps[rowid] = row;
674
+ }
675
+ }
676
+ }
677
+ : (key) => {
678
+ const row = fullKeyMaps[key || ''];
679
+ if (row) {
680
+ const rowid = getRowIdByField(row, keyField);
681
+ if (selectCheckboxMaps[rowid]) {
682
+ delete selectCheckboxMaps[rowid];
683
+ }
684
+ }
685
+ });
686
+ const value = $xeList.getCheckboxRowKeys();
687
+ $xeList.emitCheckboxMode(value);
688
+ return $xeList.updateCheckboxStatus();
689
+ },
690
+ getCheckboxRows() {
691
+ const $xeList = this;
692
+ const reactData = $xeList.reactData;
693
+ const internalData = $xeList.internalData;
694
+ const { updateCheckboxFlag } = reactData;
695
+ const { selectCheckboxMaps } = internalData;
696
+ const rowList = [];
697
+ if (updateCheckboxFlag) {
698
+ XEUtils.each(selectCheckboxMaps, row => {
699
+ if (row) {
700
+ rowList.push(row);
701
+ }
702
+ });
703
+ }
704
+ return rowList;
705
+ },
706
+ getCheckboxRowKeys() {
707
+ const $xeList = this;
708
+ const reactData = $xeList.reactData;
709
+ const internalData = $xeList.internalData;
710
+ const { updateCheckboxFlag } = reactData;
711
+ const { selectCheckboxMaps } = internalData;
712
+ const keyField = $xeList.computeKeyField;
713
+ const rowKeys = [];
714
+ if (updateCheckboxFlag) {
715
+ XEUtils.each(selectCheckboxMaps, row => {
716
+ if (row) {
717
+ const rowKey = getRowKeyByField(row, keyField);
718
+ rowKeys.push(rowKey);
719
+ }
720
+ });
721
+ }
722
+ return rowKeys;
723
+ },
724
+ clearCheckboxRow() {
725
+ const $xeList = this;
726
+ const reactData = $xeList.reactData;
727
+ const internalData = $xeList.internalData;
728
+ internalData.selectCheckboxMaps = {};
729
+ reactData.updateCheckboxFlag++;
730
+ reactData.isAllChecked = false;
731
+ reactData.isAllIndeterminate = false;
732
+ const value = [];
733
+ $xeList.emitCheckboxMode(value);
734
+ return $xeList.$nextTick();
735
+ },
736
+ setAllCheckboxRow(checked) {
737
+ const $xeList = this;
738
+ const internalData = $xeList.internalData;
739
+ const { fullData, selectCheckboxMaps } = internalData;
740
+ const keyField = $xeList.computeKeyField;
741
+ if (checked) {
742
+ const value = [];
743
+ for (const row of fullData) {
744
+ const rowKey = getRowKeyByField(row, keyField);
745
+ const rowid = getRowIdByField(row, keyField);
746
+ selectCheckboxMaps[rowid] = row;
747
+ value.push(rowKey);
748
+ }
749
+ $xeList.emitCheckboxMode(value);
750
+ return $xeList.updateCheckboxStatus();
751
+ }
752
+ return $xeList.clearCheckboxRow();
753
+ },
754
+ updateCheckboxStatus() {
755
+ const $xeList = this;
756
+ const reactData = $xeList.reactData;
757
+ const internalData = $xeList.internalData;
758
+ const { selectCheckboxMaps, fullData } = internalData;
759
+ const keyField = $xeList.computeKeyField;
760
+ const checkboxOpts = $xeList.computeCheckboxOpts;
761
+ const { checkMethod } = checkboxOpts;
762
+ let hasChecked = false;
763
+ let hasUnchecked = false;
764
+ if (checkMethod) {
765
+ for (const row of fullData) {
766
+ if (checkMethod({ row, $list: $xeList })) {
767
+ const rowid = getRowIdByField(row, keyField);
768
+ if (selectCheckboxMaps[rowid]) {
769
+ hasChecked = true;
770
+ }
771
+ else {
772
+ hasUnchecked = true;
773
+ if (hasChecked) {
774
+ break;
775
+ }
776
+ }
777
+ }
778
+ }
779
+ }
780
+ else {
781
+ for (const row of fullData) {
782
+ const rowid = getRowIdByField(row, keyField);
783
+ if (selectCheckboxMaps[rowid]) {
784
+ hasChecked = true;
785
+ }
786
+ else {
787
+ hasUnchecked = true;
788
+ if (hasChecked) {
789
+ break;
790
+ }
791
+ }
792
+ }
793
+ }
794
+ reactData.isAllChecked = hasChecked && !hasUnchecked;
795
+ reactData.isAllIndeterminate = hasChecked && hasUnchecked;
796
+ reactData.updateCheckboxFlag++;
797
+ return $xeList.$nextTick();
798
+ },
799
+ changeCheckboxAllEvent(evnt) {
800
+ const $xeList = this;
801
+ const reactData = $xeList.reactData;
802
+ const { isAllChecked } = reactData;
803
+ const isChecked = !isAllChecked;
804
+ if (isChecked) {
805
+ $xeList.setAllCheckboxRow(true);
806
+ }
807
+ else {
808
+ $xeList.clearCheckboxRow();
809
+ }
810
+ $xeList.dispatchEvent('checkbox-all', { checked: isChecked }, evnt);
811
+ },
812
+ changeCheckboxEvent(evnt, row) {
813
+ const $xeList = this;
814
+ const reactData = $xeList.reactData;
815
+ const internalData = $xeList.internalData;
816
+ evnt.preventDefault();
817
+ evnt.stopPropagation();
818
+ const { selectCheckboxMaps } = internalData;
819
+ const checkboxOpts = $xeList.computeCheckboxOpts;
820
+ const { checkMethod } = checkboxOpts;
821
+ const rowid = $xeList.getRowKey(row);
822
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
823
+ if (isDisabled) {
824
+ return;
825
+ }
826
+ let isChecked = false;
827
+ if (selectCheckboxMaps[rowid]) {
828
+ delete selectCheckboxMaps[rowid];
829
+ }
830
+ else {
831
+ isChecked = true;
832
+ selectCheckboxMaps[rowid] = row;
833
+ }
834
+ reactData.updateCheckboxFlag++;
835
+ $xeList.updateCheckboxStatus();
836
+ const rowids = XEUtils.keys(selectCheckboxMaps);
837
+ const value = rowids.map(deModelValue);
838
+ $xeList.emitCheckboxMode(value);
839
+ $xeList.dispatchEvent('checkbox-change', { row, value, checked: isChecked }, evnt);
840
+ },
841
+ changeCurrentEvent(evnt, row) {
842
+ const $xeList = this;
843
+ const reactData = $xeList.reactData;
844
+ const internalData = $xeList.internalData;
845
+ evnt.preventDefault();
846
+ const rowOpts = $xeList.computeRowOpts;
847
+ const { currentMethod } = rowOpts;
848
+ let isDisabled = false;
849
+ if (currentMethod) {
850
+ isDisabled = !currentMethod({ row });
851
+ }
852
+ if (isDisabled) {
853
+ return;
854
+ }
855
+ const isChecked = true;
856
+ internalData.currentRow = row;
857
+ reactData.currRowFlag++;
858
+ $xeList.dispatchEvent('current-change', { row, checked: isChecked }, evnt);
859
+ },
860
+ changeRadioEvent(evnt, row) {
861
+ const $xeList = this;
862
+ const reactData = $xeList.reactData;
863
+ evnt.preventDefault();
864
+ evnt.stopPropagation();
865
+ const { selectRadioRow } = reactData;
866
+ const radioOpts = $xeList.computeRadioOpts;
867
+ const { strict, checkMethod } = radioOpts;
868
+ const rowKey = $xeList.getRowKey(row);
869
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
870
+ if (isDisabled) {
871
+ return;
872
+ }
873
+ const value = rowKey;
874
+ let isChecked = true;
875
+ if (strict) {
876
+ if (selectRadioRow && rowKey === $xeList.getRowKey(selectRadioRow)) {
877
+ isChecked = false;
878
+ reactData.selectRadioRow = null;
879
+ }
880
+ else {
881
+ reactData.selectRadioRow = row;
882
+ }
883
+ }
884
+ else {
885
+ reactData.selectRadioRow = row;
886
+ }
887
+ $xeList.emitRadioMode(value);
888
+ $xeList.dispatchEvent('radio-change', { row, value, checked: isChecked }, evnt);
889
+ },
890
+ clearRowDropOrigin() {
891
+ const $xeList = this;
892
+ const el = $xeList.$refs.refElem;
893
+ if (el) {
894
+ const clss = 'row--drag-origin';
895
+ XEUtils.arrayEach(el.querySelectorAll(`.${clss}`), (elem) => {
896
+ elem.draggable = false;
897
+ removeClass(elem, clss);
898
+ });
899
+ }
900
+ },
901
+ updateRowDropOrigin(row) {
902
+ const $xeList = this;
903
+ const sYOpts = $xeList.computeSYOpts;
904
+ const { sItem } = sYOpts;
905
+ const el = $xeList.$refs.refElem;
906
+ if (el) {
907
+ const clss = 'row--drag-origin';
908
+ const rowid = $xeList.getRowId(row);
909
+ XEUtils.arrayEach(el.querySelectorAll(`.vxe-list--row[rowid="${rowid}"]` + (sItem ? `${sItem}[rowid="${rowid}"]` : '')), (elem) => {
910
+ addClass(elem, clss);
911
+ });
912
+ }
913
+ },
914
+ updateRowDropTipContent(rowEl) {
915
+ const $xeList = this;
916
+ const reactData = $xeList.reactData;
917
+ const { dragRow } = reactData;
918
+ const dragOpts = $xeList.computeDragOpts;
919
+ const { tooltipMethod } = dragOpts;
920
+ const rTooltipMethod = tooltipMethod;
921
+ let tipContent = '';
922
+ if (rTooltipMethod) {
923
+ const rtParams = {
924
+ $list: $xeList,
925
+ row: dragRow
926
+ };
927
+ tipContent = `${rTooltipMethod(rtParams) || ''}`;
928
+ }
929
+ else {
930
+ tipContent = getI18n('vxe.list.dragTip', [rowEl.textContent || '']);
931
+ }
932
+ reactData.dragTipText = tipContent;
933
+ },
934
+ hideDropTip() {
935
+ const $xeList = this;
936
+ const rdTipEl = $xeList.$refs.refDragTipElem;
937
+ const rdLineEl = $xeList.$refs.refDragRowLineElem;
938
+ if (rdTipEl) {
939
+ rdTipEl.style.display = '';
940
+ }
941
+ if (rdLineEl) {
942
+ rdLineEl.style.display = '';
943
+ }
944
+ },
945
+ clearCrossListDragStatus() {
946
+ const $xeList = this;
947
+ const crossListDragRowInfo = getCrossListDragRowInfo($xeList);
948
+ // crossListDragRowObj = null
949
+ crossListDragRowInfo.row = null;
950
+ },
951
+ clearDragStatus() {
952
+ const $xeList = this;
953
+ const reactData = $xeList.reactData;
954
+ const { dragRow } = reactData;
955
+ if (dragRow) {
956
+ $xeList.hideDropTip();
957
+ $xeList.clearRowDropOrigin();
958
+ $xeList.clearCrossListDragStatus();
959
+ reactData.dragRow = null;
960
+ }
961
+ },
962
+ handleRowDragMousedownEvent(evnt, params) {
963
+ const $xeList = this;
964
+ const reactData = $xeList.reactData;
965
+ evnt.stopPropagation();
966
+ const { row } = params;
967
+ const dragConfig = $xeList.computeDragOpts;
968
+ const { trigger, dragStartMethod } = dragConfig;
969
+ const dragEl = evnt.currentTarget;
970
+ const rowEl = trigger === 'row' ? dragEl : dragEl.parentElement.parentElement;
971
+ $xeList.clearRowDropOrigin();
972
+ if (dragStartMethod && !dragStartMethod(params)) {
973
+ rowEl.draggable = false;
974
+ reactData.dragRow = null;
975
+ $xeList.hideDropTip();
976
+ return;
977
+ }
978
+ const dragstartEventParams = {
979
+ row
980
+ };
981
+ reactData.dragRow = row;
982
+ rowEl.draggable = true;
983
+ $xeList.updateRowDropOrigin(row);
984
+ $xeList.updateRowDropTipContent(rowEl);
985
+ $xeList.dispatchEvent('row-dragstart', dragstartEventParams, evnt);
986
+ },
987
+ handleRowDragMouseupEvent() {
988
+ const $xeList = this;
989
+ $xeList.clearDragStatus();
990
+ },
991
+ showDropTip(evnt, rowEl, showLine, dragPos) {
992
+ const $xeList = this;
993
+ const wrapperEl = $xeList.$refs.refElem;
994
+ if (!wrapperEl) {
995
+ return;
996
+ }
997
+ const wrapperRect = wrapperEl.getBoundingClientRect();
998
+ const wrapperHeight = wrapperEl.clientHeight;
999
+ if (rowEl) {
1000
+ const rdLineEl = $xeList.$refs.refDragRowLineElem;
1001
+ if (rdLineEl) {
1002
+ if (showLine) {
1003
+ const trRect = rowEl.getBoundingClientRect();
1004
+ let rowHeight = rowEl.clientHeight;
1005
+ const offsetTop = Math.max(1, trRect.y - wrapperRect.y);
1006
+ if (offsetTop + rowHeight > wrapperHeight) {
1007
+ rowHeight = wrapperHeight - offsetTop;
1008
+ }
1009
+ rdLineEl.style.display = 'block';
1010
+ rdLineEl.style.top = `${offsetTop}px`;
1011
+ rdLineEl.style.height = `${rowHeight}px`;
1012
+ rdLineEl.setAttribute('drag-pos', dragPos);
1013
+ }
1014
+ else {
1015
+ rdLineEl.style.display = '';
1016
+ }
1017
+ }
1018
+ }
1019
+ const rdTipEl = $xeList.$refs.refDragTipElem;
1020
+ if (rdTipEl) {
1021
+ rdTipEl.style.display = 'block';
1022
+ rdTipEl.style.top = `${Math.min(wrapperEl.clientHeight - wrapperEl.scrollTop - rdTipEl.clientHeight, evnt.clientY - wrapperRect.y)}px`;
1023
+ rdTipEl.style.left = `${Math.min(wrapperEl.clientWidth - wrapperEl.scrollLeft - rdTipEl.clientWidth - 1, evnt.clientX - wrapperRect.x)}px`;
1024
+ rdTipEl.setAttribute('drag-status', showLine ? 'normal' : 'disabled');
1025
+ }
1026
+ },
1027
+ clearRowDragData() {
1028
+ const $xeList = this;
1029
+ const reactData = $xeList.reactData;
1030
+ const wrapperEl = $xeList.$refs.refElem;
1031
+ const dtClss = ['.vxe-list--row'];
1032
+ $xeList.hideDropTip();
1033
+ $xeList.clearRowDropOrigin();
1034
+ clearRowAnimate(wrapperEl, dtClss);
1035
+ reactData.dragRow = null;
1036
+ },
1037
+ handleRowDragSwapEvent(evnt, dragRow, prevDragRow, prevDragPos) {
1038
+ const $xeList = this;
1039
+ const reactData = $xeList.reactData;
1040
+ const internalData = $xeList.internalData;
1041
+ const { fullData } = internalData;
1042
+ const dragConfig = $xeList.computeDragOpts;
1043
+ const { animation, dragEndMethod } = dragConfig;
1044
+ const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
1045
+ const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
1046
+ const el = $xeList.$refs.refElem;
1047
+ const errRest = {
1048
+ status: false
1049
+ };
1050
+ if (!(el && prevDragRow && dragRow)) {
1051
+ return Promise.resolve(errRest);
1052
+ }
1053
+ // 判断是否有拖动
1054
+ if (prevDragRow !== dragRow) {
1055
+ const dragParams = {
1056
+ oldRow: dragRow,
1057
+ newRow: prevDragRow,
1058
+ dragRow,
1059
+ dragPos: prevDragPos,
1060
+ offsetIndex: dragOffsetIndex
1061
+ };
1062
+ const dragRowid = $xeList.getRowId(dragRow);
1063
+ const _dragRowIndex = $xeList.findRowIndexOfByKey(fullData, dragRowid);
1064
+ const newRowid = $xeList.getRowKey(prevDragRow);
1065
+ let dragRowHeight = 0;
1066
+ let dragOffsetTop = -1;
1067
+ if (animation) {
1068
+ const prevRowEl = el.querySelector(`.vxe-list--row[rowid="${newRowid}"]`);
1069
+ const oldRowEl = el.querySelector(`.vxe-list--row[rowid="${dragRowid}"]`);
1070
+ const targetRowEl = prevRowEl || oldRowEl;
1071
+ if (targetRowEl) {
1072
+ dragRowHeight = targetRowEl.offsetHeight;
1073
+ }
1074
+ if (oldRowEl) {
1075
+ dragOffsetTop = oldRowEl.offsetTop;
1076
+ }
1077
+ }
1078
+ let oafIndex = -1;
1079
+ let nafIndex = -1;
1080
+ return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
1081
+ if (!status) {
1082
+ return errRest;
1083
+ }
1084
+ // 移出
1085
+ oafIndex = $xeList.findRowIndexOf(fullData, dragRow);
1086
+ fullData.splice(oafIndex, 1);
1087
+ // 插入
1088
+ const pafIndex = $xeList.findRowIndexOf(fullData, prevDragRow);
1089
+ nafIndex = pafIndex + dragOffsetIndex;
1090
+ fullData.splice(nafIndex, 0, dragRow);
1091
+ $xeList.handleData();
1092
+ if (reactData.scrollYLoad) {
1093
+ $xeList.updateYSpace();
1094
+ }
1095
+ if (evnt) {
1096
+ const dragendEventParams = {
1097
+ oldRow: dragRow,
1098
+ newRow: prevDragRow,
1099
+ dragRow,
1100
+ dragPos: prevDragPos,
1101
+ offsetIndex: dragOffsetIndex,
1102
+ _index: {
1103
+ newIndex: nafIndex,
1104
+ oldIndex: oafIndex
1105
+ }
1106
+ };
1107
+ $xeList.dispatchEvent('row-dragend', dragendEventParams, evnt);
1108
+ }
1109
+ return $xeList.$nextTick().then(() => {
1110
+ if (animation) {
1111
+ const { rowList } = reactData;
1112
+ const { fullData } = internalData;
1113
+ const _newRowIndex = $xeList.findRowIndexOfByKey(fullData, dragRowid);
1114
+ const firstRow = fullData[0];
1115
+ const _firstRowIndex = $xeList.findRowIndexOf(fullData, firstRow);
1116
+ const wrapperEl = el;
1117
+ if (_firstRowIndex > -1) {
1118
+ const _lastRowIndex = _firstRowIndex + fullData.length;
1119
+ let rsIndex = -1;
1120
+ let reIndex = -1;
1121
+ let offsetRate = 1;
1122
+ if (_dragRowIndex < _firstRowIndex) {
1123
+ // 从上往下虚拟拖拽
1124
+ rsIndex = 0;
1125
+ reIndex = _newRowIndex - _firstRowIndex;
1126
+ }
1127
+ else if (_dragRowIndex > _lastRowIndex) {
1128
+ // 从下往上虚拟拖拽
1129
+ const $newRowIndex = $xeList.findRowIndexOfByKey(rowList, dragRowid);
1130
+ rsIndex = $newRowIndex + 1;
1131
+ reIndex = fullData.length;
1132
+ offsetRate = -1;
1133
+ }
1134
+ else {
1135
+ if (_newRowIndex > _dragRowIndex) {
1136
+ // 从上往下拖拽
1137
+ rsIndex = _dragRowIndex - _firstRowIndex;
1138
+ reIndex = rsIndex + _newRowIndex - _dragRowIndex;
1139
+ }
1140
+ else {
1141
+ // 从下往上拖拽
1142
+ rsIndex = _newRowIndex - _firstRowIndex;
1143
+ reIndex = rsIndex + _dragRowIndex - _newRowIndex + 1;
1144
+ offsetRate = -1;
1145
+ }
1146
+ }
1147
+ const dragRangeList = fullData.slice(rsIndex, reIndex);
1148
+ if (dragRangeList.length) {
1149
+ const dtClss = [];
1150
+ dragRangeList.forEach(obj => {
1151
+ const rowid = $xeList.getRowId(obj);
1152
+ dtClss.push(`.vxe-list--row[rowid="${rowid}"]`);
1153
+ });
1154
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
1155
+ moveRowAnimateToTb(dtTrList, offsetRate * dragRowHeight);
1156
+ }
1157
+ }
1158
+ const drClss = [`.vxe-list--row[rowid="${dragRowid}"]`];
1159
+ const newDtTrList = wrapperEl.querySelectorAll(drClss.join(','));
1160
+ const newTrEl = newDtTrList[0];
1161
+ if (dragOffsetTop > -1 && newTrEl) {
1162
+ moveRowAnimateToTb(newDtTrList, dragOffsetTop - newTrEl.offsetTop);
1163
+ }
1164
+ }
1165
+ $xeList.recalculate();
1166
+ }).then(() => {
1167
+ return {
1168
+ status: true
1169
+ };
1170
+ });
1171
+ }).catch(() => {
1172
+ return errRest;
1173
+ }).then((rest) => {
1174
+ $xeList.clearRowDragData();
1175
+ $xeList.clearCrossListDragStatus();
1176
+ return rest;
1177
+ });
1178
+ }
1179
+ $xeList.clearRowDragData();
1180
+ $xeList.clearCrossListDragStatus();
1181
+ return Promise.resolve(errRest);
1182
+ },
1183
+ handleRowDragDragstartEvent(evnt) {
1184
+ if (evnt.dataTransfer) {
1185
+ evnt.dataTransfer.setDragImage(getTpImg(), 0, 0);
1186
+ }
1187
+ },
1188
+ handleRowDragDragendEvent(evnt) {
1189
+ const $xeList = this;
1190
+ const reactData = $xeList.reactData;
1191
+ const internalData = $xeList.internalData;
1192
+ const { dragRow } = reactData;
1193
+ const { prevDragRow, prevDragPos } = internalData;
1194
+ $xeList.handleRowDragSwapEvent(evnt, dragRow, prevDragRow, prevDragPos);
1195
+ },
1196
+ handleRowDragDragoverEvent(evnt) {
1197
+ const $xeList = this;
1198
+ const reactData = $xeList.reactData;
1199
+ const internalData = $xeList.internalData;
1200
+ const { dragRow } = reactData;
1201
+ const { fullData } = internalData;
1202
+ if (!dragRow) {
1203
+ evnt.preventDefault();
1204
+ }
1205
+ const rowEl = evnt.currentTarget;
1206
+ const rowid = rowEl.getAttribute('rowid') || '';
1207
+ const row = $xeList.findRowByKey(fullData, rowid);
1208
+ if (row) {
1209
+ evnt.preventDefault();
1210
+ const offsetY = evnt.clientY - rowEl.getBoundingClientRect().y;
1211
+ const dragPos = offsetY < rowEl.clientHeight / 2 ? 'top' : 'bottom';
1212
+ internalData.prevDragRow = row;
1213
+ internalData.prevDragPos = dragPos;
1214
+ if ((dragRow && $xeList.getRowId(dragRow) === rowid)) {
1215
+ $xeList.showDropTip(evnt, rowEl, false, dragPos);
1216
+ return;
1217
+ }
1218
+ const dragOffsetIndex = dragPos === 'bottom' ? 1 : 0;
1219
+ const offsetIndex = dragOffsetIndex;
1220
+ const dragoverEventParams = {
1221
+ oldRow: dragRow,
1222
+ targetRow: row,
1223
+ dragPos,
1224
+ dragRow,
1225
+ offsetIndex
1226
+ };
1227
+ $xeList.showDropTip(evnt, rowEl, true, dragPos);
1228
+ $xeList.dispatchEvent('row-dragover', dragoverEventParams, evnt);
1229
+ }
1230
+ },
1231
+ handleRowMousedownEvent(evnt, row) {
1232
+ const $xeList = this;
1233
+ const dragConfig = $xeList.computeDragOpts;
1234
+ const isDrag = $xeList.computeIsDrag;
1235
+ const { trigger, disabledMethod } = dragConfig;
1236
+ let isRowDrag = false;
1237
+ if (isDrag) {
1238
+ isRowDrag = trigger === 'row';
1239
+ }
1240
+ const params = { row, $list: $xeList };
1241
+ if (isRowDrag && !(disabledMethod && disabledMethod(params))) {
1242
+ $xeList.handleRowDragMousedownEvent(evnt, params);
1243
+ }
1244
+ },
1245
+ handleRowClickEvent(evnt, row) {
1246
+ const $xeList = this;
1247
+ const reactData = $xeList.reactData;
1248
+ const internalData = $xeList.internalData;
1249
+ const { currentRow } = internalData;
1250
+ const rowOpts = $xeList.computeRowOpts;
1251
+ const { isCurrent } = rowOpts;
1252
+ let triggerCurrent = false;
1253
+ if (isCurrent) {
1254
+ triggerCurrent = true;
1255
+ $xeList.changeCurrentEvent(evnt, row);
1256
+ }
1257
+ else if (currentRow) {
1258
+ internalData.currentRow = null;
1259
+ reactData.currRowFlag++;
1260
+ }
1261
+ $xeList.dispatchEvent('row-click', { row, triggerCurrent }, evnt);
1262
+ },
1263
+ handleRowDblclickEvent(evnt, row) {
1264
+ const $xeList = this;
1265
+ $xeList.dispatchEvent('row-dblclick', { row }, evnt);
1266
+ },
336
1267
  //
337
1268
  // Render
338
1269
  //
1270
+ renderDragTip(h) {
1271
+ const $xeList = this;
1272
+ const reactData = $xeList.reactData;
1273
+ const { dragRow, dragTipText } = reactData;
1274
+ const dragOpts = $xeList.computeDragOpts;
1275
+ const isDrag = $xeList.computeIsDrag;
1276
+ const dRow = dragRow;
1277
+ if (isDrag) {
1278
+ return h('div', {
1279
+ class: 'vxe-list--drag-wrapper'
1280
+ }, [
1281
+ h('div', {
1282
+ ref: 'refDragRowLineElem',
1283
+ class: ['vxe-list--drag-row-line', {
1284
+ 'is--guides': dragOpts.showGuidesStatus
1285
+ }]
1286
+ }),
1287
+ dRow && dragOpts.showDragTip
1288
+ ? h('div', {
1289
+ ref: 'refDragTipElem',
1290
+ class: 'vxe-list--drag-sort-tip'
1291
+ }, [
1292
+ h('div', {
1293
+ class: 'vxe-list--drag-sort-tip-wrapper'
1294
+ }, [
1295
+ h('div', {
1296
+ class: 'vxe-list--drag-sort-tip-status'
1297
+ }, [
1298
+ h('span', {
1299
+ class: ['vxe-list--drag-sort-tip-normal-status', getIcon().LIST_DRAG_STATUS_NODE]
1300
+ }),
1301
+ h('span', {
1302
+ class: ['vxe-list--drag-sort-tip-disabled-status', getIcon().LIST_DRAG_DISABLED]
1303
+ })
1304
+ ]),
1305
+ h('div', {
1306
+ class: 'vxe-list--drag-sort-tip-content'
1307
+ }, dragTipText)
1308
+ ])
1309
+ ])
1310
+ : renderEmptyElement($xeList)
1311
+ ]);
1312
+ }
1313
+ return renderEmptyElement($xeList);
1314
+ },
1315
+ renderRadio(h, row, rowid, isChecked) {
1316
+ const $xeList = this;
1317
+ const props = $xeList;
1318
+ const { showRadio } = props;
1319
+ const radioOpts = $xeList.computeRadioOpts;
1320
+ const { showIcon, checkMethod, visibleMethod } = radioOpts;
1321
+ const isVisible = !visibleMethod || visibleMethod({ $list: $xeList, row });
1322
+ if (showRadio && showIcon && isVisible) {
1323
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1324
+ return h('div', {
1325
+ key: 'ct2',
1326
+ class: ['vxe-list--radio-option', {
1327
+ 'is--checked': isChecked,
1328
+ 'is--disabled': isDisabled
1329
+ }],
1330
+ on: {
1331
+ click(evnt) {
1332
+ if (!isDisabled) {
1333
+ $xeList.changeRadioEvent(evnt, row);
1334
+ }
1335
+ }
1336
+ }
1337
+ }, [
1338
+ h('span', {
1339
+ class: ['vxe-radio--icon', isChecked ? getIcon().RADIO_CHECKED : getIcon().RADIO_UNCHECKED]
1340
+ })
1341
+ ]);
1342
+ }
1343
+ return renderEmptyElement($xeList);
1344
+ },
1345
+ renderCheckbox(h, row, rowid, isChecked) {
1346
+ const $xeList = this;
1347
+ const props = $xeList;
1348
+ const { showCheckbox } = props;
1349
+ const checkboxOpts = $xeList.computeCheckboxOpts;
1350
+ const { showIcon, checkMethod, visibleMethod } = checkboxOpts;
1351
+ const isVisible = !visibleMethod || visibleMethod({ $list: $xeList, row });
1352
+ if (showCheckbox && showIcon && isVisible) {
1353
+ const isDisabled = checkMethod ? !checkMethod({ $list: $xeList, row }) : false;
1354
+ return h('div', {
1355
+ key: 'ct3',
1356
+ class: ['vxe-list--checkbox-option', {
1357
+ 'is--checked': isChecked,
1358
+ 'is--disabled': isDisabled
1359
+ }],
1360
+ on: {
1361
+ click(evnt) {
1362
+ if (!isDisabled) {
1363
+ $xeList.changeCheckboxEvent(evnt, row);
1364
+ }
1365
+ }
1366
+ }
1367
+ }, [
1368
+ h('span', {
1369
+ class: ['vxe-checkbox--icon', isChecked ? getIcon().CHECKBOX_CHECKED : getIcon().CHECKBOX_UNCHECKED]
1370
+ })
1371
+ ]);
1372
+ }
1373
+ return renderEmptyElement($xeList);
1374
+ },
1375
+ renderRow(h, row, rowIndex) {
1376
+ const $xeList = this;
1377
+ const props = $xeList;
1378
+ const reactData = $xeList.reactData;
1379
+ const internalData = $xeList.internalData;
1380
+ const slots = $xeList.$scopedSlots;
1381
+ const { showRadio, showCheckbox } = props;
1382
+ const { selectRadioRow, currRowFlag, updateCheckboxFlag } = reactData;
1383
+ const { selectCheckboxMaps, currentRow } = internalData;
1384
+ const contentSlot = slots.content;
1385
+ const dragOpts = $xeList.computeDragOpts;
1386
+ const { trigger, icon, disabledMethod, visibleMethod } = dragOpts;
1387
+ const rowOpts = $xeList.computeRowOpts;
1388
+ const { useKey, contentField, className: rowClassName, isCurrent } = rowOpts;
1389
+ const isDrag = $xeList.computeIsDrag;
1390
+ const keyField = $xeList.computeKeyField;
1391
+ const isRowFnCls = rowClassName && XEUtils.isFunction(rowClassName);
1392
+ const hasKey = keyField || useKey || isDrag || isCurrent || showRadio || showCheckbox;
1393
+ const rowKey = hasKey && keyField ? getRowIdByField(row, keyField) : '';
1394
+ const rowid = enModelValue(rowKey);
1395
+ const rowParams = { row, $list: $xeList };
1396
+ let isRadioChecked = false;
1397
+ if (showRadio) {
1398
+ isRadioChecked = selectRadioRow && (row === selectRadioRow || $xeList.eqRowByKey(selectRadioRow, rowKey));
1399
+ }
1400
+ let isCheckboxChecked = false;
1401
+ if (showCheckbox) {
1402
+ isCheckboxChecked = !!(updateCheckboxFlag && selectCheckboxMaps[rowid]);
1403
+ }
1404
+ const ctVNs = [];
1405
+ let isDragDisabled = false;
1406
+ if (isDrag && keyField && (!visibleMethod || visibleMethod(rowParams))) {
1407
+ const handleOns = {};
1408
+ if (trigger !== 'row') {
1409
+ isDragDisabled = !!(disabledMethod && disabledMethod(rowParams));
1410
+ handleOns.mousedown = (evnt) => {
1411
+ if (!isDragDisabled) {
1412
+ $xeList.handleRowDragMousedownEvent(evnt, rowParams);
1413
+ }
1414
+ };
1415
+ handleOns.mouseup = $xeList.handleRowDragMouseupEvent;
1416
+ }
1417
+ ctVNs.push(h('div', {
1418
+ key: 'ct1',
1419
+ class: 'vxe-list--row-drag'
1420
+ }, [
1421
+ h('span', {
1422
+ class: 'vxe-list--drag-handle',
1423
+ on: handleOns
1424
+ }, [
1425
+ h('i', {
1426
+ class: icon || getIcon().LIST_DRAG
1427
+ })
1428
+ ])
1429
+ ]));
1430
+ }
1431
+ if (showRadio) {
1432
+ ctVNs.push($xeList.renderRadio(h, row, rowid, isRadioChecked));
1433
+ }
1434
+ if (showCheckbox) {
1435
+ ctVNs.push($xeList.renderCheckbox(h, row, rowid, isCheckboxChecked));
1436
+ }
1437
+ ctVNs.push(h('div', {
1438
+ key: 'ct5',
1439
+ class: 'vxe-list--row-content'
1440
+ }, contentSlot ? contentSlot(rowParams) : (contentField ? getText(row[contentField]) : '')));
1441
+ const rowOns = {
1442
+ mousedown(evnt) {
1443
+ $xeList.handleRowMousedownEvent(evnt, row);
1444
+ },
1445
+ mouseup: $xeList.handleRowDragMouseupEvent,
1446
+ click(evnt) {
1447
+ $xeList.handleRowClickEvent(evnt, row);
1448
+ },
1449
+ dblclick(evnt) {
1450
+ $xeList.handleRowDblclickEvent(evnt, row);
1451
+ }
1452
+ };
1453
+ // 拖拽行事件
1454
+ if (isDrag) {
1455
+ rowOns.dragstart = $xeList.handleRowDragDragstartEvent;
1456
+ rowOns.dragend = $xeList.handleRowDragDragendEvent;
1457
+ rowOns.dragover = $xeList.handleRowDragDragoverEvent;
1458
+ }
1459
+ return h('div', {
1460
+ key: hasKey && keyField ? rowid : rowIndex,
1461
+ class: ['vxe-list--row', isRowFnCls ? rowClassName(rowParams) : (rowClassName || ''), {
1462
+ 'is--drag-disabled': isDragDisabled,
1463
+ 'is--current': currRowFlag && currentRow && $xeList.eqRowByKey(currentRow, rowKey),
1464
+ 'is-radio--checked': isRadioChecked,
1465
+ 'is-checkbox--checked': isCheckboxChecked
1466
+ }],
1467
+ attrs: hasKey && keyField
1468
+ ? {
1469
+ rowid
1470
+ }
1471
+ : undefined,
1472
+ on: rowOns
1473
+ }, ctVNs);
1474
+ },
339
1475
  renderVN(h) {
340
1476
  const $xeList = this;
341
1477
  const props = $xeList;
342
1478
  const reactData = $xeList.reactData;
343
1479
  const slots = $xeList.$scopedSlots;
344
- const { className, loading } = props;
345
- const { bodyHeight, topSpaceHeight, items } = reactData;
1480
+ const { showCheckbox, className, loading } = props;
1481
+ const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
346
1482
  const defaultSlot = slots.default;
1483
+ const headerSlot = slots.header;
1484
+ const footerSlot = slots.footer;
347
1485
  const vSize = $xeList.computeSize;
348
- const styles = $xeList.computeStyles;
1486
+ const wrapperStyles = $xeList.computeWrapperStyles;
1487
+ const virtualStyles = $xeList.computeVirtualStyles;
1488
+ const radioOpts = $xeList.computeRadioOpts;
1489
+ const checkboxOpts = $xeList.computeCheckboxOpts;
1490
+ const dragOpts = $xeList.computeDragOpts;
1491
+ const { trigger } = dragOpts;
1492
+ const rowOpts = $xeList.computeRowOpts;
1493
+ const { isHover, padding } = rowOpts;
1494
+ const showDefChekboxHead = showCheckbox && checkboxOpts.showHeader !== false;
349
1495
  return h('div', {
350
1496
  ref: 'refElem',
351
1497
  class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
352
1498
  [`size--${vSize}`]: vSize,
353
1499
  'is--loading': loading
354
- }]
1500
+ }],
1501
+ style: wrapperStyles
355
1502
  }, [
1503
+ headerSlot || showDefChekboxHead
1504
+ ? h('div', {
1505
+ ref: 'refHeaderElem',
1506
+ class: 'vxe-list--header-wrapper'
1507
+ }, [
1508
+ showDefChekboxHead
1509
+ ? h('div', {
1510
+ class: 'vxe-list--header-left'
1511
+ }, [
1512
+ h('div', {
1513
+ class: ['vxe-list--checkbox-header', {
1514
+ 'is--checked': isAllChecked,
1515
+ 'is--indeterminate': isAllIndeterminate
1516
+ }],
1517
+ on: {
1518
+ click: $xeList.changeCheckboxAllEvent
1519
+ }
1520
+ }, [
1521
+ h('span', {
1522
+ class: ['vxe-checkbox--icon', isAllChecked ? getIcon().CHECKBOX_CHECKED : (isAllIndeterminate ? getIcon().CHECKBOX_INDETERMINATE : getIcon().CHECKBOX_UNCHECKED)]
1523
+ })
1524
+ ])
1525
+ ])
1526
+ : renderEmptyElement($xeList),
1527
+ headerSlot
1528
+ ? h('div', {
1529
+ class: 'vxe-list--header-content'
1530
+ }, headerSlot({ items: rowList, $list: $xeList }))
1531
+ : renderEmptyElement($xeList)
1532
+ ])
1533
+ : renderEmptyElement($xeList),
356
1534
  h('div', {
357
1535
  ref: 'refVirtualWrapper',
358
1536
  class: 'vxe-list--virtual-wrapper',
359
- style: styles,
1537
+ style: virtualStyles,
360
1538
  on: {
361
1539
  scroll: $xeList.scrollEvent
362
1540
  }
@@ -369,12 +1547,28 @@ export default {
369
1547
  }),
370
1548
  h('div', {
371
1549
  ref: 'refVirtualBody',
372
- class: 'vxe-list--body',
1550
+ class: ['vxe-list--body', {
1551
+ 'trigger--row': trigger === 'row',
1552
+ 'checkbox--highlight': checkboxOpts.highlight,
1553
+ 'radio--highlight': radioOpts.highlight,
1554
+ 'row--hover': isHover,
1555
+ 'is--padding': padding
1556
+ }],
373
1557
  style: {
374
1558
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
375
1559
  }
376
- }, defaultSlot ? $xeList.callSlot(defaultSlot, { items }, h) : [])
1560
+ }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
377
1561
  ]),
1562
+ footerSlot
1563
+ ? h('div', {
1564
+ ref: 'refFooterElem',
1565
+ class: 'vxe-list--footer-wrapper'
1566
+ }, footerSlot({ items: rowList, $list: $xeList }))
1567
+ : renderEmptyElement($xeList),
1568
+ /**
1569
+ * 拖拽提示
1570
+ */
1571
+ $xeList.renderDragTip(h),
378
1572
  /**
379
1573
  * 加载中
380
1574
  */
@@ -395,31 +1589,64 @@ export default {
395
1589
  },
396
1590
  height() {
397
1591
  const $xeList = this;
398
- $xeList.recalculate();
1592
+ $xeList.reFlag++;
399
1593
  },
400
1594
  maxHeight() {
401
1595
  const $xeList = this;
402
- $xeList.recalculate();
1596
+ $xeList.reFlag++;
403
1597
  },
404
- syncResize(val) {
1598
+ syncResize() {
405
1599
  const $xeList = this;
406
- if (val) {
1600
+ $xeList.reFlag++;
1601
+ },
1602
+ computeRowHeight() {
1603
+ const $xeList = this;
1604
+ $xeList.reFlag++;
1605
+ },
1606
+ reFlag() {
1607
+ const $xeList = this;
1608
+ $xeList.$nextTick(() => {
407
1609
  $xeList.recalculate();
408
- $xeList.$nextTick(() => setTimeout(() => $xeList.recalculate()));
409
- }
1610
+ });
1611
+ },
1612
+ checkRowKey() {
1613
+ const $xeList = this;
1614
+ $xeList.updateRadioModeValue();
1615
+ },
1616
+ checkRowKeys() {
1617
+ const $xeList = this;
1618
+ $xeList.updateCheckboxModeValue();
410
1619
  }
411
1620
  },
412
1621
  created() {
413
1622
  const $xeList = this;
414
1623
  const props = $xeList;
415
1624
  $xeList.internalData = createInternalData();
1625
+ $xeList.browseObj = XEUtils.browse();
416
1626
  $xeList.loadData(props.data || []);
417
1627
  },
418
1628
  mounted() {
419
1629
  const $xeList = this;
420
1630
  const props = $xeList;
421
1631
  const internalData = $xeList.internalData;
422
- $xeList.recalculate();
1632
+ const { showRadio, showCheckbox } = props;
1633
+ const rowOpts = $xeList.computeRowOpts;
1634
+ const { useKey, keyField } = rowOpts;
1635
+ const isDrag = $xeList.computeIsDrag;
1636
+ if (!keyField) {
1637
+ if (showRadio) {
1638
+ errLog('vxe.error.reqSupportProp', ['show-radio', 'row-config.keyField']);
1639
+ }
1640
+ if (showCheckbox) {
1641
+ errLog('vxe.error.reqSupportProp', ['show-checkbox', 'row-config.keyField']);
1642
+ }
1643
+ if (isDrag) {
1644
+ errLog('vxe.error.reqSupportProp', ['drag-config', 'row-config.keyField']);
1645
+ }
1646
+ }
1647
+ if (useKey && !keyField) {
1648
+ errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
1649
+ }
423
1650
  if (props.autoResize) {
424
1651
  const el = $xeList.$refs.refElem;
425
1652
  const resizeObserver = globalResize.create(() => $xeList.recalculate());
@@ -429,6 +1656,7 @@ export default {
429
1656
  }
430
1657
  internalData.resizeObserver = resizeObserver;
431
1658
  }
1659
+ $xeList.recalculate();
432
1660
  globalEvents.on($xeList, 'resize', $xeList.recalculate);
433
1661
  },
434
1662
  activated() {