import { useState } from "react"; import { Anchor, Box, Button, Group, Stack, Table, TableTbody, TableTh, TableThead, TableTr } from "@mantine/core"; import { IconPlus } from "@tabler/icons-react"; import { useModalAction } from "@homarr/modals"; import { useI18n, useScopedI18n } from "@homarr/translation/client"; import { Link, UserAvatar } from "@homarr/ui"; import type { AccessQueryData } from "./access-settings"; import { AccessDisplayRow, AccessSelectRow } from "./access-table-rows"; import { useAccessContext } from "./context"; import type { AccessFormType, HandleCountChange } from "./form"; import { FormProvider, useForm } from "./form"; import { UserSelectModal } from "./user-select-modal"; export interface FormProps { entity: { id: string; ownerId: string | null; owner: { id: string; name: string | null; image: string | null; email: string | null; } | null; }; accessQueryData: AccessQueryData; handleCountChange: HandleCountChange; handleSubmit: (values: AccessFormType) => void; isPending: boolean; } export const UsersAccessForm = ({ entity, accessQueryData, handleCountChange, handleSubmit, isPending, }: FormProps) => { const { defaultPermission } = useAccessContext(); const [users, setUsers] = useState>( new Map(accessQueryData.users.map(({ user }) => [user.id, user])), ); const { openModal } = useModalAction(UserSelectModal); const t = useI18n(); const tPermissions = useScopedI18n("permission"); const form = useForm({ initialValues: { items: accessQueryData.users.map(({ user, permission }) => ({ principalId: user.id, permission, })), }, }); const handleAddUser = () => { const presentUserIds = form.values.items.map(({ principalId: id }) => id); openModal({ presentUserIds: entity.ownerId ? presentUserIds.concat(entity.ownerId) : presentUserIds, onSelect: (user) => { setUsers((prev) => new Map(prev).set(user.id, user)); form.setFieldValue("items", [ { principalId: user.id, permission: defaultPermission, }, ...form.values.items, ]); handleCountChange((prev) => prev + 1); }, }); }; return (
handleSubmit(values as AccessFormType))}> {tPermissions("field.user.label")} {tPermissions("field.permission.label")} {entity.owner && ( } permission="full" /> )} {form.values.items.map((row, index) => ( } permission={row.permission} index={index} handleCountChange={handleCountChange} /> ))}
); }; interface UserItemContentProps { user: { id: string; name: string | null; image: string | null; email: string | null; }; } const UserItemContent = ({ user }: UserItemContentProps) => { return ( {user.name} ); };