import { ArrayColumnType, ColumnType, FormulaResultType, ITypeOptions, NumberFormat, UpdatableColumnType, } from '../types'; import { CellValueInterchangeableColumnType, ColumnWithResultType, } from '../types/columns'; import { exhaustiveSwitch } from './exhuastiveSwitch'; import { getTypeOptions } from './typeOptions'; export const ARRAY_COLUMN_TYPE: { [key in ColumnType]: key extends ArrayColumnType ? true : false; } = { [ColumnType.TEXT]: false, [ColumnType.PHONE]: false, [ColumnType.EMAIL]: false, [ColumnType.LONG_TEXT]: false, [ColumnType.UNIQUE_ID]: false, [ColumnType.NUMBER]: false, [ColumnType.DATETIME]: false, [ColumnType.SELECT]: false, [ColumnType.STATUS]: false, [ColumnType.MULTI_SELECT]: true, [ColumnType.MULTI_ATTACHMENT]: true, [ColumnType.RECORD_REFERENCE]: true, [ColumnType.LOOKUP]: false, [ColumnType.CHECKBOX]: false, [ColumnType.RATING]: false, [ColumnType.CURRENCY]: false, [ColumnType.FORMULA]: false, [ColumnType.PROGRESS]: false, [ColumnType.ROLLUP]: false, [ColumnType.COLLABORATOR]: true, [ColumnType.AUTO_NUMBER]: false, [ColumnType.CREATED_AT]: false, [ColumnType.CREATED_BY]: false, [ColumnType.INTEGRATION_REFERENCE]: false, [ColumnType.NOOP]: false, [ColumnType.SUBTABLE]: true, }; export const isArrayColumnType = (type: ColumnType): type is ArrayColumnType => ARRAY_COLUMN_TYPE[type]; export const UPDATABLE_COLUMN_TYPE: { [key in ColumnType]: key extends UpdatableColumnType ? true : false; } = { [ColumnType.TEXT]: true, [ColumnType.PHONE]: true, [ColumnType.EMAIL]: true, [ColumnType.LONG_TEXT]: true, [ColumnType.UNIQUE_ID]: false, [ColumnType.NUMBER]: true, [ColumnType.DATETIME]: true, [ColumnType.SELECT]: true, [ColumnType.STATUS]: true, [ColumnType.MULTI_SELECT]: true, [ColumnType.MULTI_ATTACHMENT]: true, [ColumnType.RECORD_REFERENCE]: true, [ColumnType.LOOKUP]: false, [ColumnType.CHECKBOX]: true, [ColumnType.RATING]: true, [ColumnType.CURRENCY]: true, [ColumnType.FORMULA]: false, [ColumnType.PROGRESS]: false, [ColumnType.ROLLUP]: false, [ColumnType.COLLABORATOR]: true, [ColumnType.AUTO_NUMBER]: false, [ColumnType.CREATED_AT]: false, [ColumnType.CREATED_BY]: false, [ColumnType.INTEGRATION_REFERENCE]: false, [ColumnType.NOOP]: false, [ColumnType.SUBTABLE]: true, }; export const isUpdatableColumnType = ( type: ColumnType ): type is UpdatableColumnType => UPDATABLE_COLUMN_TYPE[type]; export const CELL_VALUES_MUTUALLY_INTERCHANGEABLE: { [key in ColumnType]: key extends CellValueInterchangeableColumnType ? true : false; } = { [ColumnType.TEXT]: true, [ColumnType.PHONE]: true, [ColumnType.EMAIL]: true, [ColumnType.LONG_TEXT]: true, [ColumnType.UNIQUE_ID]: false, [ColumnType.NUMBER]: true, [ColumnType.DATETIME]: true, [ColumnType.SELECT]: false, [ColumnType.STATUS]: false, [ColumnType.MULTI_SELECT]: false, [ColumnType.MULTI_ATTACHMENT]: true, [ColumnType.RECORD_REFERENCE]: false, [ColumnType.LOOKUP]: false, [ColumnType.CHECKBOX]: true, [ColumnType.RATING]: false, [ColumnType.CURRENCY]: true, [ColumnType.FORMULA]: false, [ColumnType.PROGRESS]: false, [ColumnType.ROLLUP]: false, [ColumnType.COLLABORATOR]: true, [ColumnType.AUTO_NUMBER]: false, [ColumnType.CREATED_AT]: false, [ColumnType.CREATED_BY]: false, [ColumnType.INTEGRATION_REFERENCE]: false, [ColumnType.NOOP]: false, [ColumnType.SUBTABLE]: false, }; export const isCellValueInterchangeableColumnType = ( type: ColumnType ): type is CellValueInterchangeableColumnType => CELL_VALUES_MUTUALLY_INTERCHANGEABLE[type]; const COLUMN_WITH_RESULT_TYPE: { [key in ColumnType]: key extends ColumnWithResultType ? true : false; } = { [ColumnType.TEXT]: false, [ColumnType.PHONE]: false, [ColumnType.EMAIL]: false, [ColumnType.LONG_TEXT]: false, [ColumnType.UNIQUE_ID]: false, [ColumnType.NUMBER]: false, [ColumnType.DATETIME]: false, [ColumnType.SELECT]: false, [ColumnType.STATUS]: false, [ColumnType.MULTI_SELECT]: false, [ColumnType.MULTI_ATTACHMENT]: false, [ColumnType.RECORD_REFERENCE]: false, [ColumnType.LOOKUP]: false, [ColumnType.CHECKBOX]: false, [ColumnType.RATING]: false, [ColumnType.CURRENCY]: false, [ColumnType.FORMULA]: true, [ColumnType.PROGRESS]: true, [ColumnType.ROLLUP]: true, [ColumnType.COLLABORATOR]: false, [ColumnType.AUTO_NUMBER]: false, [ColumnType.CREATED_AT]: false, [ColumnType.CREATED_BY]: false, [ColumnType.INTEGRATION_REFERENCE]: false, [ColumnType.NOOP]: false, [ColumnType.SUBTABLE]: false, }; const isColumnWithResultType = ( type: ColumnType ): type is ColumnWithResultType => COLUMN_WITH_RESULT_TYPE[type]; export const getFinalColumnType = ( typeOptions: ITypeOptions, ignoreLookup?: boolean ): ColumnType => { if (isColumnWithResultType(typeOptions.type)) { const { resultType, numberFormat } = typeOptions as ITypeOptions; switch (resultType) { case FormulaResultType.TEXT: return ColumnType.TEXT; case FormulaResultType.NUMBER: switch (numberFormat) { case NumberFormat.CURRENCY: return ColumnType.CURRENCY; case NumberFormat.DECIMAL: return ColumnType.NUMBER; default: return ColumnType.NUMBER; } case FormulaResultType.DATE: return ColumnType.DATETIME; default: return exhaustiveSwitch({ switchValue: resultType, returnValue: ColumnType.TEXT, }); } } if (!ignoreLookup && typeOptions.type === ColumnType.LOOKUP) { const { lookupColumnType } = typeOptions as ITypeOptions; if (isColumnWithResultType(lookupColumnType)) { const lookupTypeOptions = getTypeOptions(typeOptions) as ITypeOptions; return getFinalColumnType(lookupTypeOptions); } return lookupColumnType; } return typeOptions.type; };