"use client"; import { useState } from "react"; import type { UserRole } from "@/config/homeAppsConfig"; import { permissionItems } from "@/config/permissionsMatrixConfig"; import { organizationsService } from "@/services/api/organizationsService"; import { rolesAccessService } from "@/services/api/rolesAccessService"; import type { CustomOrganizationRole, PermissionItem } from "@/types/rolesAccess"; import { formatJalaliDate, toPersianDigits } from "@/lib/persianFormat"; import { ActionButton, Field, SelectField } from "@/components/org-users/shared"; import { CustomRolePermissionEditor } from "../components/CustomRolePermissionEditor"; import { DeleteCustomRoleModal } from "../modals/DeleteCustomRoleModal"; import { SensitivePermissionConfirmModal } from "../modals/SensitivePermissionConfirmModal"; export function CustomOrganizationRolesSection({ role, customRoles, onChange, onToast }: { role: UserRole; customRoles: CustomOrganizationRole[]; onChange: (roles: CustomOrganizationRole[]) => void; onToast: (message: string, tone?: "success" | "error") => void }) { const organizations = organizationsService.listOrganizations(); const [draft, setDraft] = useState({ organizationId: organizations[0]?.id || "", nameFa: "", descriptionFa: "", isActive: true, permissions: Object.fromEntries(permissionItems.map((item) => [item.id, false])) }); const [createOpen, setCreateOpen] = useState(false); const [query, setQuery] = useState(""); const [orgFilter, setOrgFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all"); const [editing, setEditing] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const [pendingSensitive, setPendingSensitive] = useState<{ item: PermissionItem; value: boolean; customRole?: CustomOrganizationRole } | null>(null); if (role !== "super_admin") return

نقش سفارشی سازمانی

در این نسخه، ساخت و ویرایش نقش سفارشی فقط برای مدیر کل سامانه فعال است.

; const createRole = () => { if (!draft.nameFa || !draft.organizationId) return onToast("نام نقش و سازمان هدف اجباری هستند.", "error"); const created = rolesAccessService.createCustomRole({ ...draft, usersCount: 0 }); onChange(rolesAccessService.listCustomRoles()); onToast(`نقش ${created.nameFa} ساخته شد.`); setCreateOpen(false); }; const toggleDraft = (item: PermissionItem, value: boolean) => { if (item.isSensitive) return setPendingSensitive({ item, value }); setDraft({ ...draft, permissions: { ...draft.permissions, [item.id]: value } }); }; const applySensitive = () => { if (!pendingSensitive) return; if (pendingSensitive.customRole) { onChange(customRoles.map((r) => r.id === pendingSensitive.customRole?.id ? { ...r, permissions: { ...r.permissions, [pendingSensitive.item.id]: pendingSensitive.value }, updatedAt: new Date().toISOString() } : r)); } else { setDraft({ ...draft, permissions: { ...draft.permissions, [pendingSensitive.item.id]: pendingSensitive.value } }); } setPendingSensitive(null); onToast("تغییرات ذخیره شد."); }; const deactivateOrDelete = () => { if (!deleteTarget) return; onChange(customRoles.filter((roleItem) => roleItem.id !== deleteTarget.id)); setDeleteTarget(null); onToast("نقش حذف شد و کاربران دارای این نقش به کارکنان منتقل می‌شوند."); }; const filteredRoles = customRoles.filter((item) => (!query || item.nameFa.includes(query)) && (orgFilter === "all" || item.organizationId === orgFilter) && (statusFilter === "all" || String(item.isActive) === statusFilter)); const groupToggleDraft = (items: PermissionItem[], value: boolean) => setDraft({ ...draft, permissions: { ...draft.permissions, ...Object.fromEntries(items.map((item) => [item.id, value])) } }); return (
setCreateOpen(true)}>ساخت نقش جدید
[org.id, org.displayNameFa] as [string, string])]} />
{["نام نقش", "سازمان", "وضعیت", "کاربران", "دسترسی فعال", "تاریخ ایجاد", "عملیات"].map((h) => )}{filteredRoles.map((item) => )}
{h}
{item.nameFa}{organizations.find((org) => org.id === item.organizationId)?.displayNameFa || "—"}{item.isActive ? "فعال" : "غیرفعال"}{toPersianDigits(item.usersCount)}{toPersianDigits(Object.values(item.permissions).filter(Boolean).length)}{formatJalaliDate(item.createdAt)}
setEditing(item)}>مشاهده / ویرایش setDeleteTarget(item)}>حذف
{createOpen &&

ساخت نقش جدید

setCreateOpen(false)}>بستن
setDraft({ ...draft, nameFa })} /> setDraft({ ...draft, organizationId })} options={organizations.map((org) => [org.id, org.displayNameFa] as [string, string])} /> setDraft({ ...draft, descriptionFa })} /> setDraft({ ...draft, isActive: v === "active" })} options={[["active", "فعال"], ["inactive", "غیرفعال"]]} />
setCreateOpen(false)}>انصرافذخیره نقش
} {editing &&

{editing.nameFa}

setEditing(null)}>بستن
item.isSensitive ? setPendingSensitive({ item, value, customRole: editing }) : onChange(customRoles.map((r) => r.id === editing.id ? { ...r, permissions: { ...r.permissions, [item.id]: value }, updatedAt: new Date().toISOString() } : r))} onGroupToggle={(items, value) => onChange(customRoles.map((r) => r.id === editing.id ? { ...r, permissions: { ...r.permissions, ...Object.fromEntries(items.map((item) => [item.id, value])) }, updatedAt: new Date().toISOString() } : r))} />
setEditing(null)}>انصراف setEditing(null)}>ذخیره نقش
} {deleteTarget && setDeleteTarget(null)} onConfirm={deactivateOrDelete} />} {pendingSensitive && setPendingSensitive(null)} onConfirm={applySensitive} />}
); }