pagetype列表页Link类型的字段更新为显示title_field的值

This commit is contained in:
jingrow 2025-11-01 14:54:23 +08:00
parent dfb111c7a5
commit c9c2d6ec62
2 changed files with 127 additions and 2 deletions

View File

@ -23,6 +23,7 @@
size="small"
@blur="onFilterChange"
@update:value="onInputChange"
@keyup.enter="onFilterChange"
/>
</div>
@ -78,6 +79,7 @@
size="small"
@blur="onFilterChange"
@update:value="onInputChange"
@keyup.enter="onFilterChange"
/>
</div>
@ -102,6 +104,7 @@
size="small"
@blur="onFilterChange"
@update:value="onInputChange"
@keyup.enter="onFilterChange"
/>
</div>
</div>

View File

@ -289,6 +289,8 @@ const cardBadges = computed(() => {
})
const metaFields = ref<any[]>([])
const linkTitleCache = ref<Record<string, string>>({})
const pageTypeConfigCache = ref<Record<string, any>>({})
async function loadMeta() {
loading.value = true
@ -304,6 +306,110 @@ async function loadMeta() {
}
}
//
async function getPageTypeConfig(pagetype: string) {
if (!pagetype) return {}
//
if (pageTypeConfigCache.value[pagetype]) {
return pageTypeConfigCache.value[pagetype]
}
try {
const response = await axios.get(`/api/data/PageType/${encodeURIComponent(pagetype)}`, {
headers: get_session_api_headers(),
withCredentials: true
})
const config = response.data?.data || {}
pageTypeConfigCache.value[pagetype] = config
return config
} catch (error) {
console.error('获取页面类型配置失败:', error)
return {}
}
}
//
async function getRecordTitle(pagetype: string, recordName: string): Promise<string> {
if (!pagetype || !recordName) return recordName || ''
//
const cacheKey = `${pagetype}_${recordName}`
if (linkTitleCache.value[cacheKey]) {
return linkTitleCache.value[cacheKey]
}
try {
//
const config = await getPageTypeConfig(pagetype)
const titleField = config.title_field || 'name'
const showTitleFieldInLink = config.show_title_field_in_link || false
// name
if (titleField === 'name') {
linkTitleCache.value[cacheKey] = recordName
return recordName
}
// show_title_field_in_link
if (!showTitleFieldInLink) {
linkTitleCache.value[cacheKey] = recordName
return recordName
}
//
const response = await axios.get(`/api/data/${encodeURIComponent(pagetype)}/${encodeURIComponent(recordName)}`, {
headers: get_session_api_headers(),
withCredentials: true
})
const recordData = response.data?.data || {}
const titleValue = recordData[titleField] || recordName
//
linkTitleCache.value[cacheKey] = titleValue
return titleValue
} catch (error) {
console.error('获取记录标题失败:', error)
return recordName
}
}
// Linktitle_field
async function preloadLinkTitles() {
// Link
const linkFields = metaFields.value.filter(f => f.fieldtype === 'Link' && f.options)
if (linkFields.length === 0) return
// Link使Map
const linkMap = new Map<string, {pagetype: string, recordName: string}>()
rows.value.forEach(row => {
linkFields.forEach(field => {
const value = row[field.fieldname]
if (value) {
const key = `${field.options}::${value}`
if (!linkMap.has(key)) {
linkMap.set(key, {
pagetype: field.options,
recordName: value
})
}
}
})
})
// title_field
await Promise.all(
Array.from(linkMap.values()).map(({ pagetype, recordName }) =>
getRecordTitle(pagetype, recordName).catch(() => recordName)
)
)
}
async function loadData() {
loading.value = true
try {
@ -356,6 +462,11 @@ async function loadData() {
} else {
total.value = res.data.total
}
// Linktitle_fieldUI
preloadLinkTitles().catch(err => {
console.error('预加载Link标题失败:', err)
})
} catch (error) {
console.error('Load data error:', error)
message.error(t('Load failed'))
@ -479,9 +590,20 @@ function isBooleanField(fieldName: string) {
function formatDisplayValue(value: any, fieldName: string) {
let result: any = value
//
//
const fieldMeta = metaFields.value.find(f => f.fieldname === fieldName)
if (fieldMeta && fieldMeta.options) {
// Link使title_field
if (fieldMeta && fieldMeta.fieldtype === 'Link' && fieldMeta.options && value) {
const cacheKey = `${fieldMeta.options}_${value}`
if (linkTitleCache.value[cacheKey]) {
result = linkTitleCache.value[cacheKey]
} else {
//
result = value
}
} else if (fieldMeta && fieldMeta.options) {
// Link
const options = fieldMeta.options.split('\n').filter((s: string) => s.trim() !== '')
if (options.includes(value)) {
result = t(value)