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

META-INF.resources.components.item_finder.ItemFinder.js Maven / Gradle / Ivy

/**
 * 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 {FDS_EVENT} from '@liferay/frontend-data-set-web';
import {fetch} from 'frontend-js-web';
import PropTypes from 'prop-types';
import React, {useEffect, useState} from 'react';

import {fetchParams} from '../../utilities/index';
import {
	showErrorNotification,
	showNotification,
} from '../../utilities/notifications';
import AddOrCreate from './AddOrCreate';

import './item_finder.scss';

function ItemFinder(props) {
	const [items, setItems] = useState([]);
	const [pageSize, setPageSize] = useState(props.pageSize);
	const [currentPage, setCurrentPage] = useState(props.currentPage);
	const [textFilter, setTextFilter] = useState('');
	const [itemsCount, setItemsCount] = useState(props.itemsCount || 0);
	const [selectedItems, setSelectedItems] = useState([]);

	useEffect(() => {
		if (!textFilter) {
			setItems(null);
			setItemsCount(0);

			return;
		}

		fetch(
			`${props.apiUrl}${
				props.apiUrl.includes('?') ? '&' : '?'
			}pageSize=${pageSize}&page=${currentPage}&search=${encodeURIComponent(
				textFilter
			)}`,
			{
				...fetchParams,
				method: 'GET',
			}
		)
			.then((data) => data.json())
			.then((jsonResponse) => {
				setItems(jsonResponse.items);
				setItemsCount(jsonResponse.totalCount);
			})
			.catch(showErrorNotification);
	}, [
		pageSize,
		currentPage,
		textFilter,
		setItems,
		setItemsCount,
		props.apiUrl,
	]);

	useEffect(() => {
		props
			.getSelectedItems()
			.then((selectedItems = []) => setSelectedItems(selectedItems));

		function handleDataSetActions(event) {
			if (props.linkedDataSetsId.includes(event.id)) {
				props
					.getSelectedItems()
					.then((selectedItems = []) =>
						setSelectedItems(selectedItems)
					);
			}
		}

		Liferay.on(FDS_EVENT.ACTION_PERFORMED, handleDataSetActions);

		return () =>
			Liferay.detach(FDS_EVENT.ACTION_PERFORMED, handleDataSetActions);
	}, [props, props.getSelectedItems]);

	function selectItem(itemId) {
		const selectedItem = items.find(
			(item) => item[props.itemsKey] === itemId
		);
		props
			.onItemSelected(selectedItem)
			.then(() => {
				if (props.multiSelectableEntries) {
					showNotification(props.itemSelectedMessage);
				}
				else {
					setSelectedItems((i) => [...i, itemId]);
				}
			})
			.catch(showErrorNotification);
	}

	function createItem() {
		props
			.onItemCreated(textFilter)
			.then((id) => {
				showNotification(props.itemCreatedMessage);

				setTextFilter('');

				if (id) {
					setSelectedItems((i) => [...i, id]);
				}
			})
			.catch(showErrorNotification);
	}

	return (
		
	);
}

ItemFinder.propTypes = {
	apiUrl: PropTypes.string.isRequired,
	createNewItemLabel: PropTypes.string,
	getSelectedItems: PropTypes.func.isRequired,
	inputPlaceholder: PropTypes.string,
	itemCreatedMessage: PropTypes.string,
	itemCreation: PropTypes.bool,
	itemSelectedMessage: PropTypes.string,
	itemsKey: PropTypes.string.isRequired,
	linkedDataSetsId: PropTypes.arrayOf(PropTypes.string),
	multiSelectableEntries: PropTypes.bool,
	onItemCreated: PropTypes.func.isRequired,
	onItemSelected: PropTypes.func.isRequired,
	pageSize: PropTypes.number,
	panelHeaderLabel: PropTypes.string,
	schema: PropTypes.array.isRequired,
	titleLabel: PropTypes.string,
};

ItemFinder.defaultProps = {
	currentPage: 1,
	itemCreatedMessage: Liferay.Language.get('item-created'),
	itemCreation: true,
	itemSelectedMessage: Liferay.Language.get('item-selected'),
	multiSelectableEntries: false,
	pageSize: 5,
	selectedItems: [],
};

export default ItemFinder;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy