import type { ColumnType, LinkToAnotherRecordType } from 'nocodb-sdk' import { RelationTypes, UITypes } from 'nocodb-sdk' import LinkVariant from '~icons/mdi/link-variant' import QrCodeScan from '~icons/mdi/qrcode-scan' import BarcodeScan from '~icons/mdi/barcode-scan' import FormatColorText from '~icons/mdi/format-color-text' import TextSubject from '~icons/mdi/text-subject' import JSONIcon from '~icons/mdi/code-json' import SpecificDBTypeIcon from '~icons/mdi/database-settings' import Attachment from '~icons/mdi/attachment' import Marker from '~icons/mdi/map-marker' import CheckboxMarkedOutline from '~icons/mdi/checkbox-marked-outline' import FormatListBulletedSquare from '~icons/mdi/format-list-bulleted-square' import ArrowDownDropCircle from '~icons/mdi/arrow-down-drop-circle' import CalendarMonth from '~icons/mdi/calendar-month' import Calendar from '~icons/mdi/calendar' import Clock from '~icons/mdi/clock' import FilePhone from '~icons/mdi/file-phone' import Email from '~icons/mdi/email' import Web from '~icons/mdi/web' import Numeric from '~icons/mdi/numeric' import Decimal from '~icons/mdi/decimal' import CurrencyUsdCircleOutline from '~icons/mdi/currency-usd-circle-outline' import PercentOutline from '~icons/mdi/percent-outline' import TimerOutline from '~icons/mdi/timer-outline' import Star from '~icons/mdi/star' import MathIntegral from '~icons/mdi/math-integral' import MovieRoll from '~icons/mdi/movie-roll' import CalendarClock from '~icons/mdi/calendar-clock' import ID from '~icons/mdi/identifier' import RulerSquareCompass from '~icons/mdi/ruler-square-compass' import MdiTextSearchVariant from '~icons/mdi/text-search-variant' const uiTypes = [ { name: UITypes.LinkToAnotherRecord, icon: LinkVariant, virtual: 1, }, { name: UITypes.Lookup, icon: MdiTextSearchVariant, virtual: 1, }, { name: UITypes.SingleLineText, icon: FormatColorText, }, { name: UITypes.LongText, icon: TextSubject, }, { name: UITypes.Attachment, icon: Attachment, }, { name: UITypes.Checkbox, icon: CheckboxMarkedOutline, }, { name: UITypes.MultiSelect, icon: FormatListBulletedSquare, }, { name: UITypes.SingleSelect, icon: ArrowDownDropCircle, }, { name: UITypes.Date, icon: CalendarMonth, }, { name: UITypes.Year, icon: Calendar, }, { name: UITypes.Time, icon: Clock, }, { name: UITypes.PhoneNumber, icon: FilePhone, }, { name: UITypes.Email, icon: Email, }, { name: UITypes.URL, icon: Web, }, { name: UITypes.Number, icon: Numeric, }, { name: UITypes.Decimal, icon: Decimal, }, { name: UITypes.Currency, icon: CurrencyUsdCircleOutline, }, { name: UITypes.Percent, icon: PercentOutline, }, { name: UITypes.Duration, icon: TimerOutline, }, { name: UITypes.Rating, icon: Star, }, { name: UITypes.Formula, icon: MathIntegral, virtual: 1, }, { name: UITypes.Rollup, icon: MovieRoll, virtual: 1, }, { name: UITypes.DateTime, icon: CalendarClock, }, { name: UITypes.QrCode, icon: QrCodeScan, virtual: 1, }, { name: UITypes.Barcode, icon: BarcodeScan, virtual: 1, }, { name: UITypes.Geometry, icon: RulerSquareCompass, }, { name: UITypes.GeoData, icon: Marker, }, { name: UITypes.JSON, icon: JSONIcon, }, { name: UITypes.SpecificDBType, icon: SpecificDBTypeIcon, }, ] const getUIDTIcon = (uidt: UITypes | string) => { return ( [ ...uiTypes, { name: UITypes.CreateTime, icon: CalendarClock, }, { name: UITypes.ID, icon: ID, }, { name: UITypes.ForeignKey, icon: LinkVariant, }, ].find((t) => t.name === uidt) || {} ).icon } // treat column as required if `non_null` is true and one of the following is true // 1. column not having default value // 2. column is not auto increment // 3. column is not auto generated const isColumnRequired = (col?: ColumnType) => col && col.rqd && !col.cdf && !col.ai && !col.meta?.ag const isVirtualColRequired = (col: ColumnType, columns: ColumnType[]) => col.uidt === UITypes.LinkToAnotherRecord && (col.colOptions).type === RelationTypes.BELONGS_TO && isColumnRequired(columns.find((c) => c.id === (col.colOptions).fk_child_column_id)) const isColumnRequiredAndNull = (col: ColumnType, row: Record) => { return isColumnRequired(col) && (row[col.title!] === undefined || row[col.title!] === null) } const getUniqueColumnName = (initName: string, columns: ColumnType[]) => { let name = initName let i = 1 while (columns.find((c) => c.title === name)) { name = `${initName}_${i}` i++ } return name } const isTypableInputColumn = (colOrUidt: ColumnType | UITypes) => { let uidt: UITypes if (typeof colOrUidt === 'object') { uidt = colOrUidt.uidt as UITypes } else { uidt = colOrUidt } return [ UITypes.LongText, UITypes.SingleLineText, UITypes.Number, UITypes.PhoneNumber, UITypes.Email, UITypes.Decimal, UITypes.Currency, UITypes.Percent, UITypes.Duration, UITypes.JSON, UITypes.URL, ].includes(uidt) } export { uiTypes, isTypableInputColumn, getUIDTIcon, getUniqueColumnName, isColumnRequiredAndNull, isColumnRequired, isVirtualColRequired, }