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

META-INF.resources.js.components.ModelBuilder.RightSidebar.RightSidebarObjectDefinitionDetails.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, openToast, stringUtils} from '@liferay/object-js-components-web';
import {sub} from 'frontend-js-web';
import React, {useEffect, useState} from 'react';
import {useStore} from 'react-flow-renderer';

import {Error, handleErrors} from '../../../utils/errors';
import {AccountRestrictionContainer} from '../../ObjectDetails/AccountRestrictionContainer';
import {ConfigurationContainer} from '../../ObjectDetails/ConfigurationContainer';
import {Scope} from '../../ObjectDetails/EditObjectDetails';
import {EntryDisplayContainer} from '../../ObjectDetails/EntryDisplayContainer';
import {ObjectDataContainer} from '../../ObjectDetails/ObjectDataContainer';
import {ScopeContainer} from '../../ObjectDetails/ScopeContainer';
import {SeoContainer} from '../../ObjectDetails/SeoContainer';
import {TranslationsContainer} from '../../ObjectDetails/TranslationsContainer';
import {useObjectDetailsForm} from '../../ObjectDetails/useObjectDetailsForm';
import {useObjectFolderContext} from '../ModelBuilderContext/objectFolderContext';
import {TYPES} from '../ModelBuilderContext/typesEnum';
import {nonRelationshipObjectFieldsInfo} from '../types';

import './RightSidebarObjectDefinitionDetails.scss';

interface RightSidebarObjectDefinitionDetailsProps {
	companies: Scope[];
	sites: Scope[];
}

function setAccountRelationshipFieldMandatory(
	values: Partial
) {
	const {objectFields} = values;

	const newObjectFields = objectFields?.map((objectField) => {
		if (objectField.name === values.accountEntryRestrictedObjectFieldName) {
			return {
				...objectField,
				required: true,
			};
		}

		return objectField;
	});

	return {
		...values,
		objectFields: newObjectFields,
	};
}

export function RightSidebarObjectDefinitionDetails({
	companies,
	sites,
}: RightSidebarObjectDefinitionDetailsProps) {
	const [
		nonRelationshipObjectFieldsInfo,
		setNonRelationshipObjectFieldsInfo,
	] = useState();

	const [{selectedObjectDefinitionNode, selectedObjectFolder}, dispatch] =
		useObjectFolderContext();

	const [backEndErrors, setBackEndErrors] = useState({});

	const store = useStore();

	const {errors, handleChange, handleValidate, setValues, values} =
		useObjectDetailsForm({
			initialValues: {
				defaultLanguageId: 'en_US',
				externalReferenceCode: '',
				id: 0,
				label: {},
				name: '',
				pluralLabel: {},
				titleObjectFieldName: '',
			},
			onSubmit: () => {},
		});

	const isRootDescendantNode =
		!!values.rootObjectDefinitionExternalReferenceCode &&
		values.externalReferenceCode !==
			values.rootObjectDefinitionExternalReferenceCode;

	useEffect(() => {
		const makeFetch = async () => {
			if (selectedObjectDefinitionNode) {
				const selectedObjectDefinition =
					await API.getObjectDefinitionByExternalReferenceCode(
						selectedObjectDefinitionNode.data
							?.externalReferenceCode as string
					);

				const newNonRelationshipObjectFieldsInfo =
					selectedObjectDefinition.objectFields
						.filter(
							(objectField) =>
								objectField.businessType !== 'Relationship'
						)
						.map((objectField) => ({
							label: objectField.label,
							name: objectField.name,
						})) as nonRelationshipObjectFieldsInfo[];

				setNonRelationshipObjectFieldsInfo(
					newNonRelationshipObjectFieldsInfo
				);
				setValues(selectedObjectDefinition);
			}
		};

		makeFetch();

		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [selectedObjectDefinitionNode?.id]);

	const onSubmit = async (
		editedObjectDefinition?: Partial
	) => {
		const validationErrors = handleValidate(
			editedObjectDefinition ?? values
		);

		if (!Object.keys(validationErrors).length) {
			let objectDefinition = editedObjectDefinition ?? {...values};

			delete objectDefinition.objectRelationships;
			delete objectDefinition.objectActions;
			delete objectDefinition.objectLayouts;
			delete objectDefinition.objectViews;

			if (objectDefinition.accountEntryRestricted) {
				objectDefinition =
					setAccountRelationshipFieldMandatory(objectDefinition);
			}

			try {
				const updatedObjectDefinitionResponse =
					await API.patchObjectDefinitionById(objectDefinition);

				if (!updatedObjectDefinitionResponse.ok) {
					const errorDetails =
						await updatedObjectDefinitionResponse.json();

					throw errorDetails;
				}
				else {
					const updatedObjectDefinition =
						(await updatedObjectDefinitionResponse.json()) as ObjectDefinition;

					const {edges, nodes} = store.getState();

					dispatch({
						payload: {
							currentObjectFolderName: selectedObjectFolder.name,
							objectDefinitionNodes: nodes,
							objectDefinitionRelationshipEdges: edges,
							updatedObjectDefinition,
						},
						type: TYPES.UPDATE_OBJECT_DEFINITION_NODE,
					});

					dispatch({
						payload: {
							updatedShowChangesSaved: true,
						},
						type: TYPES.SET_SHOW_CHANGES_SAVED,
					});

					openToast({
						message: Liferay.Language.get(
							'the-object-was-saved-successfully'
						),
						type: 'success',
					});
				}
			}
			catch (error) {
				const {detail, title} = error as Error;

				handleErrors({detail, title}, setBackEndErrors);

				return;
			}
		}
	};

	const objectDefinitionNodeDetailsTitle = sub(
		Liferay.Language.get('x-details'),
		stringUtils.getLocalizableLabel({
			fallbackLabel: values?.name,
			fallbackLanguageId:
				values.defaultLanguageId as Liferay.Language.Locale,
			labels: values?.label,
		})
	);

	const showSeoSection =
		Liferay.FeatureFlags['LPD-21926'] &&
		values.friendlyURLSeparator !== undefined &&
		!(
			(Liferay.FeatureFlags['LPS-135430'] &&
				values.storageType !== 'default') ||
			(!values.modifiable && values.system)
		);

	return (
		<>
			
{objectDefinitionNodeDetailsTitle}
{values?.modifiable && (
)}
{showSeoSection && (
)} ); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy