0d4fe4575b
## Summary - **Refactor frontend metadata loading architecture**: Split the monolithic `EagerMetadataLoadEffect` into focused provider effects (`UserMetadataProviderEffect`, `ObjectMetadataProviderEffect`, `ViewMetadataProviderEffect`) orchestrated by `MetadataProviderEffects`. Replaced `UserProvider` + `ObjectMetadataItemsProvider` with a single `MetadataGater` that gates rendering on `isAppMetadataReadyState`. The metadata store now validates view-object consistency before promoting views, and `updateDraft` skips no-op updates via deep equality checks. - **SDK CLI improvements**: Added `app:typecheck` command, improved error handling in API sync (extracts GraphQL error messages), added `serializeError` utility for human-readable error output, added `error` file status to dev mode orchestrator with UI support, and fixed ClickHouse migration/seed commands to use `transpile-only`.
147 lines
4.0 KiB
TypeScript
147 lines
4.0 KiB
TypeScript
import type { ObjectConfig } from '@/sdk/objects/object-config';
|
|
import { FieldMetadataType } from 'twenty-shared/types';
|
|
import { generateDefaultFieldUniversalIdentifier } from '@/cli/utilities/build/manifest/utils/generate-default-field-universal-identifier';
|
|
import { type ObjectFieldManifest } from 'twenty-shared/application';
|
|
|
|
export const getDefaultObjectFields = (
|
|
objectConfig: ObjectConfig,
|
|
): ObjectFieldManifest[] => {
|
|
const idField: ObjectFieldManifest = {
|
|
name: 'id',
|
|
label: 'Id',
|
|
description: 'Id',
|
|
icon: 'Icon123',
|
|
isNullable: false,
|
|
defaultValue: 'uuid',
|
|
type: FieldMetadataType.UUID as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'id',
|
|
}),
|
|
};
|
|
|
|
const nameField: ObjectFieldManifest = {
|
|
name: 'name',
|
|
label: 'Name',
|
|
description: 'Name',
|
|
icon: 'IconAbc',
|
|
isNullable: true,
|
|
defaultValue: null,
|
|
type: FieldMetadataType.TEXT as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'name',
|
|
}),
|
|
};
|
|
|
|
const createdAtField: ObjectFieldManifest = {
|
|
name: 'createdAt',
|
|
label: 'Creation date',
|
|
description: 'Creation date',
|
|
icon: 'IconCalendar',
|
|
isNullable: false,
|
|
defaultValue: 'now',
|
|
type: FieldMetadataType.DATE_TIME as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'createdAt',
|
|
}),
|
|
};
|
|
|
|
const updatedAtField: ObjectFieldManifest = {
|
|
name: 'updatedAt',
|
|
label: 'Last update',
|
|
description: 'Last time the record was changed',
|
|
icon: 'IconCalendarClock',
|
|
isNullable: false,
|
|
defaultValue: 'now',
|
|
type: FieldMetadataType.DATE_TIME as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'updatedAt',
|
|
}),
|
|
};
|
|
|
|
const deletedAtField: ObjectFieldManifest = {
|
|
name: 'deletedAt',
|
|
label: 'Deleted at',
|
|
description: 'Deletion date',
|
|
icon: 'IconCalendarClock',
|
|
isNullable: true,
|
|
defaultValue: null,
|
|
type: FieldMetadataType.DATE_TIME as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'deletedAt',
|
|
}),
|
|
};
|
|
|
|
const createdByField: ObjectFieldManifest = {
|
|
name: 'createdBy',
|
|
label: 'Created by',
|
|
description: 'The creator of the record',
|
|
icon: 'IconCreativeCommonsSa',
|
|
isNullable: false,
|
|
defaultValue: { name: "''", source: "'MANUAL'" },
|
|
type: FieldMetadataType.ACTOR as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'createdBy',
|
|
}),
|
|
};
|
|
|
|
const updatedByField: ObjectFieldManifest = {
|
|
name: 'updatedBy',
|
|
label: 'Updated by',
|
|
description: 'The workspace member who last updated the record',
|
|
icon: 'IconUserCircle',
|
|
isNullable: false,
|
|
defaultValue: { name: "''", source: "'MANUAL'" },
|
|
type: FieldMetadataType.ACTOR as const,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'updatedBy',
|
|
}),
|
|
};
|
|
|
|
const positionField: ObjectFieldManifest = {
|
|
name: 'position',
|
|
label: 'Position',
|
|
description: 'Position',
|
|
icon: 'IconHierarchy2',
|
|
isNullable: false,
|
|
defaultValue: 0,
|
|
type: FieldMetadataType.POSITION,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'position',
|
|
}),
|
|
};
|
|
|
|
const searchVectorField: ObjectFieldManifest = {
|
|
name: 'searchVector',
|
|
label: 'Search vector',
|
|
icon: 'IconSearch',
|
|
description: 'Search vector',
|
|
isNullable: true,
|
|
defaultValue: null,
|
|
type: FieldMetadataType.TS_VECTOR,
|
|
universalIdentifier: generateDefaultFieldUniversalIdentifier({
|
|
objectConfig,
|
|
fieldName: 'searchVector',
|
|
}),
|
|
};
|
|
|
|
return [
|
|
idField,
|
|
nameField,
|
|
createdAtField,
|
|
updatedAtField,
|
|
deletedAtField,
|
|
createdByField,
|
|
updatedByField,
|
|
positionField,
|
|
searchVectorField,
|
|
];
|
|
};
|