多维表格
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
3.3 KiB

import { type ColumnType } from 'nocodb-sdk'
import type { PropType } from '@vue/runtime-core'
import {
ColumnInj,
computed,
defineComponent,
h,
iconMap,
inject,
isAttachment,
isBoolean,
isCurrency,
isDate,
isDateTime,
isDecimal,
isDuration,
isEmail,
isFloat,
isGeoData,
isGeometry,
isInt,
isJSON,
isPercent,
isPhoneNumber,
isPrimaryKey,
isRating,
isSet,
isSingleSelect,
isSpecificDBType,
isString,
isTextArea,
isTime,
isURL,
isUser,
isYear,
storeToRefs,
toRef,
useBase,
} from '#imports'
const renderIcon = (column: ColumnType, abstractType: any) => {
if (isPrimaryKey(column)) {
return iconMap.cellSystemKey
} else if (isSpecificDBType(column)) {
return iconMap.cellDb
} else if (isJSON(column)) {
return iconMap.cellJson
} else if (isDate(column, abstractType)) {
return iconMap.cellDate
} else if (isDateTime(column, abstractType)) {
return iconMap.cellDatetime
} else if (isGeoData(column)) {
return iconMap.geoData
} else if (isSet(column)) {
return iconMap.cellMultiSelect
} else if (isSingleSelect(column)) {
return iconMap.cellSingleSelect
} else if (isBoolean(column, abstractType)) {
return iconMap.cellCheckbox
} else if (isTextArea(column)) {
return iconMap.cellLongText
} else if (isEmail(column)) {
return iconMap.cellEmail
} else if (isYear(column, abstractType)) {
return iconMap.cellDate
} else if (isTime(column, abstractType)) {
return iconMap.cellTime
} else if (isRating(column)) {
return iconMap.cellRating
} else if (isAttachment(column)) {
return iconMap.cellAttachment
} else if (isDecimal(column)) {
return iconMap.cellDecimal
} else if (isPhoneNumber(column)) {
return iconMap.cellPhone
} else if (isURL(column)) {
return iconMap.cellUrl
} else if (isCurrency(column)) {
return iconMap.cellCurrency
} else if (isDuration(column)) {
return iconMap.cellDuration
} else if (isPercent(column)) {
return iconMap.cellPercent
} else if (isGeometry(column)) {
return iconMap.cellGeometry
} else if (isUser(column)) {
if ((column.meta as { is_multi?: boolean; notify?: boolean })?.is_multi) {
return iconMap.cellUser
}
return iconMap.cellUser
} else if (isInt(column, abstractType) || isFloat(column, abstractType)) {
return iconMap.cellNumber
} else if (isString(column, abstractType)) {
return iconMap.cellText
} else {
return iconMap.cellSystemText
}
}
export default defineComponent({
name: 'CellIcon',
props: {
columnMeta: {
type: Object as PropType<ColumnType>,
required: false,
},
},
setup(props) {
const columnMeta = toRef(props, 'columnMeta')
const injectedColumn = inject(ColumnInj, columnMeta)
const column = computed(() => columnMeta.value ?? injectedColumn.value)
const { sqlUis } = storeToRefs(useBase())
const sqlUi = computed(() =>
column.value?.source_id ? sqlUis.value[column.value?.source_id] : Object.values(sqlUis.value)[0],
)
const abstractType = computed(() => column.value && sqlUi.value?.getAbstractType(column.value))
return () => {
if (!column.value && !columnMeta.value) return null
return h(renderIcon((columnMeta.value ?? column.value)!, abstractType.value), {
class: 'text-inherit mx-1 nc-cell-icon',
})
}
},
})