import { useMemo, useState } from "react"; import { useCreateTicketDepartment, useCreateTicketStatus, useCreateTicketSubject, useDeleteTicketDepartmentMutation, useDeleteTicketStatusMutation, useDeleteTicketSubjectMutation, useTicketDepartments, useTicketStatuses, useTicketSubjects, useUpdateTicketDepartmentMutation, useUpdateTicketStatusConfigMutation, useUpdateTicketSubjectMutation, } from "../core/_hooks"; import { TicketDepartment, TicketStatus, TicketSubject, } from "../core/_models"; import { PageContainer, PageTitle, SectionTitle } from "@/components/ui/Typography"; import { Button } from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import { Table } from "@/components/ui/Table"; import { TableColumn } from "@/types"; import { Settings, Edit3, Trash2 } from "lucide-react"; type TabKey = "departments" | "statuses" | "subjects"; const TicketConfigPage = () => { const [activeTab, setActiveTab] = useState("departments"); const { data: departments } = useTicketDepartments({ activeOnly: true }); const { data: statuses } = useTicketStatuses({ activeOnly: false }); const { data: subjects } = useTicketSubjects({ activeOnly: false }); const { mutate: createDepartment, isPending: isCreatingDepartment } = useCreateTicketDepartment(); const { mutate: updateDepartment, isPending: isUpdatingDepartment } = useUpdateTicketDepartmentMutation(); const { mutate: deleteDepartment } = useDeleteTicketDepartmentMutation(); const { mutate: createStatus, isPending: isCreatingStatus } = useCreateTicketStatus(); const { mutate: updateStatus, isPending: isUpdatingStatus } = useUpdateTicketStatusConfigMutation(); const { mutate: deleteStatus } = useDeleteTicketStatusMutation(); const { mutate: createSubject, isPending: isCreatingSubject } = useCreateTicketSubject(); const { mutate: updateSubject, isPending: isUpdatingSubject } = useUpdateTicketSubjectMutation(); const { mutate: deleteSubject } = useDeleteTicketSubjectMutation(); const [departmentForm, setDepartmentForm] = useState({ id: null as number | null, name: "", slug: "", position: "", is_active: "true", }); const [statusForm, setStatusForm] = useState({ id: null as number | null, name: "", slug: "", position: "", is_active: "true", }); const [subjectForm, setSubjectForm] = useState({ id: null as number | null, department_id: "", name: "", slug: "", position: "", is_active: "true", }); const resetDepartmentForm = () => setDepartmentForm({ id: null, name: "", slug: "", position: "", is_active: "true", }); const resetStatusForm = () => setStatusForm({ id: null, name: "", slug: "", position: "", is_active: "true", }); const resetSubjectForm = () => setSubjectForm({ id: null, department_id: "", name: "", slug: "", position: "", is_active: "true", }); const handleDepartmentSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!departmentForm.name || !departmentForm.slug || !departmentForm.position) return; const payload = { name: departmentForm.name, slug: departmentForm.slug, position: Number(departmentForm.position), is_active: departmentForm.is_active === "true", }; if (departmentForm.id) { updateDepartment( { id: departmentForm.id, payload }, { onSuccess: resetDepartmentForm } ); } else { createDepartment(payload, { onSuccess: resetDepartmentForm }); } }; const handleStatusSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!statusForm.name || !statusForm.slug || !statusForm.position) return; const payload = { name: statusForm.name, slug: statusForm.slug, position: Number(statusForm.position), is_active: statusForm.is_active === "true", }; if (statusForm.id) { updateStatus( { id: statusForm.id, payload }, { onSuccess: resetStatusForm } ); } else { createStatus(payload, { onSuccess: resetStatusForm }); } }; const handleSubjectSubmit = (e: React.FormEvent) => { e.preventDefault(); if ( !subjectForm.department_id || !subjectForm.name || !subjectForm.slug || !subjectForm.position ) return; const payload = { department_id: Number(subjectForm.department_id), name: subjectForm.name, slug: subjectForm.slug, position: Number(subjectForm.position), is_active: subjectForm.is_active === "true", }; if (subjectForm.id) { updateSubject( { id: subjectForm.id, payload }, { onSuccess: resetSubjectForm } ); } else { createSubject(payload, { onSuccess: resetSubjectForm }); } }; const departmentColumns: TableColumn[] = useMemo( () => [ { key: "name", label: "نام", align: "right" }, { key: "slug", label: "شناسه", align: "right" }, { key: "position", label: "ترتیب", align: "center" }, { key: "is_active", label: "وضعیت", render: (value: boolean) => (value ? "فعال" : "غیرفعال"), }, { key: "actions", label: "عملیات", render: (_val: unknown, row: TicketDepartment) => (
), }, ], [deleteDepartment] ); const statusColumns: TableColumn[] = useMemo( () => [ { key: "name", label: "نام", align: "right" }, { key: "slug", label: "شناسه", align: "right" }, { key: "position", label: "ترتیب", align: "center" }, { key: "is_active", label: "وضعیت", render: (value: boolean) => (value ? "فعال" : "غیرفعال"), }, { key: "actions", label: "عملیات", render: (_val: unknown, row: TicketStatus) => (
), }, ], [deleteStatus] ); const subjectColumns: TableColumn[] = useMemo( () => [ { key: "name", label: "نام", align: "right" }, { key: "department", label: "دپارتمان", align: "right", render: (_val: unknown, row: TicketSubject) => row.department?.name || "-", }, { key: "slug", label: "شناسه", align: "right" }, { key: "position", label: "ترتیب", align: "center" }, { key: "is_active", label: "وضعیت", render: (value: boolean) => (value ? "فعال" : "غیرفعال"), }, { key: "actions", label: "عملیات", render: (_val: unknown, row: TicketSubject) => (
), }, ], [deleteSubject] ); const renderDepartments = () => (
لیست دپارتمان‌ها
{departmentForm.id ? "ویرایش دپارتمان" : "دپارتمان جدید"}
setDepartmentForm((prev) => ({ ...prev, name: e.target.value })) } /> setDepartmentForm((prev) => ({ ...prev, slug: e.target.value })) } /> setDepartmentForm((prev) => ({ ...prev, position: e.target.value, })) } />
{departmentForm.id && ( )}
); const renderStatuses = () => (
لیست وضعیت‌ها
{statusForm.id ? "ویرایش وضعیت" : "وضعیت جدید"}
setStatusForm((prev) => ({ ...prev, name: e.target.value })) } /> setStatusForm((prev) => ({ ...prev, slug: e.target.value })) } /> setStatusForm((prev) => ({ ...prev, position: e.target.value, })) } />
{statusForm.id && ( )}
); const renderSubjects = () => (
لیست موضوعات
{subjectForm.id ? "ویرایش موضوع" : "موضوع جدید"}
setSubjectForm((prev) => ({ ...prev, name: e.target.value })) } /> setSubjectForm((prev) => ({ ...prev, slug: e.target.value })) } /> setSubjectForm((prev) => ({ ...prev, position: e.target.value, })) } />
{subjectForm.id && ( )}
); return (
تنظیمات تیکت
{activeTab === "departments" && renderDepartments()} {activeTab === "statuses" && renderStatuses()} {activeTab === "subjects" && renderSubjects()}
); }; export default TicketConfigPage;