"use client"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Add, Clear, PersonAdd, PersonRemove, Remove, Search, } from "@mui/icons-material"; import { useTranslation } from "react-i18next"; import { FieldErrors, FormProvider, SubmitErrorHandler, SubmitHandler, useForm, useFormContext, } from "react-hook-form"; import { Box, Card, CardContent, Grid, IconButton, InputAdornment, Stack, Tab, Tabs, TabsProps, TextField, Typography, } from "@mui/material"; import { differenceBy } from "lodash"; import { UserInputs } from "@/app/api/user/actions"; import { auth } from "@/app/api/group/actions"; import SearchResults, { Column } from "../SearchResults"; export interface Props { auths: auth[]; } const AuthAllocation: React.FC = ({ auths }) => { const { t } = useTranslation(); const searchParams = useSearchParams(); const id = parseInt(searchParams.get("id") || "0"); const { setValue, getValues, formState: { defaultValues }, reset, resetField, } = useFormContext(); const initialAuths = auths.map((u) => ({ ...u })).sort((a, b) => a.id - b.id); const [filteredAuths, setFilteredAuths] = useState(initialAuths); const [selectedAuths, setSelectedAuths] = useState( () => { return filteredAuths.filter( (s) => getValues("addAuthIds")?.includes(s.id) ); } ); const [removeAuthIds, setRemoveAuthIds] = useState([]); // Adding / Removing Auth const addAuth = useCallback((auth: auth) => { setSelectedAuths((a) => [...a, auth]); }, []); const removeAuth = useCallback((auth: auth) => { setSelectedAuths((a) => a.filter((a) => a.id !== auth.id)); setRemoveAuthIds((prevIds) => [...prevIds, auth.id]); }, []); const clearAuth = useCallback(() => { if (defaultValues !== undefined) { resetField("addAuthIds"); setSelectedAuths( initialAuths.filter( (auth) => defaultValues.addAuthIds?.includes(auth.id) ) ); } }, [defaultValues]); // Sync with form useEffect(() => { setValue( "addAuthIds", selectedAuths.map((a) => a.id) ); setValue("removeAuthIds", removeAuthIds); }, [selectedAuths, removeAuthIds, setValue]); const AuthPoolColumns = useMemo[]>( () => [ { label: t("Add"), name: "id", onClick: addAuth, buttonIcon: , }, { label: t("authority"), name: "authority" }, { label: t("description"), name: "name" }, ], [addAuth, t] ); const allocatedAuthColumns = useMemo[]>( () => [ { label: t("Remove"), name: "id", onClick: removeAuth, buttonIcon: , }, { label: t("authority"), name: "authority" }, { label: t("description"), name: "name" }, ], [removeAuth, selectedAuths, t] ); const [query, setQuery] = React.useState(""); const onQueryInputChange = React.useCallback< React.ChangeEventHandler >((e) => { setQuery(e.target.value); }, []); const clearQueryInput = React.useCallback(() => { setQuery(""); }, []); React.useEffect(() => { setFilteredAuths( initialAuths.filter((a) => ( a.authority.toLowerCase().includes(query.toLowerCase()) || a.name?.toLowerCase().includes(query.toLowerCase()) ) ) ); }, [auths, query]); const resetAuth = React.useCallback(() => { clearQueryInput(); clearAuth(); }, [clearQueryInput, clearAuth]); const formProps = useForm({}); // Tab related const [tabIndex, setTabIndex] = React.useState(0); const handleTabChange = React.useCallback>( (_e, newValue) => { setTabIndex(newValue); }, [] ); return ( <> {t("Authority")} ), }} /> {tabIndex === 0 && ( )} {tabIndex === 1 && ( )} ); }; export default AuthAllocation;