修复pagetype列表页过滤栏Link字段类型搜索匹配逻辑

This commit is contained in:
jingrow 2025-11-01 17:55:19 +08:00
parent e706aae6a7
commit 87666e5945

View File

@ -795,6 +795,10 @@ async function loadData() {
//
const filterConditions: any[] = []
// Link
const linkFieldFilters: Array<{ fieldName: string; value: string; fieldMeta: any }> = []
Object.entries(filters.value).forEach(([fieldName, value]) => {
if (value !== null && value !== undefined && value !== '' &&
!(Array.isArray(value) && value.length === 0)) {
@ -806,12 +810,15 @@ async function loadData() {
const fieldMeta = metaFields.value.find(f => f.fieldname === fieldName)
const fieldType = fieldMeta?.fieldtype || ''
// 使 like
const isTextLikeField = ['Data', 'Text', 'Long Text', 'Comment', 'Link'].includes(fieldType)
if (isTextLikeField && typeof value === 'string') {
// 使 like %
filterConditions.push([fieldName, 'like', `%${value}%`])
// Linktitle_field
if (fieldType === 'Link' && typeof value === 'string' && fieldMeta?.options) {
// Link
linkFieldFilters.push({ fieldName, value: value as string, fieldMeta })
} else if (['Data', 'Text', 'Long Text', 'Comment'].includes(fieldType)) {
// 使 like
if (typeof value === 'string') {
filterConditions.push([fieldName, 'like', `%${value}%`])
}
} else {
// 使
filterConditions.push([fieldName, '=', value])
@ -820,6 +827,91 @@ async function loadData() {
}
})
// Linktitle_field
for (const linkFilter of linkFieldFilters) {
const { fieldName, value, fieldMeta } = linkFilter
const linkedPagetype = fieldMeta.options
try {
// pagetype
const config = await getPageTypeConfig(linkedPagetype)
const titleField = config.title_field || 'name'
// name
const matchedNames = new Set<string>()
// 1. Linkname
if (value) {
matchedNames.add(value) //
// name
}
// 2. title_fieldnameshow_title_field_in_linktitle_field
if (titleField !== 'name' && config.show_title_field_in_link) {
try {
// pagetypetitle_field
const searchFilters = [[titleField, 'like', `%${value}%`]]
const searchResult = await axios.get(`/api/data/${encodeURIComponent(linkedPagetype)}`, {
params: {
fields: JSON.stringify(['name']),
filters: JSON.stringify(searchFilters),
limit_page_length: 100 // 100
},
headers: get_session_api_headers(),
withCredentials: true
})
const matchedRecords = searchResult.data?.data || []
matchedRecords.forEach((record: any) => {
if (record.name) {
matchedNames.add(record.name)
}
})
} catch (error) {
console.warn(`搜索${linkedPagetype}的title_field失败:`, error)
}
} else if (titleField === 'name') {
// title_fieldname使like
// 使ORnamenamelike
// OR使invalue
//
try {
const searchFilters = [['name', 'like', `%${value}%`]]
const searchResult = await axios.get(`/api/data/${encodeURIComponent(linkedPagetype)}`, {
params: {
fields: JSON.stringify(['name']),
filters: JSON.stringify(searchFilters),
limit_page_length: 100
},
headers: get_session_api_headers(),
withCredentials: true
})
const matchedRecords = searchResult.data?.data || []
matchedRecords.forEach((record: any) => {
if (record.name) {
matchedNames.add(record.name)
}
})
} catch (error) {
console.warn(`搜索${linkedPagetype}的name字段失败:`, error)
}
}
// name使in
if (matchedNames.size > 0) {
filterConditions.push([fieldName, 'in', Array.from(matchedNames)])
} else {
// 使like
filterConditions.push([fieldName, 'like', `%${value}%`])
}
} catch (error) {
console.warn(`处理Link字段${fieldName}过滤失败,使用字段值匹配:`, error)
// 使like
filterConditions.push([fieldName, 'like', `%${value}%`])
}
}
if (filterConditions.length > 0) {
params.filters = JSON.stringify(filterConditions)
}