Skip to content

Commit 01ea736

Browse files
committed
feat: new color field
1 parent ceba9a7 commit 01ea736

42 files changed

Lines changed: 542 additions & 8 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field-visitor.postgres.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import type {
22
AttachmentFieldCore,
33
AutoNumberFieldCore,
4+
ButtonFieldCore,
45
CheckboxFieldCore,
6+
ColorFieldCore,
7+
ConditionalRollupFieldCore,
58
CreatedByFieldCore,
69
CreatedTimeFieldCore,
710
DateFieldCore,
11+
FieldCore,
812
FormulaFieldCore,
13+
IFieldVisitor,
14+
ILinkFieldOptions,
915
LastModifiedByFieldCore,
1016
LastModifiedTimeFieldCore,
1117
LinkFieldCore,
@@ -14,14 +20,9 @@ import type {
1420
NumberFieldCore,
1521
RatingFieldCore,
1622
RollupFieldCore,
17-
ConditionalRollupFieldCore,
1823
SingleLineTextFieldCore,
1924
SingleSelectFieldCore,
2025
UserFieldCore,
21-
IFieldVisitor,
22-
FieldCore,
23-
ILinkFieldOptions,
24-
ButtonFieldCore,
2526
} from '@teable/core';
2627
import { DbFieldType, Relationship } from '@teable/core';
2728
import type { Knex } from 'knex';
@@ -377,6 +378,10 @@ export class CreatePostgresDatabaseColumnFieldVisitor implements IFieldVisitor<v
377378
this.createStandardColumn(field);
378379
}
379380

381+
visitColorField(field: ColorFieldCore): void {
382+
this.createStandardColumn(field);
383+
}
384+
380385
// Formula field types
381386
visitFormulaField(field: FormulaFieldCore): void {
382387
this.createFormulaColumns(field);

apps/nestjs-backend/src/db-provider/drop-database-column-query/drop-database-column-field-visitor.postgres.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {
2424
FieldCore,
2525
ILinkFieldOptions,
2626
ButtonFieldCore,
27+
ColorFieldCore,
2728
} from '@teable/core';
2829
import { DropColumnOperationType } from './drop-database-column-field-visitor.interface';
2930
import type { IDropDatabaseColumnContext } from './drop-database-column-field-visitor.interface';
@@ -215,6 +216,10 @@ export class DropPostgresDatabaseColumnFieldVisitor implements IFieldVisitor<str
215216
return this.dropStandardColumn(field);
216217
}
217218

219+
visitColorField(field: ColorFieldCore): string[] {
220+
return this.dropStandardColumn(field);
221+
}
222+
218223
// Formula field types
219224
visitFormulaField(field: FormulaFieldCore): string[] {
220225
return this.dropFormulaColumns(field);

apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
AutoNumberFieldCore,
66
ButtonFieldCore,
77
CellValueType,
8+
ColorFieldCore,
89
CheckboxFieldCore,
910
ColorUtils,
1011
ConditionalRollupFieldCore,
@@ -1507,6 +1508,18 @@ export class FieldSupplementService {
15071508
};
15081509
}
15091510

1511+
private prepareColorField(field: IFieldRo) {
1512+
const { name, options } = field;
1513+
1514+
return {
1515+
...field,
1516+
name: name ?? 'Color',
1517+
options: options ?? ColorFieldCore.defaultOptions(),
1518+
cellValueType: CellValueType.String,
1519+
dbFieldType: DbFieldType.Text,
1520+
};
1521+
}
1522+
15101523
private async prepareCreateFieldInner(
15111524
tableId: string,
15121525
fieldRo: IFieldRo,
@@ -1557,6 +1570,8 @@ export class FieldSupplementService {
15571570
return this.prepareCheckboxField(fieldRo);
15581571
case FieldType.Button:
15591572
return this.prepareButtonField(fieldRo);
1573+
case FieldType.Color:
1574+
return this.prepareColorField(fieldRo);
15601575
default:
15611576
throw new CustomHttpException(
15621577
`Unsupported field type ${fieldRo.type}`,
@@ -1666,6 +1681,8 @@ export class FieldSupplementService {
16661681
return this.prepareCheckboxField(fieldRo);
16671682
case FieldType.Button:
16681683
return this.prepareButtonField(fieldRo);
1684+
case FieldType.Color:
1685+
return this.prepareColorField(fieldRo);
16691686
case FieldType.LastModifiedBy:
16701687
return this.prepareLastModifiedByField(fieldRo);
16711688
case FieldType.CreatedBy:

apps/nestjs-backend/src/features/field/model/factory.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { instanceToPlain, plainToInstance } from 'class-transformer';
1111
import { AttachmentFieldDto } from './field-dto/attachment-field.dto';
1212
import { AutoNumberFieldDto } from './field-dto/auto-number-field.dto';
1313
import { ButtonFieldDto } from './field-dto/button-field.dto';
14+
import { ColorFieldDto } from './field-dto/color-field.dto';
1415
import { CheckboxFieldDto } from './field-dto/checkbox-field.dto';
1516
import { ConditionalRollupFieldDto } from './field-dto/conditional-rollup-field.dto';
1617
import { CreatedByFieldDto } from './field-dto/created-by-field.dto';
@@ -173,6 +174,8 @@ export function createFieldInstanceByVo(field: IFieldVo) {
173174
return plainToInstance(LastModifiedByFieldDto, normalizedField);
174175
case FieldType.Button:
175176
return plainToInstance(ButtonFieldDto, normalizedField);
177+
case FieldType.Color:
178+
return plainToInstance(ColorFieldDto, normalizedField);
176179
default:
177180
assertNever(normalizedField.type);
178181
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ColorFieldCore } from '@teable/core';
2+
import type { FieldBase } from '../field-base';
3+
4+
export class ColorFieldDto extends ColorFieldCore implements FieldBase {
5+
get isStructuredCellValue() {
6+
return false;
7+
}
8+
9+
convertCellValue2DBValue(value: unknown): unknown {
10+
if (this.isMultipleCellValue) {
11+
return value == null ? value : JSON.stringify(value);
12+
}
13+
return value;
14+
}
15+
16+
convertDBValue2CellValue(value: unknown): unknown {
17+
if (this.isMultipleCellValue) {
18+
return value == null || typeof value === 'object' ? value : JSON.parse(value as string);
19+
}
20+
return value;
21+
}
22+
}

apps/nestjs-backend/src/features/record/query-builder/field-cte-visitor.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
type SingleSelectFieldCore,
3535
type UserFieldCore,
3636
type ButtonFieldCore,
37+
type ColorFieldCore,
3738
type Tables,
3839
type TableDomain,
3940
type ILinkFieldOptions,
@@ -709,6 +710,9 @@ class FieldCteSelectionVisitor implements IFieldVisitor<IFieldSelectName> {
709710
visitButtonField(field: ButtonFieldCore): IFieldSelectName {
710711
return this.visitLookupField(field);
711712
}
713+
visitColorField(field: ColorFieldCore): IFieldSelectName {
714+
return this.visitLookupField(field);
715+
}
712716
}
713717

714718
export class FieldCteVisitor implements IFieldVisitor<ICteResult> {
@@ -2821,6 +2825,7 @@ export class FieldCteVisitor implements IFieldVisitor<ICteResult> {
28212825
visitCreatedByField(_field: CreatedByFieldCore): void {}
28222826
visitLastModifiedByField(_field: LastModifiedByFieldCore): void {}
28232827
visitButtonField(_field: ButtonFieldCore): void {}
2828+
visitColorField(_field: ColorFieldCore): void {}
28242829

28252830
private ensureLinkCteJoined(cteName: string): void {
28262831
if (this.state.isCteJoined(cteName)) {

apps/nestjs-backend/src/features/record/query-builder/field-formatting-visitor.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
type CreatedByFieldCore,
2222
type LastModifiedByFieldCore,
2323
type ButtonFieldCore,
24+
type ColorFieldCore,
2425
type INumberFormatting,
2526
type IDatetimeFormatting,
2627
} from '@teable/core';
@@ -243,4 +244,8 @@ export class FieldFormattingVisitor implements IFieldVisitor<string> {
243244
// Button fields don't have values, return as-is
244245
return this.fieldExpression;
245246
}
247+
248+
visitColorField(_field: ColorFieldCore): string {
249+
return this.fieldExpression;
250+
}
246251
}

apps/nestjs-backend/src/features/record/query-builder/field-select-visitor.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import type {
2222
UserFieldCore,
2323
IFieldVisitor,
2424
ButtonFieldCore,
25+
ColorFieldCore,
2526
TableDomain,
2627
} from '@teable/core';
2728
import { DbFieldType, FieldType, isLinkLookupOptions, DriverClient } from '@teable/core';
@@ -578,6 +579,10 @@ export class FieldSelectVisitor implements IFieldVisitor<IFieldSelectName> {
578579
return this.checkAndSelectLookupField(field);
579580
}
580581

582+
visitColorField(field: ColorFieldCore): IFieldSelectName {
583+
return this.checkAndSelectLookupField(field);
584+
}
585+
581586
// Formula field types - these may use generated columns
582587
visitFormulaField(field: FormulaFieldCore): IFieldSelectName {
583588
// If the formula field has an error (e.g., referenced field deleted), return NULL

apps/nestjs-backend/src/types/i18n.generated.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,6 +2071,9 @@ export type I18nTranslations = {
20712071
"refineOptionsError": string;
20722072
"optionsRequired": string;
20732073
};
2074+
"color": {
2075+
"button": string;
2076+
};
20742077
};
20752078
"filter": {
20762079
"label": string;
@@ -2259,6 +2262,7 @@ export type I18nTranslations = {
22592262
"button": string;
22602263
"createdBy": string;
22612264
"lastModifiedBy": string;
2265+
"color": string;
22622266
};
22632267
"description": {
22642268
"singleLineText": string;
@@ -2283,6 +2287,7 @@ export type I18nTranslations = {
22832287
"button": string;
22842288
"createdBy": string;
22852289
"lastModifiedBy": string;
2290+
"color": string;
22862291
};
22872292
"link": {
22882293
"oneWay": string;
@@ -3876,6 +3881,9 @@ export type I18nTranslations = {
38763881
"title": string;
38773882
"description": string;
38783883
};
3884+
"color": {
3885+
"title": string;
3886+
};
38793887
};
38803888
"editor": {
38813889
"addField": string;
@@ -4019,6 +4027,7 @@ export type I18nTranslations = {
40194027
"button": string;
40204028
"lookup": string;
40214029
"conditionalRollup": string;
4030+
"color": string;
40224031
};
40234032
"fieldName": string;
40244033
"fieldNameOptional": string;

apps/nextjs-app/src/features/app/components/field-setting/FieldOptions.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { useFields } from '@teable/sdk/hooks';
2929
import { useMemo } from 'react';
3030
import { ButtonOptions } from './options/ButtonOptions';
3131
import { CheckboxOptions } from './options/CheckboxOptions';
32+
import { ColorOptions } from './options/ColorOptions';
3233
import { ConditionalRollupOptions } from './options/ConditionalRollupOptions';
3334
import { CreatedTimeOptions } from './options/CreatedTimeOptions';
3435
import { DateOptions } from './options/DateOptions';
@@ -202,6 +203,8 @@ export const FieldOptions: React.FC<IFieldOptionsProps> = ({ field, onChange, on
202203
onSave={onSave}
203204
/>
204205
);
206+
case FieldType.Color:
207+
return <ColorOptions />;
205208
default:
206209
return <></>;
207210
}

0 commit comments

Comments
 (0)