import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { Link } from '@tanstack/react-router' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { qk } from '@/shared/api/query-keys' import { useApiError } from '@/shared/lib/use-api-error' import { Badge } from '@/shared/ui/badge' import { Button } from '@/shared/ui/button' import { Input } from '@/shared/ui/input' import { sortRows, useTableSort } from '@/shared/lib/table-sort' import { SortHeader } from '@/shared/ui/sortable' import { createGroup, deleteGroup, listGroups } from './api' import { DurationLabel } from './DurationLabel' export function GroupsPanel() { const { t } = useTranslation() const queryClient = useQueryClient() const [name, setName] = useState('') const { sort, toggle } = useTableSort('name', false) const { data, isLoading } = useQuery({ queryKey: qk.groups.all, queryFn: listGroups }) const invalidate = () => queryClient.invalidateQueries({ queryKey: qk.groups.all }) const onError = useApiError() const createMutation = useMutation({ mutationFn: () => createGroup({ name: name.trim() }), onSuccess: () => { setName('') invalidate() }, onError, }) const deleteMutation = useMutation({ mutationFn: deleteGroup, onSuccess: invalidate, onError }) const rows = sortRows(data ?? [], sort, { name: (g) => g.name.toLowerCase(), items: (g) => g.itemCount, units: (g) => g.unitCount, duration: (g) => g.totalDurationSeconds, }) return (

{t('admin.groups.title')}

{t('admin.groups.hint')}

setName(e.target.value)} />
{isLoading && ( )} {rows.map((group) => ( ))}
{t('common.actions')}
{t('common.loading')}
{group.name} {group.hasFilter && ( {t('admin.groups.hasFilter')} )}
{group.itemCount} {group.unitCount}
) }