"use client"; import { useState } from "react"; import type { RankCategory, SeafarerDocType } from "@prisma/client"; import { AddRankButton, EditRankButton } from "./rank-form"; import { RankDocPanel } from "./rank-doc-panel"; import { RowActionsMenu, RowActionsItem, RowActionsDestructiveItem, RowActionsSeparator } from "@/components/ui/row-actions-menu"; import { DeleteConfirmDialog } from "@/components/ui/delete-confirm-dialog"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { deleteRank, toggleRankActive } from "./actions"; import { cn } from "@/lib/utils"; export type DocReqRow = { id: string; docType: SeafarerDocType; isMandatory: boolean; note: string | null; }; export type RankRow = { id: string; code: string; name: string; description: string | null; category: RankCategory; isSeafarer: boolean; grantsLogin: boolean; isActive: boolean; parentId: string | null; docRequirements: DocReqRow[]; }; type TreeNode = RankRow & { children: TreeNode[] }; function buildTree(ranks: RankRow[]): TreeNode[] { const byId = new Map(); ranks.forEach((r) => byId.set(r.id, { ...r, children: [] })); const roots: TreeNode[] = []; byId.forEach((node) => { if (node.parentId && byId.has(node.parentId)) { byId.get(node.parentId)!.children.push(node); } else { roots.push(node); } }); const sortRec = (nodes: TreeNode[]) => { nodes.sort((a, b) => a.name.localeCompare(b.name)); nodes.forEach((n) => sortRec(n.children)); }; sortRec(roots); return roots; } function RankActionsMenu({ rank, allRanks }: { rank: RankRow; allRanks: RankRow[] }) { const [editOpen, setEditOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [toggleOpen, setToggleOpen] = useState(false); return ( <> setEditOpen(true)}>Edit setToggleOpen(true)}> {rank.isActive ? "Deactivate" : "Activate"} setDeleteOpen(true)}>Delete deleteRank(rank.id)} />