162 lines
4.9 KiB
TypeScript
162 lines
4.9 KiB
TypeScript
import { firstLetterUpperCase } from 'oak-domain/lib/utils/string';
|
|
import { composeFileUrl } from '../../../../src/utils/extraFile';
|
|
|
|
export default OakPage({
|
|
path: 'userRelation:list',
|
|
entity: 'user',
|
|
projection: async ({ props }) => {
|
|
const { entity, relations, entityId } = props;
|
|
const entityStr = firstLetterUpperCase(entity!);
|
|
return {
|
|
id: 1,
|
|
name: 1,
|
|
nickname: 1,
|
|
mobile$user: {
|
|
$entity: 'mobile',
|
|
data: {
|
|
id: 1,
|
|
userId: 1,
|
|
mobile: 1,
|
|
},
|
|
},
|
|
[`user${entityStr}$user`]: {
|
|
$entity: `user${entityStr}`,
|
|
data: {
|
|
id: 1,
|
|
userId: 1,
|
|
[`${entity}Id`]: 1,
|
|
relation: 1,
|
|
},
|
|
filter: {
|
|
relation: {
|
|
$in: relations!,
|
|
},
|
|
[`${entity}Id`]: entityId!,
|
|
},
|
|
},
|
|
extraFile$entity: {
|
|
$entity: 'extraFile',
|
|
data: {
|
|
id: 1,
|
|
tag1: 1,
|
|
origin: 1,
|
|
bucket: 1,
|
|
objectId: 1,
|
|
filename: 1,
|
|
extra1: 1,
|
|
type: 1,
|
|
entity: 1,
|
|
extension: 1,
|
|
},
|
|
filter: {
|
|
tag1: 'avatar',
|
|
},
|
|
indexFrom: 0,
|
|
count: 1,
|
|
},
|
|
};
|
|
},
|
|
filters: [
|
|
// 由调用者注入oakFilter
|
|
],
|
|
isList: true,
|
|
formData: async function ({ data: users, props, features }) {
|
|
const { entity } = props;
|
|
const entityStr = firstLetterUpperCase(entity!);
|
|
const filter = await this.getFilterByName('name');
|
|
|
|
return {
|
|
users: users?.map((ele: any) => {
|
|
const { mobile$user, extraFile$entity } = ele || {};
|
|
const userEntity = ele![`user${entityStr}$user`];
|
|
const mobile = mobile$user && mobile$user[0]?.mobile;
|
|
const avatar =
|
|
extraFile$entity &&
|
|
extraFile$entity[0] &&
|
|
composeFileUrl(extraFile$entity[0]);
|
|
const relations = userEntity?.map((ele: any) => ele.relation);
|
|
const hasRelation: boolean[] = props.relations?.map((ele2) =>
|
|
relations.includes(ele2)
|
|
);
|
|
const user2 = Object.assign({}, ele, {
|
|
mobile,
|
|
avatar,
|
|
relations,
|
|
hasRelation,
|
|
});
|
|
return user2;
|
|
}),
|
|
searchValue:
|
|
filter?.$or &&
|
|
(filter.$or as [{ name: { $includes: string } }])[0]?.name
|
|
.$includes,
|
|
};
|
|
},
|
|
properties: {
|
|
entity: String,
|
|
entityId: String,
|
|
relations: Array,
|
|
},
|
|
data: {
|
|
searchValue: '',
|
|
},
|
|
lifetimes: {},
|
|
methods: {
|
|
async searchChange(input: any) {
|
|
const { value } = this.resolveInput(input);
|
|
this.addNamedFilter({
|
|
filter: {
|
|
$or: [
|
|
{
|
|
name: {
|
|
$includes: value!,
|
|
},
|
|
},
|
|
{
|
|
nickname: {
|
|
$includes: value!,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
'#name': 'name',
|
|
});
|
|
},
|
|
async searchCancel() {
|
|
this.removeNamedFilterByName('name');
|
|
},
|
|
async searchConfirm() {
|
|
this.refresh();
|
|
},
|
|
onChange(input: any) {
|
|
const { dataset, value } = this.resolveInput(input);
|
|
const {
|
|
id: userId,
|
|
relation,
|
|
index,
|
|
} = dataset as {
|
|
id: string;
|
|
relation: string;
|
|
index: number;
|
|
};
|
|
this.onChangeValue(value, relation, index);
|
|
},
|
|
onChangeValue(value, relation, index) {
|
|
const { entity, entityId } = this.props;
|
|
const entityStr = firstLetterUpperCase(entity!);
|
|
this.toggleNode(
|
|
{
|
|
relation,
|
|
[`${entity}Id`]: entityId,
|
|
},
|
|
value,
|
|
`${index}.user${entityStr}$user`
|
|
);
|
|
},
|
|
async confirm() {
|
|
await this.execute('grant');
|
|
await this.navigateBack();
|
|
},
|
|
},
|
|
});
|