Prefil fields widgets to standard app (#17897)
## Context
Prefill the FIELDS widget configuration in standard page layouts during
workspace creation, linking each widget to a dedicated view with
positioned fields organized into sections (via view field groups)
We wanted something very declarative (by manually setting position and
visibility of each field per standard object).
In this PR I've generated all the compute- utils via AI (😨) for
position/visibility, we'll probably want to confirm with the product
which ordering/visibility we want for each standard object but I feel
like this can be merged as it is since it's behind a feature flag and
this will unblock the work on the frontend
This commit is contained in:
@@ -1606,6 +1606,7 @@ export type FieldRichTextConfiguration = {
|
||||
export type FieldsConfiguration = {
|
||||
__typename?: 'FieldsConfiguration';
|
||||
configurationType: WidgetConfigurationType;
|
||||
viewId?: Maybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export type File = {
|
||||
@@ -4844,6 +4845,7 @@ export enum ViewSortDirection {
|
||||
|
||||
export enum ViewType {
|
||||
CALENDAR = 'CALENDAR',
|
||||
FIELDS_WIDGET = 'FIELDS_WIDGET',
|
||||
KANBAN = 'KANBAN',
|
||||
TABLE = 'TABLE'
|
||||
}
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
import { type MigrationInterface, type QueryRunner } from 'typeorm';
|
||||
|
||||
export class AddFieldsWidgetViewType1770906704231
|
||||
implements MigrationInterface
|
||||
{
|
||||
name = 'AddFieldsWidgetViewType1770906704231';
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_type_enum" ADD VALUE IF NOT EXISTS 'FIELDS_WIDGET' AFTER 'CALENDAR'`,
|
||||
);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."view_type_enum_old" AS ENUM('CALENDAR', 'KANBAN', 'TABLE')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "type" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "type" TYPE "core"."view_type_enum_old" USING "type"::"text"::"core"."view_type_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "type" SET DEFAULT 'TABLE'`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."view_type_enum"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_type_enum_old" RENAME TO "view_type_enum"`,
|
||||
);
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -1,6 +1,6 @@
|
||||
import { Field, ObjectType } from '@nestjs/graphql';
|
||||
|
||||
import { IsIn, IsNotEmpty } from 'class-validator';
|
||||
import { IsIn, IsNotEmpty, IsOptional, IsUUID } from 'class-validator';
|
||||
|
||||
import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type';
|
||||
import { PageLayoutWidgetConfigurationBase } from 'src/engine/metadata-modules/page-layout-widget/types/page-layout-widget-configurationt-base.type';
|
||||
@@ -13,4 +13,9 @@ export class FieldsConfigurationDTO
|
||||
@IsIn([WidgetConfigurationType.FIELDS])
|
||||
@IsNotEmpty()
|
||||
configurationType: WidgetConfigurationType.FIELDS;
|
||||
|
||||
@Field(() => String, { nullable: true })
|
||||
@IsOptional()
|
||||
@IsUUID()
|
||||
viewId: string | null;
|
||||
}
|
||||
|
||||
@@ -2,4 +2,5 @@ export enum ViewType {
|
||||
TABLE = 'TABLE',
|
||||
KANBAN = 'KANBAN',
|
||||
CALENDAR = 'CALENDAR',
|
||||
FIELDS_WIDGET = 'FIELDS_WIDGET',
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { type AllStandardObjectViewName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-name.type';
|
||||
import { type AllStandardObjectView } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view.type';
|
||||
|
||||
export type AllStandardObjectViewFieldGroupName<
|
||||
T extends AllStandardObjectName,
|
||||
V extends AllStandardObjectViewName<T>,
|
||||
> = AllStandardObjectView<T>[V] extends {
|
||||
viewFieldGroups: infer ViewFieldGroups;
|
||||
}
|
||||
? keyof ViewFieldGroups
|
||||
: never;
|
||||
+746
-533
File diff suppressed because it is too large
Load Diff
+31
@@ -4,6 +4,7 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
|
||||
import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { type AllStandardObjectViewFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-field-name.type';
|
||||
import { type AllStandardObjectViewFieldGroupName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-field-group-name.type';
|
||||
import { type AllStandardObjectViewGroupName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-group-name.type';
|
||||
import { type AllStandardObjectViewName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-name.type';
|
||||
|
||||
@@ -12,6 +13,10 @@ type StandardObjectViewIds<O extends AllStandardObjectName> = {
|
||||
id: string;
|
||||
viewGroups: Record<AllStandardObjectViewGroupName<O, V>, { id: string }>;
|
||||
viewFields: Record<AllStandardObjectViewFieldName<O, V>, { id: string }>;
|
||||
viewFieldGroups: Record<
|
||||
AllStandardObjectViewFieldGroupName<O, V>,
|
||||
{ id: string }
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -79,10 +84,36 @@ const computeStandardViewObjectIds = <O extends AllStandardObjectName>({
|
||||
}
|
||||
}
|
||||
|
||||
const viewFieldGroupIds = {} as Record<
|
||||
AllStandardObjectViewFieldGroupName<O, typeof viewName>,
|
||||
{ id: string }
|
||||
>;
|
||||
|
||||
if (
|
||||
Object.prototype.hasOwnProperty.call(viewDefinition, 'viewFieldGroups')
|
||||
) {
|
||||
const viewFieldGroupNames = Object.keys(
|
||||
(viewDefinition as { viewFieldGroups: Record<string, unknown> })
|
||||
.viewFieldGroups,
|
||||
);
|
||||
|
||||
for (const viewFieldGroupName of viewFieldGroupNames) {
|
||||
viewFieldGroupIds[
|
||||
viewFieldGroupName as AllStandardObjectViewFieldGroupName<
|
||||
O,
|
||||
typeof viewName
|
||||
>
|
||||
] = {
|
||||
id: v4(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
viewIds[viewName] = {
|
||||
id: v4(),
|
||||
viewFields: viewFieldIds,
|
||||
viewGroups: viewGroupIds,
|
||||
viewFieldGroups: viewFieldGroupIds,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+143
-19
@@ -1,14 +1,20 @@
|
||||
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
|
||||
import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
|
||||
import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type';
|
||||
import { WidgetType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-type.enum';
|
||||
import { type AllPageLayoutWidgetConfiguration } from 'src/engine/metadata-modules/page-layout-widget/types/all-page-layout-widget-configuration.type';
|
||||
import { STANDARD_RECORD_PAGE_LAYOUTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-page-layout.constant';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { type StandardRecordPageLayoutConfig } from 'src/engine/workspace-manager/twenty-standard-application/utils/page-layout-config/standard-page-layout-config.type';
|
||||
import { computeMyFirstDashboardWidgets } from 'src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/compute-my-first-dashboard-widgets.util';
|
||||
import {
|
||||
type CreateStandardPageLayoutWidgetArgs,
|
||||
type CreateStandardPageLayoutWidgetContext,
|
||||
createStandardPageLayoutWidgetFlatMetadata,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/page-layout-widget/create-standard-page-layout-widget-flat-metadata.util';
|
||||
import { findObjectNameByUniversalIdentifier } from 'src/engine/workspace-manager/twenty-standard-application/utils/page-layout/create-standard-page-layout-flat-metadata.util';
|
||||
@@ -36,6 +42,122 @@ const RECORD_PAGE_LAYOUT_WIDGET_TYPES = [
|
||||
WidgetType.WORKFLOW_RUN,
|
||||
];
|
||||
|
||||
const WIDGET_TYPE_TO_CONFIGURATION_TYPE: Partial<
|
||||
Record<WidgetType, WidgetConfigurationType>
|
||||
> = {
|
||||
[WidgetType.FIELDS]: WidgetConfigurationType.FIELDS,
|
||||
[WidgetType.FIELD]: WidgetConfigurationType.FIELD,
|
||||
[WidgetType.STANDALONE_RICH_TEXT]:
|
||||
WidgetConfigurationType.STANDALONE_RICH_TEXT,
|
||||
[WidgetType.TIMELINE]: WidgetConfigurationType.TIMELINE,
|
||||
[WidgetType.TASKS]: WidgetConfigurationType.TASKS,
|
||||
[WidgetType.NOTES]: WidgetConfigurationType.NOTES,
|
||||
[WidgetType.FILES]: WidgetConfigurationType.FILES,
|
||||
[WidgetType.EMAILS]: WidgetConfigurationType.EMAILS,
|
||||
[WidgetType.CALENDAR]: WidgetConfigurationType.CALENDAR,
|
||||
[WidgetType.FIELD_RICH_TEXT]: WidgetConfigurationType.FIELD_RICH_TEXT,
|
||||
[WidgetType.WORKFLOW]: WidgetConfigurationType.WORKFLOW,
|
||||
[WidgetType.WORKFLOW_VERSION]: WidgetConfigurationType.WORKFLOW_VERSION,
|
||||
[WidgetType.WORKFLOW_RUN]: WidgetConfigurationType.WORKFLOW_RUN,
|
||||
};
|
||||
|
||||
const RECORD_PAGE_FIELDS_VIEW_NAME_BY_OBJECT: Partial<
|
||||
Record<AllStandardObjectName, string>
|
||||
> = {
|
||||
company: 'companyRecordPageFields',
|
||||
person: 'personRecordPageFields',
|
||||
opportunity: 'opportunityRecordPageFields',
|
||||
task: 'taskRecordPageFields',
|
||||
note: 'noteRecordPageFields',
|
||||
};
|
||||
|
||||
const buildRecordPageWidgetConfigurations = ({
|
||||
widgetType,
|
||||
layoutObjectName,
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
}: {
|
||||
widgetType: WidgetType;
|
||||
layoutObjectName: AllStandardObjectName | null;
|
||||
standardObjectMetadataRelatedEntityIds: BuildStandardFlatPageLayoutWidgetMetadataMapsArgs['standardObjectMetadataRelatedEntityIds'];
|
||||
}): {
|
||||
configuration: AllPageLayoutWidgetConfiguration;
|
||||
universalConfiguration: CreateStandardPageLayoutWidgetContext['universalConfiguration'];
|
||||
} => {
|
||||
if (widgetType === WidgetType.FIELDS && isDefined(layoutObjectName)) {
|
||||
return buildFieldsWidgetConfiguration({
|
||||
objectName: layoutObjectName,
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
});
|
||||
}
|
||||
|
||||
const configurationType = WIDGET_TYPE_TO_CONFIGURATION_TYPE[widgetType];
|
||||
|
||||
if (!configurationType) {
|
||||
throw new Error(
|
||||
`No configuration type mapping for widget type ${widgetType}`,
|
||||
);
|
||||
}
|
||||
|
||||
const baseConfig = { configurationType };
|
||||
|
||||
return {
|
||||
// @ts-expect-error ignore - configurationType is validated but TS can't match to discriminated union
|
||||
configuration: baseConfig,
|
||||
// @ts-expect-error ignore - we'd need to implement for each widget type (including unused GRAPH type) to be able to match to the discriminated union
|
||||
universalConfiguration: baseConfig,
|
||||
};
|
||||
};
|
||||
|
||||
const buildFieldsWidgetConfiguration = ({
|
||||
objectName,
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
}: {
|
||||
objectName: AllStandardObjectName;
|
||||
standardObjectMetadataRelatedEntityIds: BuildStandardFlatPageLayoutWidgetMetadataMapsArgs['standardObjectMetadataRelatedEntityIds'];
|
||||
}): {
|
||||
configuration: AllPageLayoutWidgetConfiguration;
|
||||
universalConfiguration: CreateStandardPageLayoutWidgetContext['universalConfiguration'];
|
||||
} => {
|
||||
const recordPageFieldsViewName =
|
||||
RECORD_PAGE_FIELDS_VIEW_NAME_BY_OBJECT[objectName];
|
||||
|
||||
if (!recordPageFieldsViewName) {
|
||||
return {
|
||||
configuration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
viewId: null,
|
||||
},
|
||||
universalConfiguration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
viewId: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
const views = standardObjectMetadataRelatedEntityIds[objectName]
|
||||
.views as Record<string, { id: string }>;
|
||||
|
||||
const viewId = views[recordPageFieldsViewName]?.id ?? null;
|
||||
|
||||
// @ts-expect-error ignore
|
||||
const viewDefinition = STANDARD_OBJECTS[objectName].views?.[
|
||||
recordPageFieldsViewName
|
||||
] as { universalIdentifier: string } | undefined;
|
||||
|
||||
const viewUniversalIdentifier = viewDefinition?.universalIdentifier ?? null;
|
||||
|
||||
return {
|
||||
configuration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
viewId,
|
||||
},
|
||||
universalConfiguration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
viewId: viewUniversalIdentifier,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
const computeRecordPageWidgets = ({
|
||||
now,
|
||||
workspaceId,
|
||||
@@ -51,18 +173,16 @@ const computeRecordPageWidgets = ({
|
||||
] as StandardRecordPageLayoutConfig;
|
||||
|
||||
let layoutObjectMetadataId: string | null = null;
|
||||
let layoutObjectName: AllStandardObjectName | null = null;
|
||||
|
||||
if (layout.objectUniversalIdentifier) {
|
||||
const objectName = findObjectNameByUniversalIdentifier(
|
||||
layout.objectUniversalIdentifier,
|
||||
);
|
||||
) as AllStandardObjectName;
|
||||
|
||||
if (objectName) {
|
||||
layoutObjectMetadataId =
|
||||
standardObjectMetadataRelatedEntityIds[
|
||||
objectName as keyof typeof standardObjectMetadataRelatedEntityIds
|
||||
]?.id ?? null;
|
||||
}
|
||||
layoutObjectName = objectName;
|
||||
layoutObjectMetadataId =
|
||||
standardObjectMetadataRelatedEntityIds[objectName]?.id ?? null;
|
||||
}
|
||||
|
||||
for (const tabTitle of Object.keys(layout.tabs)) {
|
||||
@@ -71,16 +191,24 @@ const computeRecordPageWidgets = ({
|
||||
for (const widgetName of Object.keys(tab.widgets)) {
|
||||
const widget = tab.widgets[widgetName];
|
||||
|
||||
const objectMetadataId = RECORD_PAGE_LAYOUT_WIDGET_TYPES.includes(
|
||||
const isRecordPageWidget = RECORD_PAGE_LAYOUT_WIDGET_TYPES.includes(
|
||||
widget.type,
|
||||
)
|
||||
);
|
||||
|
||||
const objectMetadataId = isRecordPageWidget
|
||||
? layoutObjectMetadataId
|
||||
: null;
|
||||
|
||||
const objectMetadataUniversalIdentifier =
|
||||
RECORD_PAGE_LAYOUT_WIDGET_TYPES.includes(widget.type)
|
||||
? (layout.objectUniversalIdentifier ?? null)
|
||||
: null;
|
||||
const objectMetadataUniversalIdentifier = isRecordPageWidget
|
||||
? (layout.objectUniversalIdentifier ?? null)
|
||||
: null;
|
||||
|
||||
const { configuration, universalConfiguration } =
|
||||
buildRecordPageWidgetConfigurations({
|
||||
widgetType: widget.type,
|
||||
layoutObjectName,
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
});
|
||||
|
||||
allWidgets.push(
|
||||
createStandardPageLayoutWidgetFlatMetadata({
|
||||
@@ -98,12 +226,8 @@ const computeRecordPageWidgets = ({
|
||||
type: widget.type,
|
||||
gridPosition: widget.gridPosition,
|
||||
position: widget.position ?? null,
|
||||
configuration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
},
|
||||
universalConfiguration: {
|
||||
configurationType: WidgetConfigurationType.FIELDS,
|
||||
},
|
||||
configuration,
|
||||
universalConfiguration,
|
||||
objectMetadataId,
|
||||
conditionalDisplay: widget.conditionalDisplay ?? null,
|
||||
},
|
||||
|
||||
+13
-1
@@ -17,6 +17,7 @@ import { buildStandardFlatPageLayoutMetadataMaps } from 'src/engine/workspace-ma
|
||||
import { buildStandardFlatRoleMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/role-metadata/build-standard-flat-role-metadata-maps.util';
|
||||
import { buildStandardFlatSkillMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/skill-metadata/build-standard-flat-skill-metadata-maps.util';
|
||||
import { buildStandardFlatViewFieldMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/build-standard-flat-view-field-metadata-maps.util';
|
||||
import { buildStandardFlatViewFieldGroupMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/build-standard-flat-view-field-group-metadata-maps.util';
|
||||
import { buildStandardFlatViewFilterMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-filter/build-standard-flat-view-filter-metadata-maps.util';
|
||||
import { buildStandardFlatViewGroupMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-group/build-standard-flat-view-group-metadata-maps.util';
|
||||
import { buildStandardFlatViewMetadataMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/build-standard-flat-view-metadata-maps.util';
|
||||
@@ -82,6 +83,7 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
shouldIncludeRecordPageLayouts,
|
||||
});
|
||||
|
||||
const flatViewGroupMaps = buildStandardFlatViewGroupMetadataMaps({
|
||||
@@ -97,7 +99,16 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({
|
||||
|
||||
const flatViewFilterGroupMaps = createEmptyFlatEntityMaps();
|
||||
|
||||
const flatViewFieldGroupMaps = createEmptyFlatEntityMaps();
|
||||
const flatViewFieldGroupMaps = buildStandardFlatViewFieldGroupMetadataMaps({
|
||||
dependencyFlatEntityMaps: {
|
||||
flatViewMaps,
|
||||
},
|
||||
now,
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
shouldIncludeRecordPageLayouts,
|
||||
});
|
||||
|
||||
const flatViewFilterMaps = buildStandardFlatViewFilterMetadataMaps({
|
||||
dependencyFlatEntityMaps: {
|
||||
@@ -122,6 +133,7 @@ export const computeTwentyStandardApplicationAllFlatEntityMaps = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
shouldIncludeRecordPageLayouts,
|
||||
});
|
||||
|
||||
const flatRoleMaps = buildStandardFlatRoleMetadataMaps({
|
||||
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { computeStandardCompanyViewFieldGroups } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/compute-standard-company-view-field-groups.util';
|
||||
import { computeStandardNoteViewFieldGroups } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/compute-standard-note-view-field-groups.util';
|
||||
import { computeStandardOpportunityViewFieldGroups } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/compute-standard-opportunity-view-field-groups.util';
|
||||
import { computeStandardPersonViewFieldGroups } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/compute-standard-person-view-field-groups.util';
|
||||
import { computeStandardTaskViewFieldGroups } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/compute-standard-task-view-field-groups.util';
|
||||
import { type CreateStandardViewFieldGroupArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
type StandardViewFieldGroupBuilder<P extends AllStandardObjectName> = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<P>, 'context'>,
|
||||
) => Record<string, FlatViewFieldGroup>;
|
||||
|
||||
const STANDARD_FLAT_VIEW_FIELD_GROUP_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
company: computeStandardCompanyViewFieldGroups,
|
||||
person: computeStandardPersonViewFieldGroups,
|
||||
opportunity: computeStandardOpportunityViewFieldGroups,
|
||||
task: computeStandardTaskViewFieldGroups,
|
||||
note: computeStandardNoteViewFieldGroups,
|
||||
} as const satisfies {
|
||||
[P in AllStandardObjectName]?: StandardViewFieldGroupBuilder<P>;
|
||||
};
|
||||
|
||||
export type BuildStandardFlatViewFieldGroupMetadataMapsArgs = Omit<
|
||||
CreateStandardViewFieldGroupArgs,
|
||||
'context' | 'objectName'
|
||||
> & {
|
||||
shouldIncludeRecordPageLayouts?: boolean;
|
||||
};
|
||||
|
||||
export const buildStandardFlatViewFieldGroupMetadataMaps = ({
|
||||
shouldIncludeRecordPageLayouts,
|
||||
...args
|
||||
}: BuildStandardFlatViewFieldGroupMetadataMapsArgs): FlatEntityMaps<FlatViewFieldGroup> => {
|
||||
if (!shouldIncludeRecordPageLayouts) {
|
||||
return createEmptyFlatEntityMaps();
|
||||
}
|
||||
|
||||
const allViewFieldGroupMetadatas: FlatViewFieldGroup[] = (
|
||||
Object.keys(
|
||||
STANDARD_FLAT_VIEW_FIELD_GROUP_METADATA_BUILDERS_BY_OBJECT_NAME,
|
||||
) as (keyof typeof STANDARD_FLAT_VIEW_FIELD_GROUP_METADATA_BUILDERS_BY_OBJECT_NAME)[]
|
||||
).flatMap((objectName) => {
|
||||
const builder: StandardViewFieldGroupBuilder<typeof objectName> =
|
||||
STANDARD_FLAT_VIEW_FIELD_GROUP_METADATA_BUILDERS_BY_OBJECT_NAME[
|
||||
objectName
|
||||
];
|
||||
|
||||
const result = builder({
|
||||
...args,
|
||||
objectName,
|
||||
});
|
||||
|
||||
return Object.values(result);
|
||||
});
|
||||
|
||||
let flatViewFieldGroupMaps = createEmptyFlatEntityMaps();
|
||||
|
||||
for (const viewFieldGroupMetadata of allViewFieldGroupMetadatas) {
|
||||
flatViewFieldGroupMaps = addFlatEntityToFlatEntityMapsOrThrow({
|
||||
flatEntity: viewFieldGroupMetadata,
|
||||
flatEntityMaps: flatViewFieldGroupMaps,
|
||||
});
|
||||
}
|
||||
|
||||
return flatViewFieldGroupMaps;
|
||||
};
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import {
|
||||
createStandardViewFieldGroupFlatMetadata,
|
||||
type CreateStandardViewFieldGroupArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
export const computeStandardCompanyViewFieldGroups = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<'company'>, 'context'>,
|
||||
): Record<string, FlatViewFieldGroup> => {
|
||||
return {
|
||||
companyRecordPageFieldsGeneral: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldGroupName: 'general',
|
||||
name: 'General',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsAdditional: createStandardViewFieldGroupFlatMetadata(
|
||||
{
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldGroupName: 'additional',
|
||||
name: 'Additional',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
},
|
||||
},
|
||||
),
|
||||
companyRecordPageFieldsOther: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldGroupName: 'other',
|
||||
name: 'Other',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import {
|
||||
createStandardViewFieldGroupFlatMetadata,
|
||||
type CreateStandardViewFieldGroupArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
export const computeStandardNoteViewFieldGroups = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<'note'>, 'context'>,
|
||||
): Record<string, FlatViewFieldGroup> => {
|
||||
return {
|
||||
noteRecordPageFieldsGeneral: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldGroupName: 'general',
|
||||
name: 'General',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
noteRecordPageFieldsAdditional: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldGroupName: 'additional',
|
||||
name: 'Additional',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
noteRecordPageFieldsOther: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldGroupName: 'other',
|
||||
name: 'Other',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import {
|
||||
createStandardViewFieldGroupFlatMetadata,
|
||||
type CreateStandardViewFieldGroupArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
export const computeStandardOpportunityViewFieldGroups = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<'opportunity'>, 'context'>,
|
||||
): Record<string, FlatViewFieldGroup> => {
|
||||
return {
|
||||
opportunityRecordPageFieldsGeneral:
|
||||
createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldGroupName: 'general',
|
||||
name: 'General',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsAdditional:
|
||||
createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldGroupName: 'additional',
|
||||
name: 'Additional',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsOther: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldGroupName: 'other',
|
||||
name: 'Other',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import {
|
||||
createStandardViewFieldGroupFlatMetadata,
|
||||
type CreateStandardViewFieldGroupArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
export const computeStandardPersonViewFieldGroups = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<'person'>, 'context'>,
|
||||
): Record<string, FlatViewFieldGroup> => {
|
||||
return {
|
||||
personRecordPageFieldsGeneral: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldGroupName: 'general',
|
||||
name: 'General',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsAdditional: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldGroupName: 'additional',
|
||||
name: 'Additional',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsOther: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldGroupName: 'other',
|
||||
name: 'Other',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import {
|
||||
createStandardViewFieldGroupFlatMetadata,
|
||||
type CreateStandardViewFieldGroupArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field-group/create-standard-view-field-group-flat-metadata.util';
|
||||
|
||||
export const computeStandardTaskViewFieldGroups = (
|
||||
args: Omit<CreateStandardViewFieldGroupArgs<'task'>, 'context'>,
|
||||
): Record<string, FlatViewFieldGroup> => {
|
||||
return {
|
||||
taskRecordPageFieldsGeneral: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldGroupName: 'general',
|
||||
name: 'General',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsAdditional: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldGroupName: 'additional',
|
||||
name: 'Additional',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsOther: createStandardViewFieldGroupFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldGroupName: 'other',
|
||||
name: 'Other',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { type FlatViewFieldGroup } from 'src/engine/metadata-modules/flat-view-field-group/types/flat-view-field-group.type';
|
||||
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { type AllStandardObjectViewFieldGroupName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-field-group-name.type';
|
||||
import { type AllStandardObjectViewName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-name.type';
|
||||
import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type';
|
||||
|
||||
type CreateStandardViewFieldGroupOptions<
|
||||
O extends AllStandardObjectName,
|
||||
V extends AllStandardObjectViewName<O>,
|
||||
> = {
|
||||
viewName: V;
|
||||
viewFieldGroupName: AllStandardObjectViewFieldGroupName<O, V>;
|
||||
name: string;
|
||||
position: number;
|
||||
isVisible: boolean;
|
||||
};
|
||||
|
||||
export type CreateStandardViewFieldGroupArgs<
|
||||
O extends AllStandardObjectName = AllStandardObjectName,
|
||||
V extends AllStandardObjectViewName<O> = AllStandardObjectViewName<O>,
|
||||
> = StandardBuilderArgs<'viewFieldGroup'> & {
|
||||
objectName: O;
|
||||
context: CreateStandardViewFieldGroupOptions<O, V>;
|
||||
};
|
||||
|
||||
export const createStandardViewFieldGroupFlatMetadata = <
|
||||
O extends AllStandardObjectName,
|
||||
V extends AllStandardObjectViewName<O>,
|
||||
>({
|
||||
workspaceId,
|
||||
objectName,
|
||||
context: { viewName, viewFieldGroupName, name, position, isVisible },
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}: CreateStandardViewFieldGroupArgs<O, V>): FlatViewFieldGroup => {
|
||||
// @ts-expect-error ignore
|
||||
const viewDefinition = STANDARD_OBJECTS[objectName].views[viewName] as {
|
||||
universalIdentifier: string;
|
||||
viewFieldGroups: Record<string, { universalIdentifier: string }>;
|
||||
};
|
||||
|
||||
const viewFieldGroupDefinition =
|
||||
viewDefinition.viewFieldGroups[viewFieldGroupName as string];
|
||||
|
||||
if (!isDefined(viewFieldGroupDefinition)) {
|
||||
throw new Error(
|
||||
`Invalid configuration ${objectName} ${viewName.toString()} ${String(viewFieldGroupName)}`,
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
id: standardObjectMetadataRelatedEntityIds[objectName].views[viewName]
|
||||
.viewFieldGroups[viewFieldGroupName].id,
|
||||
viewFieldIds: [],
|
||||
viewFieldUniversalIdentifiers: [],
|
||||
universalIdentifier: viewFieldGroupDefinition.universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
applicationUniversalIdentifier:
|
||||
TWENTY_STANDARD_APPLICATION.universalIdentifier,
|
||||
workspaceId,
|
||||
viewId:
|
||||
standardObjectMetadataRelatedEntityIds[objectName].views[viewName].id,
|
||||
viewUniversalIdentifier: viewDefinition.universalIdentifier,
|
||||
name,
|
||||
position,
|
||||
isVisible,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
deletedAt: null,
|
||||
};
|
||||
};
|
||||
+22
-4
@@ -1,3 +1,5 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
|
||||
@@ -38,9 +40,17 @@ const STANDARD_FLAT_VIEW_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
[P in AllStandardObjectName]?: StandardViewFieldBuilder<P>;
|
||||
};
|
||||
|
||||
export const buildStandardFlatViewFieldMetadataMaps = (
|
||||
args: Omit<CreateStandardViewFieldArgs, 'context' | 'objectName'>,
|
||||
): FlatEntityMaps<FlatViewField> => {
|
||||
export type BuildStandardFlatViewFieldMetadataMapsArgs = Omit<
|
||||
CreateStandardViewFieldArgs,
|
||||
'context' | 'objectName'
|
||||
> & {
|
||||
shouldIncludeRecordPageLayouts?: boolean;
|
||||
};
|
||||
|
||||
export const buildStandardFlatViewFieldMetadataMaps = ({
|
||||
shouldIncludeRecordPageLayouts,
|
||||
...args
|
||||
}: BuildStandardFlatViewFieldMetadataMapsArgs): FlatEntityMaps<FlatViewField> => {
|
||||
const allViewFieldMetadatas: FlatViewField[] = (
|
||||
Object.keys(
|
||||
STANDARD_FLAT_VIEW_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME,
|
||||
@@ -54,7 +64,15 @@ export const buildStandardFlatViewFieldMetadataMaps = (
|
||||
objectName,
|
||||
});
|
||||
|
||||
return Object.values(result);
|
||||
return Object.values(result).filter(
|
||||
(viewField) =>
|
||||
shouldIncludeRecordPageLayouts ||
|
||||
isDefined(
|
||||
args.dependencyFlatEntityMaps.flatViewMaps.byUniversalIdentifier[
|
||||
viewField.viewUniversalIdentifier
|
||||
],
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
let flatViewFieldMaps = createEmptyFlatEntityMaps();
|
||||
|
||||
+135
@@ -9,6 +9,7 @@ export const computeStandardCompanyViewFields = (
|
||||
args: Omit<CreateStandardViewFieldArgs<'company'>, 'context'>,
|
||||
): Record<string, FlatViewField> => {
|
||||
return {
|
||||
// allCompanies view fields
|
||||
allCompaniesName: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
@@ -109,5 +110,139 @@ export const computeStandardCompanyViewFields = (
|
||||
aggregateOperation: AggregateOperations.COUNT_NOT_EMPTY,
|
||||
},
|
||||
}),
|
||||
|
||||
// companyRecordPageFields view fields
|
||||
companyRecordPageFieldsDomainName: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'domainName',
|
||||
fieldName: 'domainName',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsAccountOwner: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'accountOwner',
|
||||
fieldName: 'accountOwner',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsAnnualRecurringRevenue:
|
||||
createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'annualRecurringRevenue',
|
||||
fieldName: 'annualRecurringRevenue',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsIdealCustomerProfile:
|
||||
createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'idealCustomerProfile',
|
||||
fieldName: 'idealCustomerProfile',
|
||||
position: 0,
|
||||
isVisible: false,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'additional',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsEmployees: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'employees',
|
||||
fieldName: 'employees',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsLinkedinLink: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'linkedinLink',
|
||||
fieldName: 'linkedinLink',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsXLink: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'xLink',
|
||||
fieldName: 'xLink',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsAddress: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'address',
|
||||
fieldName: 'address',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'createdAt',
|
||||
fieldName: 'createdAt',
|
||||
position: 4,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFieldsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
viewFieldName: 'createdBy',
|
||||
fieldName: 'createdBy',
|
||||
position: 5,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+41
@@ -68,5 +68,46 @@ export const computeStandardNoteViewFields = (
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
|
||||
// noteRecordPageFields view fields
|
||||
noteRecordPageFieldsTitle: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldName: 'title',
|
||||
fieldName: 'title',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
noteRecordPageFieldsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldName: 'createdAt',
|
||||
fieldName: 'createdAt',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
noteRecordPageFieldsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
viewFieldName: 'createdBy',
|
||||
fieldName: 'createdBy',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+107
@@ -158,5 +158,112 @@ export const computeStandardOpportunityViewFields = (
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
|
||||
// opportunityRecordPageFields view fields
|
||||
opportunityRecordPageFieldsAmount: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'amount',
|
||||
fieldName: 'amount',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsCloseDate: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'closeDate',
|
||||
fieldName: 'closeDate',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsStage: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'stage',
|
||||
fieldName: 'stage',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsCompany: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'company',
|
||||
fieldName: 'company',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsPointOfContact:
|
||||
createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'pointOfContact',
|
||||
fieldName: 'pointOfContact',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'additional',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsOwner: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'owner',
|
||||
fieldName: 'owner',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'additional',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'createdAt',
|
||||
fieldName: 'createdAt',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFieldsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
viewFieldName: 'createdBy',
|
||||
fieldName: 'createdBy',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+133
@@ -9,6 +9,7 @@ export const computeStandardPersonViewFields = (
|
||||
args: Omit<CreateStandardViewFieldArgs<'person'>, 'context'>,
|
||||
): Record<string, FlatViewField> => {
|
||||
return {
|
||||
// allPeople view fields
|
||||
allPeopleName: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
@@ -132,5 +133,137 @@ export const computeStandardPersonViewFields = (
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
|
||||
// personRecordPageFields view fields
|
||||
personRecordPageFieldsEmails: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'emails',
|
||||
fieldName: 'emails',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsPhones: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'phones',
|
||||
fieldName: 'phones',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsCompany: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'company',
|
||||
fieldName: 'company',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsJobTitle: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'jobTitle',
|
||||
fieldName: 'jobTitle',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsLinkedinLink: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'linkedinLink',
|
||||
fieldName: 'linkedinLink',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'additional',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsXLink: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'xLink',
|
||||
fieldName: 'xLink',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'additional',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsCity: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'city',
|
||||
fieldName: 'city',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsAvatarUrl: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'avatarUrl',
|
||||
fieldName: 'avatarUrl',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'createdAt',
|
||||
fieldName: 'createdAt',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
personRecordPageFieldsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
viewFieldName: 'createdBy',
|
||||
fieldName: 'createdBy',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+80
@@ -253,5 +253,85 @@ export const computeStandardTaskViewFields = (
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
|
||||
// taskRecordPageFields view fields
|
||||
taskRecordPageFieldsTitle: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'title',
|
||||
fieldName: 'title',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsDueAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'dueAt',
|
||||
fieldName: 'dueAt',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsStatus: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'status',
|
||||
fieldName: 'status',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsAssignee: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'assignee',
|
||||
fieldName: 'assignee',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'general',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'createdAt',
|
||||
fieldName: 'createdAt',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFieldsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
viewFieldName: 'createdBy',
|
||||
fieldName: 'createdBy',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
viewFieldGroupName: 'other',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+28
-2
@@ -7,6 +7,7 @@ import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/
|
||||
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
|
||||
import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { type AllStandardObjectViewFieldGroupName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-field-group-name.type';
|
||||
import { type AllStandardObjectViewFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-field-name.type';
|
||||
import { type AllStandardObjectViewName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-name.type';
|
||||
import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type';
|
||||
@@ -22,6 +23,7 @@ export type CreateStandardViewFieldOptions<
|
||||
isVisible: boolean;
|
||||
size: number;
|
||||
aggregateOperation?: AggregateOperations | null;
|
||||
viewFieldGroupName?: AllStandardObjectViewFieldGroupName<O, V> | null;
|
||||
};
|
||||
|
||||
export type CreateStandardViewFieldArgs<
|
||||
@@ -46,6 +48,7 @@ export const createStandardViewFieldFlatMetadata = <
|
||||
isVisible,
|
||||
size,
|
||||
aggregateOperation = null,
|
||||
viewFieldGroupName = null,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
@@ -61,6 +64,7 @@ export const createStandardViewFieldFlatMetadata = <
|
||||
{
|
||||
universalIdentifier: string;
|
||||
viewFields: Record<string, { universalIdentifier: string }>;
|
||||
viewFieldGroups?: Record<string, { universalIdentifier: string }>;
|
||||
}
|
||||
>;
|
||||
};
|
||||
@@ -75,6 +79,28 @@ export const createStandardViewFieldFlatMetadata = <
|
||||
);
|
||||
}
|
||||
|
||||
let viewFieldGroupId: string | null = null;
|
||||
let viewFieldGroupUniversalIdentifier: string | null = null;
|
||||
|
||||
if (isDefined(viewFieldGroupName)) {
|
||||
const viewFieldGroupDefinition =
|
||||
viewDefinition.viewFieldGroups?.[viewFieldGroupName as string];
|
||||
|
||||
if (!isDefined(viewFieldGroupDefinition)) {
|
||||
throw new Error(
|
||||
`Invalid view field group ${objectName} ${viewName.toString()} ${String(viewFieldGroupName)}`,
|
||||
);
|
||||
}
|
||||
|
||||
viewFieldGroupUniversalIdentifier =
|
||||
viewFieldGroupDefinition.universalIdentifier;
|
||||
|
||||
viewFieldGroupId = (
|
||||
standardObjectMetadataRelatedEntityIds[objectName].views[viewName]
|
||||
.viewFieldGroups as Record<string, { id: string }>
|
||||
)[viewFieldGroupName as string].id;
|
||||
}
|
||||
|
||||
return {
|
||||
id: v4(),
|
||||
universalIdentifier: viewFieldDefinition.universalIdentifier,
|
||||
@@ -88,8 +114,8 @@ export const createStandardViewFieldFlatMetadata = <
|
||||
fieldMetadataId:
|
||||
standardObjectMetadataRelatedEntityIds[objectName].fields[fieldName].id,
|
||||
fieldMetadataUniversalIdentifier: fieldDefinition.universalIdentifier,
|
||||
viewFieldGroupId: null,
|
||||
viewFieldGroupUniversalIdentifier: null,
|
||||
viewFieldGroupId,
|
||||
viewFieldGroupUniversalIdentifier,
|
||||
position,
|
||||
isVisible,
|
||||
size,
|
||||
|
||||
+16
-4
@@ -2,6 +2,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
|
||||
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
|
||||
import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum';
|
||||
import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type';
|
||||
import { computeStandardCalendarEventViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-calendar-event-views.util';
|
||||
import { computeStandardCompanyViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-company-views.util';
|
||||
@@ -38,9 +39,17 @@ const STANDARD_FLAT_VIEW_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
[P in AllStandardObjectName]?: StandardViewBuilder<P>;
|
||||
};
|
||||
|
||||
export const buildStandardFlatViewMetadataMaps = (
|
||||
args: Omit<CreateStandardViewArgs, 'context' | 'objectName'>,
|
||||
): FlatEntityMaps<FlatView> => {
|
||||
export type BuildStandardFlatViewMetadataMapsArgs = Omit<
|
||||
CreateStandardViewArgs,
|
||||
'context' | 'objectName'
|
||||
> & {
|
||||
shouldIncludeRecordPageLayouts?: boolean;
|
||||
};
|
||||
|
||||
export const buildStandardFlatViewMetadataMaps = ({
|
||||
shouldIncludeRecordPageLayouts,
|
||||
...args
|
||||
}: BuildStandardFlatViewMetadataMapsArgs): FlatEntityMaps<FlatView> => {
|
||||
const allViewMetadatas: FlatView[] = (
|
||||
Object.keys(
|
||||
STANDARD_FLAT_VIEW_METADATA_BUILDERS_BY_OBJECT_NAME,
|
||||
@@ -54,7 +63,10 @@ export const buildStandardFlatViewMetadataMaps = (
|
||||
objectName,
|
||||
});
|
||||
|
||||
return Object.values(result);
|
||||
return Object.values(result).filter(
|
||||
(view) =>
|
||||
shouldIncludeRecordPageLayouts || view.type !== ViewType.FIELDS_WIDGET,
|
||||
);
|
||||
});
|
||||
|
||||
let flatViewMaps = createEmptyFlatEntityMaps();
|
||||
|
||||
+12
@@ -22,5 +22,17 @@ export const computeStandardCompanyViews = (
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
companyRecordPageFields: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'company',
|
||||
context: {
|
||||
viewName: 'companyRecordPageFields',
|
||||
name: 'Company Record Page Fields',
|
||||
type: ViewType.FIELDS_WIDGET,
|
||||
key: null,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+12
@@ -22,5 +22,17 @@ export const computeStandardNoteViews = (
|
||||
icon: 'IconNotes',
|
||||
},
|
||||
}),
|
||||
noteRecordPageFields: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'note',
|
||||
context: {
|
||||
viewName: 'noteRecordPageFields',
|
||||
name: 'Note Record Page Fields',
|
||||
type: ViewType.FIELDS_WIDGET,
|
||||
key: null,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+12
@@ -38,5 +38,17 @@ export const computeStandardOpportunityViews = (
|
||||
kanbanAggregateOperationFieldName: 'amount',
|
||||
},
|
||||
}),
|
||||
opportunityRecordPageFields: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'opportunity',
|
||||
context: {
|
||||
viewName: 'opportunityRecordPageFields',
|
||||
name: 'Opportunity Record Page Fields',
|
||||
type: ViewType.FIELDS_WIDGET,
|
||||
key: null,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+12
@@ -22,5 +22,17 @@ export const computeStandardPersonViews = (
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
personRecordPageFields: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'person',
|
||||
context: {
|
||||
viewName: 'personRecordPageFields',
|
||||
name: 'Person Record Page Fields',
|
||||
type: ViewType.FIELDS_WIDGET,
|
||||
key: null,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+12
@@ -48,5 +48,17 @@ export const computeStandardTaskViews = (
|
||||
mainGroupByFieldName: 'status',
|
||||
},
|
||||
}),
|
||||
taskRecordPageFields: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'task',
|
||||
context: {
|
||||
viewName: 'taskRecordPageFields',
|
||||
name: 'Task Record Page Fields',
|
||||
type: ViewType.FIELDS_WIDGET,
|
||||
key: null,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
+38
-38
@@ -311,6 +311,41 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
}
|
||||
}
|
||||
|
||||
if (isDefined(flatViewFieldGroupMaps)) {
|
||||
const { from: fromFlatViewFieldGroupMaps, to: toFlatViewFieldGroupMaps } =
|
||||
flatViewFieldGroupMaps;
|
||||
|
||||
const viewFieldGroupResult =
|
||||
await this.workspaceMigrationViewFieldGroupActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatViewFieldGroupMaps,
|
||||
to: toFlatViewFieldGroupMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatViewMaps: optimisticAllFlatEntityMaps.flatViewMaps,
|
||||
},
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
allFlatEntityMaps: optimisticAllFlatEntityMaps,
|
||||
flatEntityMapsAndRelatedFlatEntityMaps:
|
||||
viewFieldGroupResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
|
||||
},
|
||||
);
|
||||
|
||||
if (viewFieldGroupResult.status === 'fail') {
|
||||
orchestratorFailureReport.viewFieldGroup.push(
|
||||
...viewFieldGroupResult.errors,
|
||||
);
|
||||
} else {
|
||||
orchestratorActionsReport.viewFieldGroup = viewFieldGroupResult.actions;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDefined(flatViewFieldMaps)) {
|
||||
const { from: fromFlatViewFieldMaps, to: toFlatViewFieldMaps } =
|
||||
flatViewFieldMaps;
|
||||
@@ -457,41 +492,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
}
|
||||
}
|
||||
|
||||
if (isDefined(flatViewFieldGroupMaps)) {
|
||||
const { from: fromFlatViewFieldGroupMaps, to: toFlatViewFieldGroupMaps } =
|
||||
flatViewFieldGroupMaps;
|
||||
|
||||
const viewFieldGroupResult =
|
||||
await this.workspaceMigrationViewFieldGroupActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatViewFieldGroupMaps,
|
||||
to: toFlatViewFieldGroupMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatViewMaps: optimisticAllFlatEntityMaps.flatViewMaps,
|
||||
},
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
allFlatEntityMaps: optimisticAllFlatEntityMaps,
|
||||
flatEntityMapsAndRelatedFlatEntityMaps:
|
||||
viewFieldGroupResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
|
||||
},
|
||||
);
|
||||
|
||||
if (viewFieldGroupResult.status === 'fail') {
|
||||
orchestratorFailureReport.viewFieldGroup.push(
|
||||
...viewFieldGroupResult.errors,
|
||||
);
|
||||
} else {
|
||||
orchestratorActionsReport.viewFieldGroup = viewFieldGroupResult.actions;
|
||||
}
|
||||
}
|
||||
|
||||
if (isDefined(flatRowLevelPermissionPredicateGroupMaps)) {
|
||||
const {
|
||||
from: fromFlatRowLevelPermissionPredicateGroupMaps,
|
||||
@@ -1032,6 +1032,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
...aggregatedOrchestratorActionsReport.view.create,
|
||||
...aggregatedOrchestratorActionsReport.view.update,
|
||||
...aggregatedOrchestratorActionsReport.viewField.delete,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.delete,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.create,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.update,
|
||||
...aggregatedOrchestratorActionsReport.viewField.create,
|
||||
...aggregatedOrchestratorActionsReport.viewField.update,
|
||||
...aggregatedOrchestratorActionsReport.viewFilterGroup.delete,
|
||||
@@ -1043,9 +1046,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
...aggregatedOrchestratorActionsReport.viewGroup.delete,
|
||||
...aggregatedOrchestratorActionsReport.viewGroup.create,
|
||||
...aggregatedOrchestratorActionsReport.viewGroup.update,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.delete,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.create,
|
||||
...aggregatedOrchestratorActionsReport.viewFieldGroup.update,
|
||||
///
|
||||
|
||||
// Logic functions
|
||||
|
||||
@@ -440,6 +440,52 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
companyRecordPageFields: {
|
||||
universalIdentifier: '20202020-a001-4a01-8a01-c0aba11c1001',
|
||||
viewFieldGroups: {
|
||||
general: {
|
||||
universalIdentifier: '20202020-a001-4a01-8a01-c0aba11c1101',
|
||||
},
|
||||
additional: {
|
||||
universalIdentifier: '20202020-a001-4a01-8a01-c0aba11c1102',
|
||||
},
|
||||
other: {
|
||||
universalIdentifier: '20202020-a001-4a01-8a01-c0aba11c1103',
|
||||
},
|
||||
},
|
||||
viewFields: {
|
||||
domainName: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1201',
|
||||
},
|
||||
accountOwner: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1202',
|
||||
},
|
||||
annualRecurringRevenue: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1203',
|
||||
},
|
||||
idealCustomerProfile: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1204',
|
||||
},
|
||||
employees: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1205',
|
||||
},
|
||||
linkedinLink: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1206',
|
||||
},
|
||||
xLink: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1207',
|
||||
},
|
||||
address: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1208',
|
||||
},
|
||||
createdAt: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1209',
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: '20202020-af01-4a01-8a01-c0aba11c1210',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
connectedAccount: {
|
||||
@@ -1035,6 +1081,31 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
noteRecordPageFields: {
|
||||
universalIdentifier: '20202020-a005-4a05-8a05-a0be5a115001',
|
||||
viewFieldGroups: {
|
||||
general: {
|
||||
universalIdentifier: '20202020-a005-4a05-8a05-a0be5a115101',
|
||||
},
|
||||
additional: {
|
||||
universalIdentifier: '20202020-a005-4a05-8a05-a0be5a115102',
|
||||
},
|
||||
other: {
|
||||
universalIdentifier: '20202020-a005-4a05-8a05-a0be5a115103',
|
||||
},
|
||||
},
|
||||
viewFields: {
|
||||
title: {
|
||||
universalIdentifier: '20202020-af05-4a05-8a05-a0be5a115201',
|
||||
},
|
||||
createdAt: {
|
||||
universalIdentifier: '20202020-af05-4a05-8a05-a0be5a115202',
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: '20202020-af05-4a05-8a05-a0be5a115203',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
noteTarget: {
|
||||
@@ -1209,6 +1280,46 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
opportunityRecordPageFields: {
|
||||
universalIdentifier: '20202020-a003-4a03-8a03-0aa0b1ca3001',
|
||||
viewFieldGroups: {
|
||||
general: {
|
||||
universalIdentifier: '20202020-a003-4a03-8a03-0aa0b1ca3101',
|
||||
},
|
||||
additional: {
|
||||
universalIdentifier: '20202020-a003-4a03-8a03-0aa0b1ca3102',
|
||||
},
|
||||
other: {
|
||||
universalIdentifier: '20202020-a003-4a03-8a03-0aa0b1ca3103',
|
||||
},
|
||||
},
|
||||
viewFields: {
|
||||
amount: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3201',
|
||||
},
|
||||
closeDate: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3202',
|
||||
},
|
||||
stage: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3203',
|
||||
},
|
||||
company: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3204',
|
||||
},
|
||||
pointOfContact: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3205',
|
||||
},
|
||||
owner: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3206',
|
||||
},
|
||||
createdAt: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3207',
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: '20202020-af03-4a03-8a03-0aa0b1ca3208',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
person: {
|
||||
@@ -1322,6 +1433,52 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
personRecordPageFields: {
|
||||
universalIdentifier: '20202020-a002-4a02-8a02-ae0a1ea12001',
|
||||
viewFieldGroups: {
|
||||
general: {
|
||||
universalIdentifier: '20202020-a002-4a02-8a02-ae0a1ea12101',
|
||||
},
|
||||
additional: {
|
||||
universalIdentifier: '20202020-a002-4a02-8a02-ae0a1ea12102',
|
||||
},
|
||||
other: {
|
||||
universalIdentifier: '20202020-a002-4a02-8a02-ae0a1ea12103',
|
||||
},
|
||||
},
|
||||
viewFields: {
|
||||
emails: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12201',
|
||||
},
|
||||
phones: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12202',
|
||||
},
|
||||
company: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12203',
|
||||
},
|
||||
jobTitle: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12204',
|
||||
},
|
||||
linkedinLink: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12205',
|
||||
},
|
||||
xLink: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12206',
|
||||
},
|
||||
city: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12207',
|
||||
},
|
||||
avatarUrl: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12208',
|
||||
},
|
||||
createdAt: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12209',
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: '20202020-af02-4a02-8a02-ae0a1ea12210',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
task: {
|
||||
@@ -1479,6 +1636,40 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
taskRecordPageFields: {
|
||||
universalIdentifier: '20202020-a006-4a06-8a06-ba5ca11a6001',
|
||||
viewFieldGroups: {
|
||||
general: {
|
||||
universalIdentifier: '20202020-a006-4a06-8a06-ba5ca11a6101',
|
||||
},
|
||||
additional: {
|
||||
universalIdentifier: '20202020-a006-4a06-8a06-ba5ca11a6102',
|
||||
},
|
||||
other: {
|
||||
universalIdentifier: '20202020-a006-4a06-8a06-ba5ca11a6103',
|
||||
},
|
||||
},
|
||||
viewFields: {
|
||||
title: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6201',
|
||||
},
|
||||
dueAt: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6202',
|
||||
},
|
||||
status: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6203',
|
||||
},
|
||||
assignee: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6204',
|
||||
},
|
||||
createdAt: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6205',
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: '20202020-af06-4a06-8a06-ba5ca11a6206',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
taskTarget: {
|
||||
|
||||
Reference in New Issue
Block a user