export default OakPage( { path: 'userSearch:search', entity: 'user', projection: { id: 1, name: 1, nickname: 1, mobile$user: { $entity: 'mobile', data: { id: 1, userId: 1, mobile: 1, }, }, }, filters: [ { filter: { id: { $in: { entity: 'mobile', data: { userId: 1, }, filter: { mobile: { $eq: '11111111112', } } } } }, '#name': 'userSearch' } ], isList: true, formData: async function ({ data: users, params, features }) { const { searchValue, go } = this.data; go && this.goPage(users); const isRoot = await features.token.isRoot(); let nodeStr = ''; const userIds: Array = []; if (users.length) { for (let i = 0; i < users.length; i++) { userIds.push(users[i].id); const { mobile$user, name } = users[i] || {}; let itemStr: String = name || ''; const mobile = mobile$user && mobile$user[0]?.mobile; if (!mobile && !name) { continue; } if (mobile) { itemStr += " " + mobile; } const itemStr2 = itemStr.replace(searchValue, `${searchValue}`) nodeStr += `
${itemStr2}` } } return { users, userIds, nodeStr, isRoot, }; }, properties: { toUrl: String, }, data: { go: false, showList: false, }, lifetimes: { ready() { const searchStr = this.load('user_searchList') as string; if (searchStr.length) { this.setState({ searchArr: JSON.parse(searchStr), }) } } }, methods: { closeList() { this.setState({ showList: false, }) }, setFilter(value: string) { this.addNamedFilter({ filter: { $or: [ { name: { $includes: value!, }, }, { id: { $in: { entity: 'mobile', data: { userId: 1, }, filter: { mobile: { $includes: value!, } } } } } ], }, '#name': 'userSearch', }); }, goPage(data: any) { const { toUrl } = this.data; const userIds = data?.map((ele: any) => ele.id); this.navigateTo({ url: toUrl, userIds, }); this.setState({ showList: false, go: false, }) }, tagClick(event: any) { const { value } = event.currentTarget.dataset; this.setFilter(value); this.setState({ go: true, }) this.refresh(); }, //搜索框聚焦时,如果有输入值且搜索有值,也应该显示搜索结果list onFocus(event: any) { const { searchValue, userIds } = this.data; if (searchValue && userIds.length) { this.setState({ showList: true, }) } }, itemClick(event: any) { //由于rich-text屏蔽了所有子节点的事件,所以这里根据触摸点进行判断 //搜索栏高度40px 每个可点击项38px const { toUrl, searchValue, userIds } = this.data; const { pageY } = event.touches[0]; const index = Math.floor((pageY - 40) / 38); if (index + 1 > userIds.length) { this.setState({ showList: false, }) return; } const searchStr = this.load('user_searchList') as string; let searchArr: Array = []; if (!searchStr) { searchArr.push(searchValue) } else { searchArr = JSON.parse(searchStr) as Array; if (!searchArr.includes(searchValue)) { searchArr.push(searchValue); } } this.save('user_searchList', JSON.stringify(searchArr)); this.setState({showList: false}) this.navigateTo({ url: toUrl, userIds: [userIds[index]], }) }, clearSearchHistory() { this.setState({ searchArr: [], }); this.save('user_searchList', ''); }, async searchChange(input: any) { const { value } = this.resolveInput(input); const { users } = this.state; if (!value) { this.setState({ searchValue: value, showList: false, }) return; } if (users.length) { this.setState({ showList: true, }) } this.setFilter(value); this.setState({ searchValue: value, }) this.refresh(); }, async searchCancel() { this.setState({ searchValue: '', showList: false, }) }, async searchConfirm(input: any) { const { value } = this.resolveInput(input); const searchStr = this.load('user_searchList') as string; let searchArr: Array = []; if (!searchStr) { searchArr.push(value) this.setState({ searchArr, go: true, }) } else { searchArr = JSON.parse(searchStr) as Array; if (!searchArr.includes(value)) { searchArr.push(value); } this.setState({ searchArr, go: true, }) } this.save('user_searchList', JSON.stringify(searchArr)); this.setFilter(value); this.refresh(); }, }, } );