All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.js.components.ModelBuilder.Edges.objectRelationshipEdgeFactory.ts Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

import {stringUtils} from '@liferay/object-js-components-web';

import {ObjectRelationshipEdgeData} from '../types';
import {manyMarkerId} from './ManyMarker';
import {ObjectRelationshipMap} from './ObjectRelationshipMap';
import {oneMarkerId} from './OneMarker';

interface GetObjectRelationships {
	objectDefinitionExternalReferenceCode1: string;
	objectDefinitionExternalReferenceCode2: string;
	objectRelationshipMap: ObjectRelationshipMap;
}

function getObjectRelationships({
	objectDefinitionExternalReferenceCode1,
	objectDefinitionExternalReferenceCode2,
	objectRelationshipMap,
}: GetObjectRelationships) {
	const objectRelationships =
		objectRelationshipMap.getValueByExternalReferenceCodes(
			objectDefinitionExternalReferenceCode1,
			objectDefinitionExternalReferenceCode2
		);

	if (!objectRelationships) {
		return [];
	}

	objectRelationshipMap.deleteByExternalReferenceCodes(
		objectDefinitionExternalReferenceCode1,
		objectDefinitionExternalReferenceCode2
	);

	return objectRelationships;
}

interface ObjectRelationshipEdgeFactory {
	objectDefinition: ObjectDefinitionNodeData;
	objectRelationship: ObjectRelationship;
	objectRelationshipMap: ObjectRelationshipMap;
	selectedObjectRelationshipId: number | undefined;
}

export function objectRelationshipEdgeFactory({
	objectDefinition,
	objectRelationship,
	objectRelationshipMap,
	selectedObjectRelationshipId,
}: ObjectRelationshipEdgeFactory) {
	const objectRelationships: ObjectRelationship[] = [];

	const isSelfObjectRelationship =
		objectRelationship.objectDefinitionExternalReferenceCode1 ===
		objectRelationship.objectDefinitionExternalReferenceCode2;

	const isTreeStructureRelationship = objectRelationship.edge === true;

	objectRelationships.push(
		...getObjectRelationships({
			objectDefinitionExternalReferenceCode1:
				objectRelationship.objectDefinitionExternalReferenceCode1,
			objectDefinitionExternalReferenceCode2:
				objectRelationship.objectDefinitionExternalReferenceCode2,
			objectRelationshipMap,
		})
	);

	objectRelationships.push(
		...getObjectRelationships({
			objectDefinitionExternalReferenceCode1:
				objectRelationship.objectDefinitionExternalReferenceCode2,
			objectDefinitionExternalReferenceCode2:
				objectRelationship.objectDefinitionExternalReferenceCode1,
			objectRelationshipMap,
		})
	);

	if (objectRelationships.length !== 0) {
		return {
			data: objectRelationships.map((objectRelationship) => {
				return {
					defaultLanguageId: objectDefinition.defaultLanguageId,
					edge: objectRelationship.edge,
					id: objectRelationship.id,
					label: stringUtils.getLocalizableLabel({
						fallbackLabel: objectRelationship.name,
						fallbackLanguageId: objectDefinition.defaultLanguageId,
						labels: objectRelationship.label,
					}),
					markerEndId: `${manyMarkerId}#${objectRelationship.id}`,
					markerStartId:
						objectRelationship.type === 'manyToMany'
							? `${manyMarkerId}#${objectRelationship.id}`
							: `${oneMarkerId}#${objectRelationship.id}`,
					name: objectRelationship.name,
					selected:
						selectedObjectRelationshipId === objectRelationship.id,
					type: objectRelationship.type,
				};
			}) as ObjectRelationshipEdgeData[],
			id: `reactflow__edge-object-relationship-parent-${objectRelationship.objectDefinitionId1}-child-${objectRelationship.objectDefinitionId2}`,
			source: `${objectDefinition.id}`,
			sourceHandle: isSelfObjectRelationship ? 'fixedLeftHandle' : null,
			target: `${objectRelationship.objectDefinitionId2}`,
			targetHandle: isSelfObjectRelationship ? 'fixedRightHandle' : null,
			type: isSelfObjectRelationship
				? 'selfObjectRelationshipEdge'
				: isTreeStructureRelationship
					? 'treeStructureObjectRelationshipEdge'
					: 'defaultObjectRelationshipEdge',
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy