|
|
|
|
@ -17,7 +17,6 @@ import { set, get } from 'lodash-es'
|
|
|
|
|
import { CSSProperties } from 'vue'
|
|
|
|
|
import { getSlot } from '@/utils/tsxHelper'
|
|
|
|
|
import TableActions from './components/TableActions.vue'
|
|
|
|
|
import { isImgPath } from '@/utils/is'
|
|
|
|
|
import { createVideoViewer } from '@/components/VideoPlayer'
|
|
|
|
|
import { Icon } from '@/components/Icon'
|
|
|
|
|
import { BaseButton } from '@/components/Button'
|
|
|
|
|
@ -59,8 +58,13 @@ export default defineComponent({
|
|
|
|
|
type: Array as PropType<Recordable[]>,
|
|
|
|
|
default: () => []
|
|
|
|
|
},
|
|
|
|
|
// 是否自动预览
|
|
|
|
|
preview: {
|
|
|
|
|
// 图片自动预览字段数组
|
|
|
|
|
imagePreview: {
|
|
|
|
|
type: Array as PropType<string[]>,
|
|
|
|
|
default: () => []
|
|
|
|
|
},
|
|
|
|
|
// 视频自动预览字段数组
|
|
|
|
|
videoPreview: {
|
|
|
|
|
type: Array as PropType<string[]>,
|
|
|
|
|
default: () => []
|
|
|
|
|
},
|
|
|
|
|
@ -339,7 +343,8 @@ export default defineComponent({
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const renderTreeTableColumn = (columnsChildren: TableColumn[]) => {
|
|
|
|
|
const { align, headerAlign, showOverflowTooltip, preview } = unref(getProps)
|
|
|
|
|
const { align, headerAlign, showOverflowTooltip, imagePreview, videoPreview } =
|
|
|
|
|
unref(getProps)
|
|
|
|
|
return columnsChildren.map((v) => {
|
|
|
|
|
if (v.hidden) return null
|
|
|
|
|
const props = { ...v } as any
|
|
|
|
|
@ -350,10 +355,10 @@ export default defineComponent({
|
|
|
|
|
const slots = {
|
|
|
|
|
default: (...args: any[]) => {
|
|
|
|
|
const data = args[0]
|
|
|
|
|
let isImageUrl = false
|
|
|
|
|
if (preview.length) {
|
|
|
|
|
isImageUrl = preview.some((item) => (item as string) === v.field)
|
|
|
|
|
}
|
|
|
|
|
let isPreview = false
|
|
|
|
|
isPreview =
|
|
|
|
|
imagePreview.some((item) => (item as string) === v.field) ||
|
|
|
|
|
videoPreview.some((item) => (item as string) === v.field)
|
|
|
|
|
|
|
|
|
|
return children && children.length
|
|
|
|
|
? renderTreeTableColumn(children)
|
|
|
|
|
@ -361,8 +366,8 @@ export default defineComponent({
|
|
|
|
|
? props.slots.default(...args)
|
|
|
|
|
: v?.formatter
|
|
|
|
|
? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index)
|
|
|
|
|
: isImageUrl
|
|
|
|
|
? renderPreview(get(data.row, v.field))
|
|
|
|
|
: isPreview
|
|
|
|
|
? renderPreview(get(data.row, v.field), v.field)
|
|
|
|
|
: get(data.row, v.field)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -384,10 +389,11 @@ export default defineComponent({
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const renderPreview = (url: string) => {
|
|
|
|
|
const renderPreview = (url: string, field: string) => {
|
|
|
|
|
const { imagePreview, videoPreview } = unref(getProps)
|
|
|
|
|
return (
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
{isImgPath(url) ? (
|
|
|
|
|
{imagePreview.includes(field) ? (
|
|
|
|
|
<ElImage
|
|
|
|
|
src={url}
|
|
|
|
|
fit="cover"
|
|
|
|
|
@ -396,7 +402,7 @@ export default defineComponent({
|
|
|
|
|
preview-src-list={[url]}
|
|
|
|
|
preview-teleported
|
|
|
|
|
/>
|
|
|
|
|
) : (
|
|
|
|
|
) : videoPreview.includes(field) ? (
|
|
|
|
|
<BaseButton
|
|
|
|
|
type="primary"
|
|
|
|
|
icon={<Icon icon="ep:video-play" />}
|
|
|
|
|
@ -408,7 +414,7 @@ export default defineComponent({
|
|
|
|
|
>
|
|
|
|
|
预览
|
|
|
|
|
</BaseButton>
|
|
|
|
|
)}
|
|
|
|
|
) : null}
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
@ -423,7 +429,8 @@ export default defineComponent({
|
|
|
|
|
headerAlign,
|
|
|
|
|
showOverflowTooltip,
|
|
|
|
|
reserveSelection,
|
|
|
|
|
preview
|
|
|
|
|
imagePreview,
|
|
|
|
|
videoPreview
|
|
|
|
|
} = unref(getProps)
|
|
|
|
|
|
|
|
|
|
return (columnsChildren || columns).map((v) => {
|
|
|
|
|
@ -463,10 +470,10 @@ export default defineComponent({
|
|
|
|
|
default: (...args: any[]) => {
|
|
|
|
|
const data = args[0]
|
|
|
|
|
|
|
|
|
|
let isImageUrl = false
|
|
|
|
|
if (preview.length) {
|
|
|
|
|
isImageUrl = preview.some((item) => (item as string) === v.field)
|
|
|
|
|
}
|
|
|
|
|
let isPreview = false
|
|
|
|
|
isPreview =
|
|
|
|
|
imagePreview.some((item) => (item as string) === v.field) ||
|
|
|
|
|
videoPreview.some((item) => (item as string) === v.field)
|
|
|
|
|
|
|
|
|
|
return children && children.length
|
|
|
|
|
? renderTreeTableColumn(children)
|
|
|
|
|
@ -474,8 +481,8 @@ export default defineComponent({
|
|
|
|
|
? props.slots.default(...args)
|
|
|
|
|
: v?.formatter
|
|
|
|
|
? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index)
|
|
|
|
|
: isImageUrl
|
|
|
|
|
? renderPreview(get(data.row, v.field))
|
|
|
|
|
: isPreview
|
|
|
|
|
? renderPreview(get(data.row, v.field), v.field)
|
|
|
|
|
: get(data.row, v.field)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|