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

META-INF.resources.invite_members.js.InviteMembers.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 ClayButton, {ClayButtonWithIcon} from '@clayui/button';
import {Option, Picker, Text} from '@clayui/core';
import ClayForm, {ClayInput} from '@clayui/form';
import ClayIcon from '@clayui/icon';
import ClayList from '@clayui/list';
import ClayModal, {useModal} from '@clayui/modal';
import ClayTable from '@clayui/table';
import {ClayTooltipProvider} from '@clayui/tooltip';
import {debounce, fetch, sub} from 'frontend-js-web';
import React, {useCallback, useEffect, useState} from 'react';

export function InviteMembers({
	assignRolesPermission,
	getAvailableUsersURL,
	manageTeamsPermission,
	portletNamespace,
	roles,
	scopeGroupId,
	sendInvitesURL,
	teams,
}) {
	const {observer, onOpenChange, open} = useModal();

	const [invitedEmails, setInvitedEmails] = useState([]);
	const [invitedUsers, setInvitedUsers] = useState([]);
	const [invitedUsersIds, setInvitedUsersIds] = useState([]);
	const [roleId, setRoleId] = useState('');
	const [teamId, setTeamId] = useState('');
	const [users, setUsers] = useState([]);
	const [viewMoreCount, setViewMoreCount] = useState(1);

	const fetchAvailableUsers = useCallback(
		({end = 50, keywords = ''} = {}) => {
			const url = new URL(getAvailableUsersURL);

			const body = new URLSearchParams(
				Liferay.Util.ns(portletNamespace, {
					end,
					keywords,
					start: 0,
				})
			);

			fetch(url, {
				body,
				method: 'POST',
			})
				.then((response) => response.json())
				.then(({users}) => {
					setUsers(users);
				});
		},
		[getAvailableUsersURL, portletNamespace]
	);

	useEffect(() => {
		fetchAvailableUsers({end: viewMoreCount * 50});
	}, [fetchAvailableUsers, viewMoreCount]);

	const onAddEmailClickHandler = () => {
		const emailValue = document.getElementById(
			`${portletNamespace}emailAddress`
		).value;

		if (
			emailValue &&
			!invitedEmails.find((email) => email === emailValue)
		) {
			setInvitedEmails([...invitedEmails, emailValue]);
		}
	};

	const onUserClickHandler = (user) => {
		if (
			invitedUsers.find(
				(invitedUser) => invitedUser.userId === user.userId
			)
		) {
			removeInvitedUser(user);
		}
		else {
			setInvitedUsers([...invitedUsers, user]);

			setInvitedUsersIds([...invitedUsersIds, user.userId]);
		}
	};

	const removeInvitedUser = ({userId}) => {
		setInvitedUsers(
			invitedUsers.filter((invitedUser) => invitedUser.userId !== userId)
		);

		setInvitedUsersIds(
			invitedUsersIds.filter(
				(invitedUsersId) => invitedUsersId !== userId
			)
		);
	};

	const searchUsersCallback = (event) => {
		const debouncedFetch = debounce((keywords) => {
			fetchAvailableUsers({keywords});
		}, 1000);

		debouncedFetch(event.target.value);
	};

	const Users = () => {
		return users.map((user) => {
			return (
				
{invitedUsersIds.find( (invitedUsersId) => invitedUsersId === user.userId ) ? ( onUserClickHandler(user)} size="xs" symbol="times" title={Liferay.Language.get('remove')} /> ) : user.hasPendingMemberRequest ? ( onUserClickHandler(user)} size="xs" symbol="check" title={Liferay.Language.get( 'user-already-invited' )} /> ) : ( onUserClickHandler(user)} size="xs" symbol="plus" title={Liferay.Language.get('add')} /> )} {user.userFullName} {user.userEmailAddress}
); }); }; const InvitedEmails = () => { return ( {invitedEmails.map((invitedEmail) => { return ( {invitedEmail} { setInvitedEmails( invitedEmails.filter( (emailToRemove) => emailToRemove !== invitedEmail ) ); }} symbol="times" title={Liferay.Language.get('remove')} /> ); })} ); }; const InvitedUsers = () => { return ( {invitedUsers.map((invitedUser) => { return (

{invitedUser.userFullName}

{invitedUser.userEmailAddress} { removeInvitedUser(invitedUser); }} symbol="times" title={Liferay.Language.get('remove')} />
); })}
); }; return ( <> {open && ( {Liferay.Language.get('invite-members')}
{Liferay.Language.get( 'previous-invitation-was-sent' )} { searchUsersCallback(event); }} placeholder={Liferay.Language.get( 'search' )} />
{!users.length && ( {Liferay.Language.get( 'there-are-no-users-to-invite' )} )} {!!users.length && } {users.length / (viewMoreCount * 50) > 1 && (
{ setViewMoreCount( viewMoreCount + 1 ); }} > {Liferay.Language.get( 'view-more' )}
)}
{!!invitedUsers && }
onAddEmailClickHandler() } type="button" > {Liferay.Language.get( 'add-email-address' )}
{!!invitedEmails && }
{roles.length !== 0 && assignRolesPermission && ( setRoleId(roleId) } > {({label, value}) => ( )} )} {teams.length !== 0 && manageTeamsPermission && ( setTeamId(teamId) } > {({label, value}) => ( )} )}
onOpenChange(false)} > {Liferay.Language.get('cancel')} {Liferay.Language.get('send-invitations')} } />
)} onOpenChange(true)} > {Liferay.Language.get('invite-members')} ); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy