/* eslint-disable @next/next/no-img-element */ import CardList from "@/components/High/CardList"; import Layout from "@/components/High/Layout"; import Select from "@/components/Low/Select"; import Tooltip from "@/components/Low/Tooltip"; import { useEntityPermission } from "@/hooks/useEntityPermissions"; import {useListSearch} from "@/hooks/useListSearch"; import usePagination from "@/hooks/usePagination"; import {Entity, EntityWithRoles, Role} from "@/interfaces/entity"; import {GroupWithUsers, User} from "@/interfaces/user"; import {sessionOptions} from "@/lib/session"; import {USER_TYPE_LABELS} from "@/resources/user"; import { findBy, redirect, serialize } from "@/utils"; import {getEntityWithRoles} from "@/utils/entities.be"; import {convertToUsers, getGroup} from "@/utils/groups.be"; import {shouldRedirectHome} from "@/utils/navigation.disabled"; import {checkAccess, doesEntityAllow, getTypesOfUser} from "@/utils/permissions"; import {getUserName} from "@/utils/users"; import {getEntityUsers, getLinkedUsers, getSpecificUsers} from "@/utils/users.be"; import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react"; import axios from "axios"; import clsx from "clsx"; import {withIronSessionSsr} from "iron-session/next"; import moment from "moment"; import Head from "next/head"; import Link from "next/link"; import {useRouter} from "next/router"; import {Divider} from "primereact/divider"; import {useEffect, useMemo, useState} from "react"; import { BsChevronLeft, BsClockFill, BsEnvelopeFill, BsFillPersonVcardFill, BsPerson, BsPlus, BsSquare, BsStopwatchFill, BsTag, BsTrash, BsX, } from "react-icons/bs"; import {toast} from "react-toastify"; export const getServerSideProps = withIronSessionSsr(async ({req, params}) => { const user = req.session.user as User; if (!user) return redirect("/login") if (shouldRedirectHome(user)) return redirect("/") const {id} = params as {id: string}; const entity = await getEntityWithRoles(id); if (!entity) return redirect("/entities") if (!doesEntityAllow(user, entity, "view_entities")) return redirect(`/entities`) const linkedUsers = await getLinkedUsers(user.id, user.type); const entityUsers = await getEntityUsers(id); const usersWithRole = entityUsers.map((u) => { const e = u.entities.find((e) => e.id === id); return {...u, role: findBy(entity.roles, 'id', e?.role)}; }); return { props: serialize({ user, entity, users: usersWithRole, linkedUsers: linkedUsers.users, }), }; }, sessionOptions); type UserWithRole = User & {role?: Role}; interface Props { user: User; entity: EntityWithRoles; users: UserWithRole[]; linkedUsers: User[]; } export default function Home({user, entity, users, linkedUsers}: Props) { const [isAdding, setIsAdding] = useState(false); const [isLoading, setIsLoading] = useState(false); const [selectedUsers, setSelectedUsers] = useState([]); const router = useRouter(); const canRenameEntity = useEntityPermission(user, entity, "rename_entity") const canViewRoles = useEntityPermission(user, entity, "view_entity_roles") const canDeleteEntity = useEntityPermission(user, entity, "delete_entity") const canAddMembers = useEntityPermission(user, entity, "add_to_entity") const canRemoveMembers = useEntityPermission(user, entity, "remove_from_entity") const canAssignRole = useEntityPermission(user, entity, "assign_to_role") const toggleUser = (u: User) => setSelectedUsers((prev) => (prev.includes(u.id) ? prev.filter((p) => p !== u.id) : [...prev, u.id])); const removeParticipants = () => { if (selectedUsers.length === 0) return; if (!canRemoveMembers) return; if (!confirm(`Are you sure you want to remove ${selectedUsers.length} member${selectedUsers.length === 1 ? "" : "s"} from this entity?`)) return; setIsLoading(true); axios .patch(`/api/entities/${entity.id}/users`, {add: false, members: selectedUsers}) .then(() => { toast.success("The entity has been updated successfully!"); router.replace(router.asPath); setSelectedUsers([]); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); }; const addParticipants = () => { if (selectedUsers.length === 0) return; if (!canAddMembers || !isAdding) return; if (!confirm(`Are you sure you want to add ${selectedUsers.length} member${selectedUsers.length === 1 ? "" : "s"} to this entity?`)) return; setIsLoading(true); const defaultRole = findBy(entity.roles, 'isDefault', true)! axios .patch(`/api/entities/${entity.id}/users`, {add: true, members: selectedUsers, role: defaultRole.id}) .then(() => { toast.success("The entity has been updated successfully!"); router.replace(router.asPath); setIsAdding(false); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); }; const renameGroup = () => { if (!canRenameEntity) return; const label = prompt("Rename this entity:", entity.label); if (!label) return; setIsLoading(true); axios .patch(`/api/entities/${entity.id}`, {label}) .then(() => { toast.success("The entity has been updated successfully!"); router.replace(router.asPath); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); }; const deleteGroup = () => { if (!canDeleteEntity) return; if (!confirm("Are you sure you want to delete this entity?")) return; setIsLoading(true); axios .delete(`/api/entities/${entity.id}`) .then(() => { toast.success("This entity has been successfully deleted!"); router.replace("/entities"); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); }; const assignUsersToRole = (role: string) => { if (!canAssignRole) return if (selectedUsers.length === 0) return setIsLoading(true); axios .post(`/api/roles/${role}/users`, {users: selectedUsers}) .then(() => { toast.success("The role has been assigned successfully!"); router.replace(router.asPath); }) .catch((e) => { console.error(e); toast.error("Something went wrong!"); }) .finally(() => setIsLoading(false)); } const renderCard = (u: UserWithRole) => { return ( ); }; useEffect(() => setSelectedUsers([]), [isAdding]); return ( <> {entity.label} | EnCoach

{entity.label}

Members ({users.length}) {!isAdding && (
Assign Role {entity.roles.map((role) => ( ))}
)} {isAdding && (
)}
list={isAdding ? linkedUsers : users} renderCard={renderCard} searchFields={[["name"], ["corporateInformation", "companyInformation", "name"], ["role", "label"], ["type"]]} />
); }