mirror of https://github.com/nocodb/nocodb
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.
234 lines
5.4 KiB
234 lines
5.4 KiB
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 && |
|
(<LinkToAnotherRecordType>col.colOptions).type === RelationTypes.BELONGS_TO && |
|
isColumnRequired(columns.find((c) => c.id === (<LinkToAnotherRecordType>col.colOptions).fk_child_column_id)) |
|
|
|
const isColumnRequiredAndNull = (col: ColumnType, row: Record<string, any>) => { |
|
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, |
|
].includes(uidt) |
|
} |
|
|
|
export { |
|
uiTypes, |
|
isTypableInputColumn, |
|
getUIDTIcon, |
|
getUniqueColumnName, |
|
isColumnRequiredAndNull, |
|
isColumnRequired, |
|
isVirtualColRequired, |
|
}
|
|
|