86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
import { assert } from 'oak-domain/lib/utils/assert';
|
||
export default OakComponent({
|
||
isList: false,
|
||
/* entity() {
|
||
return this.props.pickerDef!.entity as keyof ED;
|
||
}, */
|
||
properties: {
|
||
placeholder: undefined,
|
||
multiple: false,
|
||
entityId: '',
|
||
entityIds: [],
|
||
pickerRender: {},
|
||
onChange: (() => undefined),
|
||
},
|
||
formData() {
|
||
const { multiple, entityIds, pickerRender } = this.props;
|
||
const { entity, projection, title } = pickerRender;
|
||
const rows = entityIds &&
|
||
entityIds.length &&
|
||
this.features.cache.get(entity, {
|
||
data: typeof projection === 'function'
|
||
? projection()
|
||
: projection,
|
||
filter: {
|
||
id: {
|
||
$in: entityIds,
|
||
},
|
||
},
|
||
});
|
||
const renderValue = rows && rows.length ? rows.map((row) => title(row)).join(',') : '';
|
||
const schema = this.features.cache.getSchema();
|
||
return {
|
||
renderValue,
|
||
schema,
|
||
};
|
||
},
|
||
data: {
|
||
data: undefined,
|
||
},
|
||
listeners: {
|
||
entityId() {
|
||
this.reRender();
|
||
},
|
||
entityIds() {
|
||
this.reRender();
|
||
},
|
||
},
|
||
lifetimes: {
|
||
async ready() {
|
||
this.refreshData();
|
||
},
|
||
},
|
||
methods: {
|
||
async refreshData() {
|
||
const { pickerRender, multiple } = this.props;
|
||
const { mode, entity, projection, filter, count, title } = pickerRender;
|
||
if (mode === 'radio') {
|
||
// radio的要先取数据出来
|
||
assert(typeof count === 'number' && count <= 5, 'radio类型的外键选择,总数必须小于5');
|
||
}
|
||
else if (mode === 'select') {
|
||
// select也先取(可以点击再取,但这样初始状态不好渲染)
|
||
assert(typeof count === 'number' && count <= 20, 'select类型的外键选择,总数必须小于20');
|
||
}
|
||
else {
|
||
return;
|
||
}
|
||
const proj = typeof projection === 'function' ? projection() : projection;
|
||
const filter2 = typeof filter === 'function' ? filter() : filter;
|
||
const { data } = await this.features.cache.refresh(entity, {
|
||
data: proj,
|
||
filter: filter2,
|
||
indexFrom: 0,
|
||
count,
|
||
});
|
||
const data2 = data.map((ele) => ({
|
||
id: ele.id,
|
||
title: title(ele),
|
||
}));
|
||
this.setState({
|
||
data: data2,
|
||
});
|
||
},
|
||
},
|
||
});
|