[FRONT COMPONENTS] Serialize relation between widget and front component (#18228)

This allows us to define page layout widgets of type front component in
an app with the front component universal identifier.
This commit is contained in:
Raphaël Bosi
2026-02-25 15:01:50 +01:00
committed by GitHub
parent 448241540d
commit 435e21d23f
15 changed files with 118 additions and 5 deletions
@@ -42,6 +42,7 @@ export class CreatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati
fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration({
universalConfiguration: action.flatEntity.universalConfiguration,
flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps,
flatFrontComponentMaps: allFlatEntityMaps.flatFrontComponentMaps,
flatViewMaps: allFlatEntityMaps.flatViewMaps,
flatViewFieldGroupMaps: allFlatEntityMaps.flatViewFieldGroupMaps,
});
@@ -50,6 +50,8 @@ export class UpdatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati
fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration({
universalConfiguration,
flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps,
flatFrontComponentMaps:
allFlatEntityMaps.flatFrontComponentMaps,
flatViewMaps: allFlatEntityMaps.flatViewMaps,
flatViewFieldGroupMaps:
allFlatEntityMaps.flatViewFieldGroupMaps,
@@ -70,11 +70,13 @@ const convertUniversalFilterToChartFilter = ({
export const fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration = ({
universalConfiguration,
flatFieldMetadataMaps,
flatFrontComponentMaps,
flatViewMaps,
flatViewFieldGroupMaps,
}: {
universalConfiguration: FlatPageLayoutWidget['universalConfiguration'];
flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>;
flatFrontComponentMaps: MetadataFlatEntityMaps<'frontComponent'>;
flatViewMaps: MetadataFlatEntityMaps<'view'>;
flatViewFieldGroupMaps: MetadataFlatEntityMaps<'viewFieldGroup'>;
}): FlatPageLayoutWidget['configuration'] => {
@@ -310,6 +312,35 @@ export const fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration = ({
return { ...rest, viewId, newFieldDefaultConfiguration };
}
case WidgetConfigurationType.FRONT_COMPONENT: {
const { frontComponentUniversalIdentifier, ...rest } =
universalConfiguration;
if (!isDefined(frontComponentUniversalIdentifier)) {
throw new FlatEntityMapsException(
`Front component universal identifier is required for FRONT_COMPONENT configuration`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const flatFrontComponent = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatFrontComponentMaps,
universalIdentifier: frontComponentUniversalIdentifier,
});
if (!isDefined(flatFrontComponent)) {
throw new FlatEntityMapsException(
`Front component not found for universal identifier: ${frontComponentUniversalIdentifier}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
return {
...rest,
frontComponentId: flatFrontComponent.id,
};
}
case WidgetConfigurationType.VIEW:
case WidgetConfigurationType.FIELD:
case WidgetConfigurationType.TIMELINE:
@@ -322,7 +353,6 @@ export const fromUniversalConfigurationToFlatPageLayoutWidgetConfiguration = ({
case WidgetConfigurationType.WORKFLOW:
case WidgetConfigurationType.WORKFLOW_VERSION:
case WidgetConfigurationType.WORKFLOW_RUN:
case WidgetConfigurationType.FRONT_COMPONENT:
case WidgetConfigurationType.IFRAME:
case WidgetConfigurationType.STANDALONE_RICH_TEXT:
return universalConfiguration;