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

META-INF.resources.js.components.ModelBuilder.EditObjectFolder.tsx Maven / Gradle / Ivy

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

import {
	API,
	ModalEditObjectDefinitionExternalReferenceCode,
	openToast,
} from '@liferay/object-js-components-web';
import {createResourceURL} from 'frontend-js-web';
import React, {useEffect, useState} from 'react';
import {
	Edge,
	Elements,
	FlowElement,
	Node,
	isEdge,
	isNode,
} from 'react-flow-renderer';

import {formatActionURL} from '../../utils/fds';
import {Scope} from '../ObjectDetails/EditObjectDetails';
import {ModalAddObjectField} from '../ObjectField/ModalAddObjectField';
import {ModalAddObjectRelationship} from '../ObjectRelationship/ModalAddObjectRelationship';
import {ModalAddObjectDefinition} from '../ViewObjectDefinitions/ModalAddObjectDefinition';
import {ModalDeleteObjectDefinition} from '../ViewObjectDefinitions/ModalDeleteObjectDefinition';
import {ModalEditObjectFolder} from '../ViewObjectDefinitions/ModalEditObjectFolder';
import {
	getDbTableName,
	getUpdatedModelBuilderStructurePayload,
} from '../ViewObjectDefinitions/objectDefinitionUtil';
import Diagram from './Diagram/Diagram';
import EditObjectFolderHeader from './EditObjectFolderHeader/EditObjectFolderHeader';
import {ModalPublishObjectDefinitions} from './EditObjectFolderHeader/ModalPublishObjectDefinitions';
import EmptyObjectFolderCard from './EmptyObjectFolderCard/EmptyObjectFolderCard';
import LeftSidebar from './LeftSidebar/LeftSidebar';
import {useObjectFolderContext} from './ModelBuilderContext/objectFolderContext';
import {TYPES} from './ModelBuilderContext/typesEnum';
import {RedirectToEditObjectDetailsModal} from './ObjectDefinitionNode/RedirectToEditObjectDetailsModal';
import {RightSideBar} from './RightSidebar/index';
import {LeftSidebarItem, ObjectRelationshipEdgeData} from './types';
import {updatePreviousURLParam} from './utils';

import './EditObjectFolder.scss';
import ModalDeletionNotAllowed from '../ModalDeletionNotAllowed';
import {ModalMoveObjectDefinition} from '../ViewObjectDefinitions/ModalMoveObjectDefinition';

interface EditObjectFolder {
	companies: Scope[];
	objectRelationshipDeletionTypes: LabelValueObject[];
	sites: Scope[];
	viewObjectDefinitionsURL: string;
}

export default function EditObjectFolder({
	companies,
	objectRelationshipDeletionTypes,
	sites,
	viewObjectDefinitionsURL,
}: EditObjectFolder) {
	const [
		{
			baseResourceURL,
			deletedObjectDefinition,
			editObjectDefinitionURL,
			elements,
			isLoadingObjectFolder,
			learnResourceContext,
			leftSidebarItems,
			modelBuilderModals,
			movedObjectDefinitionId,
			objectDefinitionsStorageTypes,
			objectFolderName,
			objectFolders,
			rightSidebarType,
			selectedObjectDefinitionNode,
			selectedObjectFolder,
			showChangesSaved,
		},
		dispatch,
	] = useObjectFolderContext();

	const [
		objectRelationshipParameterRequired,
		setObjectRelationshipParameterRequired,
	] = useState(false);

	const edges = elements.filter((element) => isEdge(element)) as Edge<
		ObjectRelationshipEdgeData[]
	>[];

	const nodes = elements.filter((element) =>
		isNode(element)
	) as Node[];

	const handleDeleteObjectDefinition = (
		deletedObjectDefinition: DeletedObjectDefinition
	) => {
		dispatch({
			payload: {
				deletedObjectDefinition,
			},
			type: TYPES.SET_DELETE_OBJECT_DEFINITION,
		});
	};

	const onAfterAddObjectRelationship = async (
		newObjectRelationship: ObjectRelationship
	) => {
		const payload = await getUpdatedModelBuilderStructurePayload(
			baseResourceURL,
			selectedObjectFolder.name
		);

		if (
			newObjectRelationship.objectDefinitionExternalReferenceCode1 !==
			newObjectRelationship.objectDefinitionExternalReferenceCode2
		) {
			const objectDefinition2 = nodes.find(
				({data}) =>
					data?.externalReferenceCode ===
					newObjectRelationship.objectDefinitionExternalReferenceCode2
			);

			if (objectDefinition2 && objectDefinition2.isHidden) {
				const selectedSidebarItem = leftSidebarItems.find(
					({objectFolderName}) =>
						objectFolderName === selectedObjectFolder.name
				) as LeftSidebarItem;

				dispatch({
					payload: {
						hiddenObjectDefinitionNode: objectDefinition2.isHidden,
						objectDefinitionId: objectDefinition2.data
							?.id as number,
						objectDefinitionName: objectDefinition2.data
							?.name as string,
						objectDefinitionNodes: nodes,
						objectRelationshipEdges: edges,
						selectedSidebarItem,
					},
					type: TYPES.CHANGE_NODE_VIEW,
				});
			}
		}

		dispatch({
			payload: {
				...payload,
				dispatch,
				rightSidebarType: 'objectRelationshipDetails',
				selectedObjectRelationshipId: newObjectRelationship.id,
			},
			type: TYPES.UPDATE_MODEL_BUILDER_STRUCTURE,
		});

		dispatch({
			payload: {
				selectedObjectRelationshipId: newObjectRelationship.id,
			},
			type: TYPES.SET_SELECTED_OBJECT_RELATIONSHIP_EDGE,
		});
	};

	useEffect(() => {
		const makeFetch = async () => {
			if (selectedObjectDefinitionNode) {
				const url = createResourceURL(baseResourceURL, {
					objectDefinitionId: selectedObjectDefinitionNode.data?.id,
					p_p_resource_id:
						'/object_definitions/get_object_relationship_info',
				}).href;

				const {parameterRequired} = await API.fetchJSON<{
					parameterRequired: boolean;
				}>(url);

				setObjectRelationshipParameterRequired(parameterRequired);
			}
		};

		makeFetch();
	}, [baseResourceURL, selectedObjectDefinitionNode]);

	useEffect(() => {
		dispatch({
			payload: {
				isLoadingObjectFolder: true,
			},
			type: TYPES.SET_LOADING_OBJECT_FOLDER,
		});

		const makeFetch = async () => {
			const payload = await getUpdatedModelBuilderStructurePayload(
				baseResourceURL,
				objectFolderName
			);

			dispatch({
				payload: {...payload, dispatch},
				type: TYPES.UPDATE_MODEL_BUILDER_STRUCTURE,
			});

			dispatch({
				payload: {
					isLoadingObjectFolder: false,
				},
				type: TYPES.SET_LOADING_OBJECT_FOLDER,
			});
		};

		makeFetch();

		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [objectFolderName]);

	useEffect(() => {
		if (showChangesSaved) {
			setTimeout(() => {
				dispatch({
					payload: {updatedShowChangesSaved: false},
					type: TYPES.SET_SHOW_CHANGES_SAVED,
				});
			}, 5000);
		}

		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [showChangesSaved]);

	useEffect(() => {
		if (Object.keys(selectedObjectFolder).length) {
			const makeFetch = async () =>
				await API.putObjectFolderByExternalReferenceCode({
					externalReferenceCode:
						selectedObjectFolder.externalReferenceCode,
					id: selectedObjectFolder.id,
					label: selectedObjectFolder.label,
					name: selectedObjectFolder.name,
					objectFolderItems: selectedObjectFolder.objectFolderItems,
				});

			makeFetch();
		}

		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [selectedObjectFolder.objectFolderItems?.length]);

	Liferay.on('beforeNavigate', (event) => {
		const URLparams = new URL(event.path).searchParams;
		const objectFolderNameURLParam = URLparams.get('objectFolderName');

		if (objectFolderNameURLParam) {
			updatePreviousURLParam({
				paramType: 'objectFolderName',
				paramURL: viewObjectDefinitionsURL,
				paramValue: objectFolderName,
			});
		}
	});

	return (
		<>
			{modelBuilderModals.addObjectDefinition && (
				
						dispatch({
							payload: {
								updatedModelBuilderModals: {
									addObjectDefinition: false,
								},
							},
							type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
						})
					}
					learnResourceContext={learnResourceContext}
					objectDefinitionsStorageTypes={
						objectDefinitionsStorageTypes
					}
					objectFolderExternalReferenceCode={
						selectedObjectFolder.externalReferenceCode
					}
					onAfterSubmit={async (newObjectDefinition) => {
						const dbTableName = await getDbTableName({
							baseResourceURL,
							objectDefinitionId: newObjectDefinition.id,
						} as {
							baseResourceURL: string;
							objectDefinitionId: number;
						});

						dispatch({
							payload: {
								dbTableName,
								dispatch,
								elements,
								leftSidebarItems,
								newObjectDefinition,
								objectFolders,
								selectedObjectFolder,
							},
							type: TYPES.ADD_OBJECT_DEFINITION_TO_OBJECT_FOLDER,
						});
					}}
					reload={false}
				/>
			)}

			{modelBuilderModals.addObjectField &&
				selectedObjectDefinitionNode?.data && (
					 {
							dispatch({
								payload: {
									newObjectField,
									objectDefinitionExternalReferenceCode:
										selectedObjectDefinitionNode?.data
											?.externalReferenceCode as string,
									objectDefinitionNodes: nodes,
									objectRelationshipEdges: edges,
									selectedObjectDefinitionNode,
								},
								type: TYPES.ADD_OBJECT_FIELD,
							});

							openToast({
								message: Liferay.Language.get(
									'the-field-was-successfully-added'
								),
								type: 'success',
							});

							dispatch({
								payload: {
									updatedModelBuilderModals: {
										addObjectField: false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});

							dispatch({
								payload: {
									objectDefinitionExternalReferenceCode:
										selectedObjectDefinitionNode.data
											?.externalReferenceCode as string,
									showAllObjectFields:
										selectedObjectDefinitionNode.data
											?.showAllObjectFields as boolean,
								},
								type: TYPES.SET_SHOW_ALL_OBJECT_FIELDS,
							});
						}}
						setVisible={() =>
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										addObjectField: false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							})
						}
					/>
				)}

			{modelBuilderModals.addObjectRelationship &&
				selectedObjectDefinitionNode?.data && (
					 {
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										addObjectRelationship: false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});
						}}
						learnResources={learnResourceContext}
						objectDefinitionExternalReferenceCode1={
							selectedObjectDefinitionNode.data
								.externalReferenceCode
						}
						objectRelationshipParameterRequired={
							objectRelationshipParameterRequired
						}
						onAfterAddObjectRelationship={(newObjectRelationship) =>
							onAfterAddObjectRelationship(newObjectRelationship)
						}
						reload={false}
					/>
				)}

			{modelBuilderModals.deleteObjectDefinition &&
				deletedObjectDefinition && (
					
							handleDeleteObjectDefinition
						}
						handleOnClose={() => {
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										deleteObjectDefinition: false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});
						}}
						objectDefinition={deletedObjectDefinition}
					/>
				)}

			{modelBuilderModals.editObjectDefinitionExternalReferenceCode &&
				selectedObjectDefinitionNode?.data && (
					 {
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										editObjectDefinitionExternalReferenceCode:
											false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});
						}}
						helpMessage={Liferay.Language.get(
							'unique-key-for-referencing-the-object-definition'
						)}
						objectDefinitionExternalReferenceCode={
							selectedObjectDefinitionNode.data
								.externalReferenceCode
						}
						onGetEntity={() =>
							API.getObjectDefinitionById(
								selectedObjectDefinitionNode.data?.id as number
							)
						}
						onObjectDefinitionExternalReferenceCodeChange={(
							externalReferenceCode: string
						) => {
							const updatedElements = elements.map((element) => {
								if (
									isNode(element) &&
									(element as Node)
										.data?.id ===
										selectedObjectDefinitionNode.data?.id
								) {
									return {
										...element,
										data: {
											...element.data,
											externalReferenceCode,
										},
									};
								}

								return element;
							}) as Elements;

							const updatedSelectedObjectFolderItems =
								selectedObjectFolder.objectFolderItems.map(
									(objectFolderItem) => {
										if (
											objectFolderItem.objectDefinitionExternalReferenceCode ===
											selectedObjectDefinitionNode.data
												?.externalReferenceCode
										) {
											return {
												...objectFolderItem,
												objectDefinitionExternalReferenceCode:
													externalReferenceCode,
											};
										}

										return objectFolderItem;
									}
								);

							dispatch({
								payload: {
									updatedSelectedObjectFolder: {
										...selectedObjectFolder,
										objectFolderItems:
											updatedSelectedObjectFolderItems,
									},
								},
								type: TYPES.SET_SELECTED_OBJECT_FOLDER_DETAILS,
							});

							dispatch({
								payload: {
									newElements: updatedElements,
								},
								type: TYPES.SET_ELEMENTS,
							});
						}}
						saveURL={`/o/object-admin/v1.0/object-definitions/${selectedObjectDefinitionNode.data.id}`}
					/>
				)}

			{modelBuilderModals.editObjectFolder && (
				 {
						dispatch({
							payload: {
								updatedModelBuilderModals: {
									editObjectFolder: false,
								},
							},
							type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
						});
					}}
					id={selectedObjectFolder.id}
					initialLabel={selectedObjectFolder.label}
					name={selectedObjectFolder.name}
					onAfterSubmit={(editedObjectFolder) => {
						dispatch({
							payload: {
								updatedSelectedObjectFolder: editedObjectFolder,
							},
							type: TYPES.SET_SELECTED_OBJECT_FOLDER_DETAILS,
						});
					}}
				/>
			)}

			{modelBuilderModals.moveObjectDefinition &&
				movedObjectDefinitionId && (
					 {
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										moveObjectDefinition: false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});
						}}
						objectDefinitionId={movedObjectDefinitionId}
						objectFolders={objectFolders}
						onAfterMoveObjectDefinition={() => {
							setTimeout(async () => {
								const payload =
									await getUpdatedModelBuilderStructurePayload(
										baseResourceURL,
										selectedObjectFolder.name
									);

								dispatch({
									payload: {...payload, dispatch},
									type: TYPES.UPDATE_MODEL_BUILDER_STRUCTURE,
								});
							}, 200);
						}}
						setMoveObjectDefinition={() => {
							dispatch({
								payload: {movedObjectDefinitionId: undefined},
								type: TYPES.SET_MOVED_OBJECT_DEFINITION,
							});
						}}
					/>
				)}

			{modelBuilderModals.objectDefinitionOnRootModelDeletionNotAllowed &&
				Liferay.FeatureFlags['LPD-34594'] && (
					
						}
						onModalClose={() =>
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										objectDefinitionOnRootModelDeletionNotAllowed:
											false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							})
						}
					/>
				)}

			{modelBuilderModals.publishObjectDefinitions && (
				 {
						dispatch({
							payload: {
								updatedModelBuilderModals: {
									publishObjectDefinitions: false,
								},
							},
							type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
						});
					}}
				/>
			)}

			{modelBuilderModals.redirectToEditObjectDefinitionDetails &&
				selectedObjectDefinitionNode?.data && (
					 {
							dispatch({
								payload: {
									updatedModelBuilderModals: {
										redirectToEditObjectDefinitionDetails:
											false,
									},
								},
								type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
							});
						}}
						viewObjectDetailsURL={formatActionURL(
							editObjectDefinitionURL,
							selectedObjectDefinitionNode.data.id
						)}
					/>
				)}

			
						(element as FlowElement).data
							?.status?.code === 2
				)}
				selectedObjectFolder={selectedObjectFolder}
			/>

			
{!elements.length && !isLoadingObjectFolder && ( )} {rightSidebarType === 'empty' && } {rightSidebarType === 'objectDefinitionDetails' && ( )} {rightSidebarType === 'objectFieldDetails' && ( )} {rightSidebarType === 'objectRelationshipDetails' && ( )}
); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy