import { __ } from '@/utils/i18n'; import { Head, usePage } from '@inertiajs/react'; import { Cell, ColumnDef, ColumnFiltersState, flexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel, Row, SortingState, useReactTable, VisibilityState, } from '@tanstack/react-table'; import { ArrowUpDown, MoreHorizontal, Tag } from 'lucide-react'; import { useState } from 'react'; import { index as labelsIndex } from '@/actions/App/Http/Controllers/Settings/LabelController'; import HeadingSmall from '@/components/heading-small'; import { CreateLabelDialog } from '@/components/labels/create-label-dialog'; import { DeleteLabelDialog } from '@/components/labels/delete-label-dialog'; import { EditLabelDialog } from '@/components/labels/edit-label-dialog'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuTrigger, } from '@/components/ui/context-menu'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Input } from '@/components/ui/input'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { type BreadcrumbItem } from '@/types'; import { getLabelColorClasses, type Label } from '@/types/label'; const breadcrumbs: BreadcrumbItem[] = [ { title: 'Labels settings', href: labelsIndex().url, }, ]; function LabelActions({ label }: { label: Label }) { const [editOpen, setEditOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); return ( <> {__('Open menu')} {__('Actions')} setEditOpen(true)}> {__('Edit')} setDeleteOpen(true)} variant="destructive" > {__('Delete')} {}} /> {}} /> > ); } function LabelRow({ row }: { row: Row }) { const label = row.original; const [editOpen, setEditOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [contextMenuOpen, setContextMenuOpen] = useState(false); return ( <> {row .getVisibleCells() .map((cell: Cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} {__('Actions')} setEditOpen(true)}> {__('Edit')} setDeleteOpen(true)} variant="destructive" > {__('Delete')} {}} /> {}} /> > ); } export default function Labels() { const { labels } = usePage<{ labels: Label[] }>().props; const [sorting, setSorting] = useState([ { id: 'name', desc: false }, ]); const [columnFilters, setColumnFilters] = useState([]); const [columnVisibility, setColumnVisibility] = useState( {}, ); const columns: ColumnDef[] = [ { accessorKey: 'name', header: ({ column }) => { return ( column.toggleSorting(column.getIsSorted() === 'asc') } > {__('Name')} ); }, cell: ({ row }) => { return ( {row.getValue('name')} ); }, }, { accessorKey: 'color', header: __('Color'), cell: ({ row }) => { const color = row.getValue('color') as Label['color']; if (!color) { return null; } const colorClasses = getLabelColorClasses(color); return ( {__(color).toLocaleUpperCase()} ); }, }, { id: 'actions', enableHiding: false, cell: ({ row }) => , }, ]; const table = useReactTable({ data: labels, columns, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, state: { sorting, columnFilters, columnVisibility, }, }); return ( table .getColumn('name') ?.setFilterValue(event.target.value) } className="max-w-sm" /> {}} /> {table .getHeaderGroups() .map((headerGroup) => ( {headerGroup.headers.map( (header) => { return ( {header.isPlaceholder ? null : flexRender( header .column .columnDef .header, header.getContext(), )} ); }, )} ))} {table.getRowModel().rows?.length ? ( table .getRowModel() .rows.map((row) => ( )) ) : ( {__('No labels found.')} )} {table.getFilteredRowModel().rows.length}{' '} {__('label(s) total.')} ); }