employee registry added#61
Conversation
| pagination, | ||
| }, | ||
| }) | ||
| const isServerSide = !!serverPagination; |
There was a problem hiding this comment.
nie uważasz, że to jest trochę dziwne, żeby mieć dwa stany od paginacji?
propozycja z chatu, wygląda sensownie imo:
Wrzucamy stan paginacji do osobnego pliku:
import { useState } from "react"
import { PaginationState } from "@tanstack/react-table"
export interface DataTableControl {
pagination: PaginationState
onPaginationChange: React.Dispatch<React.SetStateAction<PaginationState>>
}
export function useDataTableControls(initialPageSize = 10): DataTableControl {
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: initialPageSize,
})
return {
pagination,
onPaginationChange: setPagination,
}
}Wiążemy zewnętrzny stan z data-table:
interface DataTableProps<TData, TValue> {
columns: ColumnDef<TData, TValue>[]
data: TData[]
pageCount: number
isLoading?: boolean
control: DataTableControl // <--- Wstrzykujemy kontroler stanu
}
export function DataTable<TData, TValue>({
columns,
data,
pageCount,
isLoading,
control,
}: DataTableProps<TData, TValue>) {
const table = useReactTable({
data,
columns,
pageCount,
manualPagination: true,
getCoreRowModel: getCoreRowModel(),
// Łączymy stan TanStacka bezpośrednio z naszym zewnętrznym hookiem:
state: {
pagination: control.pagination,
},
onPaginationChange: control.onPaginationChange,
})Tak to łączymy:
import { useDataTableControls } from "./useDataTableControls"
import { useSearchUsers } from "./hooks/useSearchUsers"
import { DataTable } from "./DataTable"
import { columns } from "./columns"
export function UsersPage() {
// 1. Inicjalizujesz kontroler tabeli
const tableControl = useDataTableControls(10)
// 2. Przekazujesz jego stan do swojego hooka z React Query
const { data, isLoading } = useSearchUsers(tableControl.pagination)
// 3. Renderujesz tabelę łącząc kropki
return (
<div className="p-8">
<h1 className="text-xl font-bold mb-4">Użytkownicy</h1>
<DataTable
columns={columns}
data={data?.items ?? []}
pageCount={data?.totalPages ?? 0}
isLoading={isLoading}
control={tableControl} // <--- Wszystko spina się samo
/>
</div>
)
}|
|
||
| const { users, isLoading, isError } = useUsersQuery(page, PAGE_SIZE, filters); | ||
| const { users, isLoading, isError } = useUsersQuery(page, PAGE_SIZE, { | ||
| status: 'ACTIVE', |
| onRowClick, | ||
| }: DataTableProps<TData, TValue>) { | ||
| const [pagination, setPagination] = useState<PaginationState>({ | ||
| const [clientPagination, setClientPagination] = useState<PaginationState>({ |
There was a problem hiding this comment.
teraz można to zastąpic naszym hookiem który stworzyliśmy, bo robi dokładnie to samo, możemy to nazwać np backoffPagination i używać w momencie kiedy control nie zostało przekazane z zewnątrz
| }, | ||
| }) | ||
|
|
||
| const isServerSide = !!control |
There was a problem hiding this comment.
to jest juz niepotrzebne, a ten kod niżej się uprości w konsekwencji zmian zaproponowanych przeze mnie wyżej
| const navigate = useNavigate(); | ||
| const tableControl = useDataTableControls(20); | ||
|
|
||
| const resetPage = () => |
There was a problem hiding this comment.
można tą funkcję wrzucić do tego naszego hooka useDataTableControls bo z tym komponentem ona nie ma nic wspólnego
| import type { UserRole } from '@/features/auth/auth.types'; | ||
|
|
||
| export const useEmployeeRegistry = (pagination: PaginationState, resetPage: () => void) => { | ||
| const [roleFilter, setRoleFilter] = useState<UserRole | undefined>(undefined); |
There was a problem hiding this comment.
ogólnie to wartości puste reprezentujemy przez null, a nie undefined, ale to już szczegół
| { | ||
| status: UserStatus.ACTIVE, | ||
| userRole: roleFilter, | ||
| search: debouncedSearch || undefined, |
There was a problem hiding this comment.
to || undefined jest dziwne, przecież debouncedSearch zawsze istnieje
There was a problem hiding this comment.
może wrzućmy ten plik do folderu src/lib bo trochę nie pasuje obok komponentów ui


No description provided.