"use client" import * as React from "react" import { Checkbox } from "@/components/ui/checkbox" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { cn } from "@/lib/utils" export type PermissionMatrixRole = { key: string label: React.ReactNode } export type PermissionMatrixPermission = { key: string label: React.ReactNode description?: React.ReactNode } export type PermissionMatrixValue = Record export type PermissionsMatrixProps = React.ComponentProps<"div"> & { roles: PermissionMatrixRole[] permissions: PermissionMatrixPermission[] value?: PermissionMatrixValue onValueChange?: (value: PermissionMatrixValue) => void } function PermissionsMatrix({ roles, permissions, value = {}, onValueChange, className, ...props }: PermissionsMatrixProps) { const toggle = (permissionKey: string, roleKey: string) => { const current = value[permissionKey] ?? [] const next = current.includes(roleKey) ? current.filter((item) => item !== roleKey) : [...current, roleKey] onValueChange?.({ ...value, [permissionKey]: next }) } return (
Permission {roles.map((role) => {role.label})} {permissions.map((permission) => ( {permission.label} {permission.description ? {permission.description} : null} {roles.map((role) => ( toggle(permission.key, role.key)} /> ))} ))}
) } export { PermissionsMatrix }