import {BaseFormDTO, BusinessPO} from '../../entity/common/base' import {CSSProperties, defineComponent, PropType, VNode} from 'vue' import './style/drawer-item.less' import {Image} from 'ant-design-vue' import {BaseUtil} from '../../utils/base-util' import {LogFile} from '../../entity/system-log/log-file' import {ImageProps} from 'ant-design-vue/lib/image' import failImage from '../../assets/images/common/fail.svg' export type FieldType = 'text' | 'image' | 'title' | 'divider' | 'html' export interface DrawerItemProps { /** * 字段名称 * 提交表单的标识符 */ name: keyof T | Array /** * 字段类型 */ type?: FieldType /** * 数据格式化 * @param value */ format?: (entity: T, name: keyof T | Array, value: string | number) => string /** * 标题 */ label: string /** * 自定义渲染 * @param entity * @param name * @param value */ render?: (entity: T, name: keyof T | Array, value: string | number) => VNode /** * 占几列 */ span?: number /** * 值的额外样式 */ valueClass?: string /** * 图片的样式 */ imageProps?: ImageProps } export const DrawerItem = defineComponent({ name: 'DrawerItem', props: { data: { type: Object as PropType, required: true }, name: { type: [String, Array] as PropType, required: true, default: '' }, type: { type: String as PropType, default: 'text' }, format: { type: Function as PropType, default: (entity: BusinessPO, name: keyof BusinessPO | Array, value: string | number) => value }, label: { type: String as PropType, required: true }, render: { type: Function as PropType }, span: { type: Number as PropType, default: 1 }, valueClass: { type: String as PropType, default: '' }, imageProps: { type: Object as PropType, default: () => ({ width: '100px', height: '100px', fallback: failImage }) } }, setup: (props, {slots}) => { const {data, name, type, format, label, imageProps, render, span, valueClass} = props const prefixCls = 'dc-drawer-detail' const getValue = (): string | number | undefined => { if (Array.isArray(name)) { return name.map(key => data[key]).join(',') } return data[name] } // 获取css样式 const style: CSSProperties = {'grid-column': `span ${span}`} // 渲染图片 function renderImage() { if (Array.isArray(name)) { return } const value = data[name] as unknown as string | Array if (!value || value.length === 0) { return '暂无' + label } // 如果是字段串,那么,分割并且显示 if (typeof value == 'string') { return value.split(',').map(item => { return }) } // 数组 if (Array.isArray(value)) { return value.map((item: LogFile) => { return }) } else { const image = value as unknown as LogFile return } } return () => { // 如果写了渲染函数,使用渲染函数 if (render) { return render(data, name, getValue() ?? '') } // 如果自己写了默认的插槽,使用插槽 if (slots.default) { return (
{slots.default({data, name, value: getValue() ?? ''})}
) } if (type === 'text') { return (
{label}:
{format ? format(data, name, getValue() ?? '') : getValue() ?? '暂无'}
) } else if (type === 'html') { return (
{label}:
) } else if (type === 'image') { const imageStyle: CSSProperties = { 'grid-template-columns': `repeat(auto-fill, minmax(${imageProps?.width ?? '100px'}, auto))` } return (
{renderImage()}
) } else if (type === 'title') { return
{label}
} else if (type === 'divider') { return
} else { return
{label}
} } } })