182 lines
5.2 KiB
Vue
182 lines
5.2 KiB
Vue
<template>
|
||
<view class="onlineTableCell">
|
||
<!--图片-->
|
||
<template v-if="column?.scopedSlots?.customRender === 'imgSlot'">
|
||
<template v-if="record[column.dataIndex]">
|
||
<wd-img
|
||
width="30"
|
||
height="30"
|
||
:src="getFirstImg(record[column.dataIndex])"
|
||
@click="handleClickImg"
|
||
></wd-img>
|
||
<ImgPreview
|
||
v-if="imgPreview.show"
|
||
:urls="imgPreview.urls"
|
||
@close="() => (imgPreview.show = false)"
|
||
></ImgPreview>
|
||
</template>
|
||
<template v-else>
|
||
<text>无图片</text>
|
||
</template>
|
||
</template>
|
||
<!--下载-->
|
||
<template v-else-if="column?.scopedSlots?.customRender === 'fileSlot'">
|
||
<template v-if="record[column.dataIndex]">
|
||
<wd-button @click="handleDownload(record[column.dataIndex])">下载</wd-button>
|
||
</template>
|
||
<template v-else>
|
||
<text>无文件</text>
|
||
</template>
|
||
</template>
|
||
<template v-else-if="column?.scopedSlots?.customRender === 'htmlSlot'">
|
||
<!-- 增加富文本控件配置href跳转 -->
|
||
<template v-if="column.fieldHref">
|
||
<text class="ellipsis-2">暂不支持</text>
|
||
</template>
|
||
<template v-else>
|
||
<rich-text :nodes="record[column.dataIndex]"></rich-text>
|
||
</template>
|
||
</template>
|
||
<template v-else-if="column?.scopedSlots?.customRender === 'pcaSlot'">
|
||
<text class="ellipsis-2">{{ getPcaText(record[column.dataIndex]) || ' '}}</text>
|
||
</template>
|
||
<template v-else-if="column?.scopedSlots?.customRender === 'dateSlot'">
|
||
<text class="ellipsis-2">{{ getFormatDate(record[column.dataIndex], column) || ' '}}</text>
|
||
</template>
|
||
<template v-else>
|
||
<text class="ellipsis-2">{{ renderVal(record, column) || ' ' }}</text>
|
||
</template>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { getFormatDate, filterMultiDictText } from '../utils/index'
|
||
import { isString } from '@/utils/is'
|
||
import { getFileAccessHttpUrl } from '@/common/uitls'
|
||
import { getAreaTextByCode } from '@/common/areaData/Area'
|
||
defineOptions({
|
||
name: 'onlineTableCell',
|
||
options: {
|
||
styleIsolation: 'shared',
|
||
},
|
||
})
|
||
const props = defineProps({
|
||
columnsInfo: {
|
||
type: Object,
|
||
default: () => {},
|
||
},
|
||
column: {
|
||
type: Object,
|
||
default: () => {},
|
||
},
|
||
record: {
|
||
type: Object,
|
||
default: () => {},
|
||
},
|
||
})
|
||
const imgPreview = ref({
|
||
show: false,
|
||
urls: [],
|
||
})
|
||
// 下载
|
||
const handleDownload = (text) => {
|
||
uni.downloadFile({
|
||
url: text,
|
||
success: (res) => {
|
||
if (res.statusCode === 200) {
|
||
console.log('下载成功')
|
||
console.log(res);
|
||
}
|
||
},
|
||
})
|
||
}
|
||
// 省市区
|
||
const getPcaText = (code) => {
|
||
if (!code) {
|
||
return ''
|
||
}
|
||
return getAreaTextByCode(code)
|
||
}
|
||
// 列表只显示第一张图
|
||
const getFirstImg = (text) => {
|
||
if (isString(text)) {
|
||
var imgs = text.split(',')
|
||
return getFileAccessHttpUrl(imgs[0])
|
||
} else {
|
||
return ''
|
||
}
|
||
}
|
||
// 点击图时
|
||
const handleClickImg = () => {
|
||
imgPreview.value.show = true
|
||
}
|
||
// 渲染值
|
||
const renderVal = (record, column) => {
|
||
const { customRender, hrefSlotName, dataIndex, fieldType } = column
|
||
let text = record[dataIndex]
|
||
if (['date', 'Date'].includes(column['fieldType'])) {
|
||
// online报表中类型配置为日期(yyyy-MM-dd ),但是实际展示为日期时间格式(yyyy-MM-dd HH:mm:ss)
|
||
if (!text) {
|
||
return ''
|
||
}
|
||
if (text.length > 10) {
|
||
return text.substring(0, 10)
|
||
}
|
||
return text
|
||
} else if (['popup_dict'].includes(column['fieldType'])) {
|
||
const dict = record[dataIndex + '_dictText']
|
||
if (dict != undefined) {
|
||
return record[dataIndex + '_dictText']
|
||
}
|
||
return text
|
||
} else if (customRender) {
|
||
// 字典
|
||
let dictCode = customRender as string
|
||
let replaceFlag = '_replace_text_'
|
||
let value = text
|
||
// 如果 dictCode 有值,就进行字典转换
|
||
if (dictCode) {
|
||
if (dictCode.startsWith(replaceFlag)) {
|
||
let textFieldName = dictCode.replace(replaceFlag, '')
|
||
value = record[textFieldName]
|
||
} else {
|
||
value = filterMultiDictText(unref(props.columnsInfo.dictOptions)[dictCode], text + '')
|
||
}
|
||
}
|
||
// 扩展参数设置列的内容长度
|
||
if (column.showLength) {
|
||
if (value && value.length > column.showLength) {
|
||
value = value.substr(0, column.showLength) + '...'
|
||
}
|
||
}
|
||
return value
|
||
} else {
|
||
return text
|
||
}
|
||
}
|
||
// 初始化
|
||
const init = () => {
|
||
const field = props.column.dataIndex
|
||
if (props.column?.scopedSlots?.customRender === 'imgSlot') {
|
||
const text = props.record[field]
|
||
if (isString(text)) {
|
||
imgPreview.value.urls = text.split(',').map((item) => getFileAccessHttpUrl(item))
|
||
} else {
|
||
return ''
|
||
}
|
||
}
|
||
}
|
||
init()
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
:deep(.wd-button) {
|
||
--wot-button-medium-height: 30px;
|
||
--wot-button-medium-fs: 12px;
|
||
--wot-button-medium-padding: 8px;
|
||
&.is-medium.is-round {
|
||
min-width: 80px;
|
||
}
|
||
}
|
||
</style>
|