import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@repo/shadcn-ui/components/button"; import { Checkbox } from "@repo/shadcn-ui/components/checkbox"; import { EntityAction, EntityListHeader, EntityRowActions, EntityStatus, EntityTable, } from "@repo/shadcn-ui/components/entity-list"; import { FormActions, FormDialog } from "@repo/shadcn-ui/components/form-dialog"; import { Input } from "@repo/shadcn-ui/components/input"; import { Label } from "@repo/shadcn-ui/components/label"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useEffect, useId, useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import type { CompanyDTO, DepartmentDTO, DepartmentRequestDTO } from "../../common"; import { DepartmentRequestSchema } from "../../common"; import { EntityHelp } from "../access/entity-help"; import { companyApi, companyKeys } from "../api/company-api"; import { CompanyFeedback } from "./company-feedback"; export function DepartmentForm({ companyId, department, csrfToken, onSaved, requireActive = false, }: { companyId: string; department?: DepartmentDTO | undefined; csrfToken: string; onSaved: (id: string) => void; requireActive?: boolean; }) { const { t } = useTranslation("companies"); const id = useId(); const client = useQueryClient(); const mounted = useRef(true); useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []); const form = useForm({ resolver: zodResolver(DepartmentRequestSchema), defaultValues: { name: department?.name ?? "", active: department?.active ?? true }, }); const mutation = useMutation({ mutationFn: (values: DepartmentRequestDTO) => companyApi.department(companyId, department?.id, values, csrfToken), onSuccess: (response) => { client.setQueryData(companyKeys.detail(companyId), response); const saved = department ? response.company.departments.find((item) => item.id === department.id) : response.company.departments.at(-1); if (saved && mounted.current) { onSaved(saved.id); } }, }); return (
mutation.mutate(values))}>
form.setValue("active", checked === true, { shouldDirty: true }) } />
{department && (

{t("departmentDeactivationHelp")}

)} 0} /> ); } export function DepartmentSection({ company, csrfToken, }: { company: CompanyDTO; csrfToken: string; }) { const { t, i18n } = useTranslation("companies"); const [editor, setEditor] = useState(); const selected = company.departments.find((item) => item.id === editor); return (
setEditor("new")}>{t("newDepartment")}} locale={i18n.language} title={t("departments")} /> item.name, hideable: false, render: (item) => <>{item.name}, }, { id: "state", label: t("status"), value: (item) => t(item.active ? "active" : "inactive"), render: (item) => ( {t(item.active ? "active" : "inactive")} ), }, { id: "people", label: t("people"), value: (item) => company.assignments.filter( (entry) => entry.departmentId === item.id && entry.endDate === null ).length, render: (item) => ( <> { company.assignments.filter( (entry) => entry.departmentId === item.id && entry.endDate === null ).length } ), }, { id: "actions", label: t("actions"), hideable: false, render: (item) => ( setEditor(item.id)}>{t("edit")} ), }, ]} emptyMessage={t("noDepartments")} items={company.departments} locale={i18n.language} title={t("departments")} /> { if (!open) { setEditor(undefined); } }} open={editor !== undefined} title={t(selected ? "editDepartment" : "newDepartment")} > setEditor(undefined)} />
); }