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

META-INF.resources.js.components.ObjectAction.ObjectActionContainer.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 ClayTabs from '@clayui/tabs';
import {
	API,
	FormError,
	SidePanelForm,
	SidebarCategory,
	openToast,
	saveAndReload,
} from '@liferay/object-js-components-web';
import React, {useState} from 'react';

import {Error, getErrorMessage, parseError} from '../../utils/errors';
import ActionBuilder from './tabs/ActionBuilder';
import BasicInfo from './tabs/BasicInfo';
import {useObjectActionForm} from './useObjectActionForm';

const TABS = [
	{
		key: 'basic-info',
		label: Liferay.Language.get('basic-info'),
	},
	{
		key: 'action-builder',
		label: Liferay.Language.get('action-builder'),
	},
];

interface ObjectActionContainerProps {
	allowScriptContentToBeExecutedOrIncluded: boolean;
	editingObjectAction?: boolean;
	isApproved?: boolean;
	objectAction: Partial;
	objectActionCodeEditorElements: SidebarCategory[];
	objectActionExecutors: ObjectActionTriggerExecutorItem[];
	objectActionTriggers: ObjectActionTriggerExecutorItem[];
	objectDefinitionExternalReferenceCode: string;
	objectDefinitionId: number;
	objectDefinitionsRelationshipsURL: string;
	objectFields: ObjectField[];
	readOnly?: boolean;
	requestParams: {
		method: 'POST' | 'PUT';
		url: string;
	};
	scriptManagementConfigurationPortletURL: string;
	successMessage: string;
	systemObject: boolean;
	title: string;
	validateExpressionURL: string;
}

export type ActionError = FormError & {
	predefinedValues?: {[key: string]: string};
};

export function ObjectActionContainer({
	allowScriptContentToBeExecutedOrIncluded,
	editingObjectAction = false,
	isApproved,
	objectAction: initialValues,
	objectActionCodeEditorElements,
	objectActionExecutors,
	objectActionTriggers,
	objectDefinitionExternalReferenceCode,
	objectDefinitionId,
	objectDefinitionsRelationshipsURL,
	objectFields,
	readOnly,
	requestParams: {method, url},
	scriptManagementConfigurationPortletURL,
	successMessage,
	systemObject,
	validateExpressionURL,
}: ObjectActionContainerProps) {
	const [activeIndex, setActiveIndex] = useState(0);
	const [backEndErrors, setBackEndErrors] = useState({});

	const onSubmit = async (objectAction: ObjectAction) => {
		if (objectAction.parameters) {
			delete objectAction?.parameters['lineCount'];
		}

		delete objectAction.objectDefinitionId;

		try {
			await API.save({item: objectAction, method, url});
			saveAndReload();
			openToast({message: successMessage});
		}
		catch (error) {
			const {detail} = error as {detail?: string};
			const details = JSON.parse(detail as string);
			const newErrors: Error = {};

			parseError(details, newErrors);

			setBackEndErrors(newErrors);

			const errorMessages = new Set();

			if (newErrors) {
				getErrorMessage(newErrors, errorMessages);
				errorMessages.forEach((message) => {
					openToast({
						message,
						type: 'danger',
					});
				});
			}
		}
	};

	const {errors, handleChange, handleSubmit, setValues, values} =
		useObjectActionForm({initialValues, onSubmit});

	const disableGroovyAction =
		!allowScriptContentToBeExecutedOrIncluded &&
		values.objectActionExecutorKey === 'groovy';

	let newObjectActionExecutors = [...objectActionExecutors];

	if (!allowScriptContentToBeExecutedOrIncluded) {
		const shouldFilterGroovyExecutor =
			!editingObjectAction ||
			(editingObjectAction &&
				values.objectActionExecutorKey !== 'groovy');

		if (shouldFilterGroovyExecutor) {
			newObjectActionExecutors = objectActionExecutors.filter(
				(objectActionExecutor) =>
					objectActionExecutor.value !== 'groovy'
			);
		}
	}

	return (
		
			
				{TABS.map(({key, label}, index) => (
					 {
							setActiveIndex(index);

							if (key === 'action-builder') {
								Liferay.fire('reloadFDS');
							}
						}}
					>
						{label}
					
				))}
			

			
				
					
				

				
					
				
			
		
	);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy