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

META-INF.resources.js.EditRolePermissionsNavigation.js 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 {ClayInput} from '@clayui/form';
import {ClayVerticalNav} from '@clayui/nav';
import {useDebounce} from '@clayui/shared';
import React, {useCallback, useEffect, useMemo, useState} from 'react';

export default function EditRolePermissionsNavigation({
	items,
	portletNamespace,
}) {
	const [activeItemId, setActiveItemId] = useState();
	const [expandedKeys, setExpandedKeys] = useState(new Set([]));
	const [filterQuery, setFilterQuery] = useState('');

	const debouncedFilterQuery = useDebounce(filterQuery, 200);

	const handleItemClick = useCallback(
		(item) => {
			const method = `${portletNamespace}loadContent`;

			window[method](item.resourceURL);

			setActiveItemId(item.id);
		},
		[portletNamespace, setActiveItemId]
	);

	const processItems = useCallback(
		(items) => {
			const processedExpandedKeys = new Set([]);
			const processedItems = [];
			let hasActiveChild = false;

			items.forEach((item) => {
				const {
					className,
					id,
					items: childItems,
					label,
					resourceURL,
				} = item;
				const normalizedFilterQuery = debouncedFilterQuery
					.trim()
					.toLowerCase();

				const hasFilterQuery = normalizedFilterQuery !== '';

				const showItem =
					!hasFilterQuery ||
					item.items ||
					item.ignoreFilter ||
					label.toLowerCase().includes(normalizedFilterQuery);

				if (showItem) {
					const processedItem = {
						className,
						id,
						label,
						resourceURL,
					};

					const active = activeItemId
						? activeItemId === id
						: item.active;

					if (active) {
						hasActiveChild = true;

						processedItem.active = true;
					}

					if (childItems) {
						const [
							processedChildItems,
							childExpandedKeys,
							hasActiveGrandchild,
						] = processItems(childItems);

						if (!processedChildItems.length) {
							return;
						}

						processedItem.items = processedChildItems;

						if (
							hasFilterQuery ||
							(!hasFilterQuery && hasActiveGrandchild) ||
							item.initialExpanded
						) {
							processedExpandedKeys.add(id);
						}

						childExpandedKeys.forEach((key) =>
							processedExpandedKeys.add(key)
						);

						if (hasActiveGrandchild) {
							hasActiveChild = true;
						}
					}

					processedItems.push(processedItem);
				}
			});

			return [processedItems, processedExpandedKeys, hasActiveChild];
		},
		[activeItemId, debouncedFilterQuery]
	);

	const [processedItems, processedExpandedKeys] = useMemo(
		() => processItems(items),
		[processItems, items]
	);

	useEffect(
		() => setExpandedKeys(processedExpandedKeys),

		// eslint-disable-next-line react-hooks/exhaustive-deps
		[debouncedFilterQuery]
	);

	return (
		<>
			
setFilterQuery(event.target.value)} placeholder={Liferay.Language.get('search')} type="text" value={filterQuery} />
{processedItems.length > 1 ? ( {(item) => ( handleItemClick(item) : undefined } > {item.label} )} ) : (
{Liferay.Language.get('there-are-no-results')}
)} ); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy