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

META-INF.resources.js.components.Layout.LayoutScreen.ModalAddObjectLayoutTab.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 ClayButton from '@clayui/button';
import {Option} from '@clayui/core';
import ClayForm from '@clayui/form';
import ClayLabel from '@clayui/label';
import ClayModal from '@clayui/modal';
import {Observer} from '@clayui/modal/lib/types';
import {ClayTooltipProvider} from '@clayui/tooltip';
import {
	FormError,
	Input,
	SingleSelect,
	constantsUtils,
	stringUtils,
	useForm,
} from '@liferay/object-js-components-web';
import classNames from 'classnames';
import React, {useMemo, useState} from 'react';

import {defaultLanguageId} from '../../../utils/constants';
import {TYPES as EVENT_TYPES, useLayoutContext} from '../objectLayoutContext';
import {TObjectLayoutTab, TObjectRelationship} from '../types';

import './ModalAddObjectLayoutTab.scss';

type TTabTypes = {
	[key: string]: {
		active: boolean;
		description: string;
		label: string;
	};
};

type TLabelInfo = {
	displayType: 'info' | 'secondary' | 'success';
	labelContent: string;
};

const TYPES = {
	FIELDS: 'fields',
	RELATIONSHIPS: 'relationships',
};

const types: TTabTypes = {
	[TYPES.FIELDS]: {
		active: true,
		description: Liferay.Language.get(
			'display-fields-and-one-to-one-relationships'
		),
		label: Liferay.Language.get('fields'),
	},
	[TYPES.RELATIONSHIPS]: {
		active: false,
		description: Liferay.Language.get('display-multiple-relationships'),
		label: Liferay.Language.get('relationships'),
	},
};

interface ModalAddObjectLayoutTabProps
	extends React.HTMLAttributes {
	observer: Observer;
	onClose: () => void;
}

interface TabTypeProps extends React.HTMLAttributes {
	description: string;
	disabled?: boolean;
	disabledMessage?: string;
	label: string;
	onChangeType: (type: string) => void;
	selected: string;
	type: string;
}

interface ObjectRelationshipItem extends LabelValueObject {
	reverse: boolean;
}

function TabType({
	description,
	disabled = false,
	label,
	onChangeType,
	selected,
	type,
}: TabTypeProps) {
	const tabProps = {
		'data-tooltip-align': 'top',
		'onClick': () => {},
		'title': Liferay.Language.get(
			'the-first-tab-in-the-layout-cannot-be-a-relationship-tab'
		),
	};

	return (
		
			
onChangeType(type)} {...(disabled && tabProps)} >
{label}
{description}
); } function getRelationshipInfo(reverse: boolean): TLabelInfo { return { displayType: reverse ? 'info' : 'success', labelContent: reverse ? Liferay.Language.get('child') : Liferay.Language.get('parent'), }; } export function ModalAddObjectLayoutTab({ observer, onClose, }: ModalAddObjectLayoutTabProps) { const [ { creationLanguageId, objectLayout: {objectLayoutTabs}, objectRelationships, }, dispatch, ] = useLayoutContext(); const [selectedType, setSelectedType] = useState(TYPES.FIELDS); const [selectedRelationship, setSelectedRelationship] = useState(); const objectRelationshipItems = useMemo(() => { const availableObjectRelationships: ObjectRelationshipItem[] = []; objectRelationships.forEach(({id, inLayout, label, name, reverse}) => { if (!inLayout) { availableObjectRelationships.push({ label: stringUtils.getLocalizableLabel({ fallbackLabel: name, fallbackLanguageId: creationLanguageId, labels: label, }), reverse, value: id.toString(), }); } }); return availableObjectRelationships; }, [creationLanguageId, objectRelationships]); const onSubmit = (values: TObjectLayoutTab) => { dispatch({ payload: { name: { [defaultLanguageId]: values.name[defaultLanguageId], }, objectRelationshipId: values.objectRelationshipId, }, type: EVENT_TYPES.ADD_OBJECT_LAYOUT_TAB, }); onClose(); }; const onValidate = (values: Partial) => { const errors: FormError = {}; if ( !stringUtils.getLocalizableLabel({ fallbackLanguageId: creationLanguageId, labels: values.name, }) ) { errors.name = constantsUtils.REQUIRED_MSG; } if ( !values.objectRelationshipId && selectedType === TYPES.RELATIONSHIPS ) { errors.objectRelationshipId = constantsUtils.REQUIRED_MSG; } return errors; }; const {errors, handleSubmit, setValues, values} = useForm( { initialValues: {}, onSubmit, validate: onValidate, } ); return ( {Liferay.Language.get('add-tab')} { setValues({ name: { [defaultLanguageId]: value, }, }); }} required value={stringUtils.getLocalizableLabel({ fallbackLanguageId: creationLanguageId, labels: values.name, })} /> {Object.keys(types).map((key) => { const {description, label} = types[key]; return ( ); })} {selectedType === TYPES.RELATIONSHIPS && ( { const selectedObjectRelationship = objectRelationships.find( ({id}) => id.toString() === value ); setSelectedRelationship( selectedObjectRelationship ); setValues({ objectRelationshipId: selectedObjectRelationship?.id, }); }} required selectedKey={selectedRelationship?.id.toString()} > {({label, reverse, value}) => { const relationshipInfo = getRelationshipInfo(reverse); return ( ); }} )} {Liferay.Language.get('cancel')} {Liferay.Language.get('save')} } /> ); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy