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