import { ColumnType, FormulaResultType, IDFormat, NumberFormat, StatusType, } from './graphql-global-types'; type ITypeOptionNotDefined = `Some ColumnType not defined in ITypeOptions`; export type ITypeOptions = /** * If a column has no special type options, it is given Generic Type Options * which just has the columns Type in it. */ T extends | ColumnType.NOOP | ColumnType.INTEGRATION_REFERENCE | ColumnType.AUTO_NUMBER | ColumnType.CREATED_BY ? IGenericTypeOptions : T extends | ColumnType.CHECKBOX | ColumnType.LONG_TEXT | ColumnType.MULTI_ATTACHMENT | ColumnType.TEXT | ColumnType.PHONE | ColumnType.EMAIL ? IGenericRequiredColumnTypeOptions : /** * Otherwise, if a column has special type options, they are designated below. * * There's an annoying typescript issue where if the compiler has to take * too many steps to evaluate a type, it assumes it's an infinite loop and * errors. The remaining column types are arbitrarily divided into two * groups to reduce the number of steps needed to evaluate ITypeOptions. * */ T extends | ColumnType.NUMBER | ColumnType.CURRENCY | ColumnType.DATETIME | ColumnType.STATUS | ColumnType.SELECT | ColumnType.MULTI_SELECT | ColumnType.RECORD_REFERENCE ? T extends ColumnType.NUMBER ? INumberTypeOptions : T extends ColumnType.CURRENCY ? ICurrencyTypeOptions : T extends ColumnType.DATETIME ? IDateTimeTypeOptions : T extends ColumnType.SELECT | ColumnType.MULTI_SELECT ? ISelectTypeOptions : T extends ColumnType.STATUS ? IStatusTypeOptions : T extends ColumnType.RECORD_REFERENCE ? IRecordReferenceTypeOptions : T extends never ? never : ITypeOptionNotDefined : T extends ColumnType.LOOKUP ? ILookupTypeOptions : T extends ColumnType.ROLLUP ? IRollupTypeOptions : T extends ColumnType.UNIQUE_ID ? IUniqueIdOptions : T extends ColumnType.RATING ? IRatingOptions : T extends ColumnType.FORMULA ? IFormulaOptions : T extends ColumnType.PROGRESS ? IProgressOptions : T extends ColumnType.COLLABORATOR ? ICollaboratorTypeOptions : T extends ColumnType.CREATED_AT ? ICreatedAtTypeOptions : T extends ColumnType.SUBTABLE ? ISubTableTypeOptions : T extends never ? never : ITypeOptionNotDefined; /********************************* GENERIC ***********************************/ interface IGenericTypeOptions { type: T; } interface IGenericRequiredColumnTypeOptions extends IGenericTypeOptions { required?: boolean; } /********************************* NUMERIC ***********************************/ interface IGenericNumericTypeOptions { defaultNumber?: number; precision: number; } interface INumberTypeOptions extends IGenericRequiredColumnTypeOptions, IGenericNumericTypeOptions { numberFormat: NumberFormat; } interface ICurrencyTypeOptions extends IGenericRequiredColumnTypeOptions, IGenericNumericTypeOptions { currencyFormat: string; } /********************************* DATETIME **********************************/ export enum DateFormat { LOCAL = 'LOCAL', FRIENDLY = 'FRIENDLY', SLASH = 'SLASH', ISO = 'ISO', FORMULA_PARSE_FORMAT = 'FORMULA_PARSE_FORMAT', } export enum TimeFormat { TWELVE_HOUR = 'TWELVE_HOUR', TWOFOUR_HOUR = 'TWOFOUR_HOUR', } interface IGenericDateTimeTypeOptions { dateFormat: DateFormat; includeTime: boolean; timeFormat: TimeFormat; useGMT: boolean; useCurrentDateTime?: boolean; } interface IDateTimeTypeOptions extends IGenericRequiredColumnTypeOptions, IGenericDateTimeTypeOptions {} /******************************** FORMULAIC **********************************/ interface IFormulaicTypeOptions extends Partial, Partial>, Partial> { formula: string; errorCode?: string; resultType: FormulaResultType; } interface IFormulaOptions extends IGenericTypeOptions, IFormulaicTypeOptions {} interface IProgressOptions extends IGenericTypeOptions, IProgressTypeOptions {} interface IProgressTypeOptions { type: ColumnType.PROGRESS; formula: string; numberFormat?: NumberFormat; resultType: FormulaResultType.NUMBER; precision?: number; showBarProgress?: boolean; } interface IRollupTypeOptions extends IGenericTypeOptions, IFormulaicTypeOptions { recordReferenceColumnId?: string; } /********************************** SELECT ***********************************/ export enum SelectColor { blueDarkest = 'blueDarkest', peacockDarkest = 'peacockDarkest', tiffanyDarkest = 'tiffanyDarkest', greenDarkest = 'greenDarkest', yellowDarkest = 'yellowDarkest', orangeDarkest = 'orangeDarkest', redDarkest = 'redDarkest', pinkDarkest = 'pinkDarkest', purpleDarkest = 'purpleDarkest', bluishVioletDarkest = 'bluishVioletDarkest', greyDarkest = 'greyDarkest', blackDarkest = 'blackDarkest', blueLightest = 'blueLightest', peacockLightest = 'peacockLightest', tiffanyLightest = 'tiffanyLightest', greenLightest = 'greenLightest', yellowLightest = 'yellowLightest', orangeLightest = 'orangeLightest', redLightest = 'redLightest', pinkLightest = 'pinkLightest', purpleLightest = 'purpleLightest', bluishVioletLightest = 'bluishVioletLightest', greyLightest = 'greyLightest', blackLightest = 'blackLightest', } export interface ISelect { color: SelectColor; name: string; optionId: string; order?: number; } interface ISelectTypeOptions extends IGenericRequiredColumnTypeOptions< ColumnType.SELECT | ColumnType.MULTI_SELECT > { options: ISelect[]; } /********************************** STATUS ***********************************/ export interface IStatus { name: string; order: number; type: StatusType; statusId: string; color?: SelectColor; icon?: string; } interface IStatusTypeOptions extends IGenericRequiredColumnTypeOptions { statuses: IStatus[]; statusColumnId?: string; assigneeColumnId?: string; endTimeColumnId?: string; } /***************************** RECORD_REFERENCE ******************************/ interface IRecordReferenceTypeOptions extends IGenericRequiredColumnTypeOptions { foreignWorkspaceId?: string; foreignTableId: string; foreignViewId?: string; useMultiple?: boolean; symmetricColumnId?: string; } /********************************** LOOKUP ***********************************/ type NonLookupableColumnTypes = | ColumnType.NOOP | ColumnType.LOOKUP | ColumnType.INTEGRATION_REFERENCE; type LookupableColumnTypes = Exclude; export interface ILookupTypeOptions extends IGenericTypeOptions { recordReferenceColumnId: string; foreignLookupColumnId: string; errorCode?: string; lookupColumnType: LookupableColumnTypes; lookupTypeOptions: ITypeOptions; } /********************************** RATING ***********************************/ interface IRatingOptions extends IGenericRequiredColumnTypeOptions { ratingMax: number; } /******************************** UNIQUE_ID **********************************/ interface IUniqueIdOptions extends IGenericTypeOptions { idFormat?: IDFormat; } /******************************* COLLABORATOR ********************************/ interface ICollaboratorTypeOptions extends IGenericRequiredColumnTypeOptions { useMultiple: boolean; useGroup: boolean; useNotify: boolean; groups: string[]; } /******************************* CREATED_AT ********************************/ interface ICreatedAtTypeOptions { type: ColumnType.CREATED_AT | ColumnType.LOOKUP; dateFormat: DateFormat; includeTime: boolean; timeFormat: TimeFormat; useGMT: boolean; } /******************************* SUBTABLE ********************************/ export interface ISubTableTypeOptions extends IGenericRequiredColumnTypeOptions { type: ColumnType.SUBTABLE; symmetricColumnId?: string; foreignWorkspaceId?: string; foreignTableId: string; foreignViewId?: string; subTableBatchAddForeignColumnId?: string | null; isSubTable?: boolean; }