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, 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', }) } }, })