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

META-INF.resources.js.components.ObjectRelationship.Relationships.tsx Maven / Gradle / Ivy

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

import ClayLabel from '@clayui/label';
import ClayLink from '@clayui/link';
import {
	FrontendDataSet,

	// @ts-ignore

} from '@liferay/frontend-data-set-web';
import classNames from 'classnames';
import {ILearnResourceContext, openToast} from 'frontend-js-components-web';
import {sessionStorage} from 'frontend-js-web';
import React, {useEffect, useMemo, useState} from 'react';

import {defaultFDSDataSetProps, formatActionURL} from '../../utils/fds';
import {getEditObjectRelationshipURL} from '../../utils/url';
import LabelRenderer from '../LabelRenderer';
import ModalDeletionNotAllowed from '../ModalDeletionNotAllowed';
import {deleteRelationship} from '../ViewObjectDefinitions/objectDefinitionUtil';
import {ModalAddObjectRelationship} from './ModalAddObjectRelationship';
import {ModalDeleteObjectRelationship} from './ModalDeleteObjectRelationship';

import type {FDSItem, IFDSTableProps} from '../../utils/fds';

interface ItemData {
	edge?: boolean;
	id: number;
	reverse: boolean;
	system?: boolean;
}

interface RelationshipsProps extends IFDSTableProps {
	baseResourceURL: string;
	isApproved: boolean;
	learnResources: ILearnResourceContext;
	objectDefinitionExternalReferenceCode: string;
	objectDefinitionId: string;
	objectRelationshipTypes: string[];
	parameterRequired: boolean;
}

const tableFields = [
	{
		contentRenderer: 'ObjectFieldLabelDataRenderer',
		expand: false,
		fieldName: 'label',
		label: Liferay.Language.get('label'),
		localizeLabel: true,
		sortable: true,
	},
	{
		expand: false,
		fieldName: 'objectDefinitionName2',
		label: Liferay.Language.get('related-object'),
		localizeLabel: true,
		sortable: false,
	},
	{
		expand: false,
		fieldName: 'type',
		label: Liferay.Language.get('type'),
		localizeLabel: true,
		sortable: false,
	},
	{
		contentRenderer: 'ObjectFieldHierarchyDataRenderer',
		expand: false,
		fieldName: 'hierarchy',
		label: Liferay.Language.get('hierarchy'),
		localizeLabel: true,
		sortable: false,
	},
	{
		contentRenderer: 'ObjectRelationshipSourceDataRenderer',
		expand: false,
		fieldName: 'source',
		label: Liferay.Language.get('source'),
		localizeLabel: true,
		sortable: false,
	},
];

function ObjectFieldHierarchyDataRenderer({itemData}: {itemData: ItemData}) {
	return (
		
			{itemData.reverse
				? Liferay.Language.get('child')
				: Liferay.Language.get('parent')}
		
	);
}

function ObjectRelationshipInheritanceDataRenderer({
	itemData,
}: {
	itemData: ItemData;
}) {
	return (
		
			{itemData.edge
				? Liferay.Language.get('inherited')
				: Liferay.Language.get('standard')}
		
	);
}

function ObjectRelationshipSourceDataRenderer({
	itemData,
}: {
	itemData: ItemData;
}) {
	return (
		
			{itemData.system
				? Liferay.Language.get('system')
				: Liferay.Language.get('custom')}
		
	);
}

export default function Relationships({
	apiURL,
	baseResourceURL,
	creationMenu,
	formName,
	id,
	isApproved,
	items,
	learnResources,
	objectDefinitionExternalReferenceCode,
	objectDefinitionId,
	parameterRequired,
	style,
	url,
}: RelationshipsProps) {
	const [objectRelationship, setObjectRelationship] =
		useState();
	const [showAddModal, setShowAddModal] = useState(false);
	const [showDeleteModal, setShowDeleteModal] = useState(false);
	const [showDeletionNotAllowedModal, setShowDeletionNotAllowedModal] =
		useState(false);

	const fields = useMemo(() => {
		const updatedTableFields = [...tableFields];

		if (Liferay.FeatureFlags['LPD-34594']) {
			const inheritanceField = {
				contentRenderer: 'ObjectRelationshipInheritanceDataRenderer',
				expand: false,
				fieldName: 'relationshipInheritance',
				label: Liferay.Language.get('permission-inheritance'),
				localizeLabel: true,
				sortable: false,
			};

			updatedTableFields.splice(4, 0, inheritanceField);
		}

		return updatedTableFields;
	}, []);

	function ObjectFieldLabelDataRenderer({
		itemData,
		openSidePanel,
		value,
	}: FDSItem) {
		return (
			 {
					openSidePanel({
						url: formatActionURL(url, itemData.id),
					});
				}}
				value={value}
			/>
		);
	}

	const frontendDataSetProps = {
		...defaultFDSDataSetProps,
		apiURL,
		creationMenu,
		customDataRenderers: {
			ObjectFieldHierarchyDataRenderer,
			ObjectFieldLabelDataRenderer,
			ObjectRelationshipInheritanceDataRenderer,
			ObjectRelationshipSourceDataRenderer,
		},
		formName,
		id,
		itemsActions: items,
		namespace:
			'_com_liferay_object_web_internal_object_definitions_portlet_ObjectDefinitionsPortlet_',
		onActionDropdownItemClick({
			action,
			itemData,
		}: {
			action: {data: {id: string}};
			itemData: ObjectRelationship;
		}) {
			if (action.data.id === 'deleteObjectRelationship') {
				if (itemData.edge && Liferay.FeatureFlags['LPD-34594']) {
					setShowDeletionNotAllowedModal(true);

					return;
				}

				if (isApproved || itemData.reverse) {
					setObjectRelationship(itemData);
					setShowDeleteModal(true);
				}
				else {
					deleteRelationship(itemData.id, true);
				}
			}
		},
		portletId:
			'com_liferay_object_web_internal_object_definitions_portlet_ObjectDefinitionsPortlet',
		style,
		views: [
			{
				contentRenderer: 'table',
				label: 'Table',
				name: 'table',
				schema: {
					fields,
				},
				thumbnail: 'table',
			},
		],
	};

	const onAfterAddObjectRelationship = async ({
		objectDefinitionId1,
	}: ObjectRelationship) => {
		const toastMessage = Liferay.Language.get(
			'relationship-was-created-successfully'
		);

		let toastAction;

		if (objectDefinitionId !== objectDefinitionId1.toString()) {
			toastAction = {
				linkHref: await getEditObjectRelationshipURL(
					baseResourceURL,
					objectDefinitionId1
				),
				linkLabel: Liferay.Language.get('view-relationship'),
			};
		}

		sessionStorage.setItem(
			'addObjectRelationshipSuccessToast',
			JSON.stringify({
				toastAction,
				toastMessage,
			}),
			sessionStorage.TYPES.NECESSARY
		);
	};

	useEffect(() => {
		Liferay.on('addObjectRelationship', () => setShowAddModal(true));

		const addObjectRelationshipSuccessToast = sessionStorage.getItem(
			'addObjectRelationshipSuccessToast',
			sessionStorage.TYPES.NECESSARY
		);

		if (addObjectRelationshipSuccessToast) {
			const {toastAction, toastMessage} = JSON.parse(
				addObjectRelationshipSuccessToast
			);

			openToast({
				message: toastMessage,
				toastProps: toastAction && {
					actions: (
						
							{toastAction.linkLabel}
						
					),
				},
			});

			sessionStorage.removeItem('addObjectRelationshipSuccessToast');
		}

		return () => {
			Liferay.detach('addObjectRelationship');
		};
	}, []);

	return (
		<>
			

			{showAddModal && (
				 setShowAddModal(false)}
					learnResources={learnResources}
					objectDefinitionExternalReferenceCode1={
						objectDefinitionExternalReferenceCode
					}
					objectRelationshipParameterRequired={parameterRequired}
					onAfterAddObjectRelationship={onAfterAddObjectRelationship}
				/>
			)}

			{showDeleteModal && objectRelationship && (
				 setShowDeleteModal(false)}
					objectRelationship={
						objectRelationship as ObjectRelationship
					}
					setObjectRelationship={setObjectRelationship}
				/>
			)}

			{showDeletionNotAllowedModal &&
				Liferay.FeatureFlags['LPD-34594'] && (
					
						}
						onModalClose={() =>
							setShowDeletionNotAllowedModal(false)
						}
					/>
				)}
		
	);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy