forked from vueComponent/ant-design-vue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.jsx
141 lines (138 loc) · 4.3 KB
/
index.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import T from './Table';
import ref from 'vue-ref';
import Vue from 'vue';
import {
getOptionProps,
getKey,
getClass,
getStyle,
getEvents,
getSlotOptions,
camelize,
getSlots,
getListeners,
} from '../_util/props-util';
import Base from '../base';
Vue.use(ref, { name: 'ant-ref' });
const Table = {
name: 'ATable',
Column: T.Column,
ColumnGroup: T.ColumnGroup,
props: T.props,
methods: {
normalize(elements = []) {
const columns = [];
elements.forEach(element => {
if (!element.tag) {
return;
}
const key = getKey(element);
const style = getStyle(element);
const cls = getClass(element);
const props = getOptionProps(element);
const events = getEvents(element);
const listeners = {};
Object.keys(events).forEach(e => {
/*
Convert events on template Column to function props onPropAbcChange in Table.columns prop.
If you write template code like below:
<Column @prop-abc-change="f1" @update:prop-abc="f2" :prop-abc.sync="dataAbc" />
You will get these events:
{
'prop-abc-change': this.f1,
'update:prop-abc': [this.f2, e => this.dataAbc = e],
'update:propAbc': e => this.dataAbc = e,
}
All of these events would be treat as column.onPropAbcChange,
but only one of them will be valid, which can not be determined.
*/
let k;
if (e.startsWith('update:')) {
k = `on-${e.substr('update:'.length)}-change`;
} else {
k = `on-${e}`;
}
listeners[camelize(k)] = events[e];
});
const { default: children, ...restSlots } = getSlots(element);
const column = { ...restSlots, ...props, style, class: cls, ...listeners };
if (key) {
column.key = key;
}
if (getSlotOptions(element).__ANT_TABLE_COLUMN_GROUP) {
column.children = this.normalize(typeof children === 'function' ? children() : children);
} else {
const customRender =
element.data && element.data.scopedSlots && element.data.scopedSlots.default;
column.customRender = column.customRender || customRender;
}
columns.push(column);
});
return columns;
},
updateColumns(cols = []) {
const columns = [];
const { $slots, $scopedSlots } = this;
cols.forEach(col => {
const { slots = {}, scopedSlots = {}, ...restProps } = col;
const column = {
...restProps,
};
Object.keys(slots).forEach(key => {
const name = slots[key];
if (column[key] === undefined && $slots[name]) {
column[key] = $slots[name].length === 1 ? $slots[name][0] : $slots[name];
}
});
Object.keys(scopedSlots).forEach(key => {
const name = scopedSlots[key];
if (column[key] === undefined && $scopedSlots[name]) {
column[key] = $scopedSlots[name];
}
});
// if (slotScopeName && $scopedSlots[slotScopeName]) {
// column.customRender = column.customRender || $scopedSlots[slotScopeName]
// }
if (col.children) {
column.children = this.updateColumns(column.children);
}
columns.push(column);
});
return columns;
},
},
render() {
const { $slots, normalize, $scopedSlots } = this;
const props = getOptionProps(this);
const columns = props.columns ? this.updateColumns(props.columns) : normalize($slots.default);
let { title, footer } = props;
const {
title: slotTitle,
footer: slotFooter,
expandedRowRender = props.expandedRowRender,
expandIcon = props.expandIcon,
} = $scopedSlots;
title = title || slotTitle;
footer = footer || slotFooter;
const tProps = {
props: {
...props,
columns,
title,
footer,
expandedRowRender,
expandIcon,
},
on: getListeners(this),
};
return <T {...tProps} />;
},
};
/* istanbul ignore next */
Table.install = function(Vue) {
Vue.use(Base);
Vue.component(Table.name, Table);
Vue.component(Table.Column.name, Table.Column);
Vue.component(Table.ColumnGroup.name, Table.ColumnGroup);
};
export default Table;