Skip to content

employee registry added#61

Merged
FAZ110 merged 6 commits into
developfrom
IP-124-rejestr-pracownikow
May 24, 2026
Merged

employee registry added#61
FAZ110 merged 6 commits into
developfrom
IP-124-rejestr-pracownikow

Conversation

@FAZ110
Copy link
Copy Markdown
Owner

@FAZ110 FAZ110 commented May 21, 2026

No description provided.

@rrogalski
Copy link
Copy Markdown
Collaborator

rrogalski commented May 21, 2026

Dobrze jakby skorzystać z komponentów shadcn, żeby te widoki były spójne, bo obecnie wyglądają inaczej:

image image

Tutaj też pojawia się kolejny mankament własnej implementacji w postaci następującego buga: rozpoczęcie wyszukiwania w pasku sprawia że cały komponent ładuje się na nowo, tzn. nie tylko tabela z użytkownikami, ale również filtry i szukajka rysują się na nowo i przez to np. pole wyszukiwania traci focus.

Przydałoby się zmienić ten komponent data-table od shadcn u nas w projekcie, tak, żeby obsługiwał paginację prawidłowo - bo obecnie tego nie robi.

pagination,
},
})
const isServerSide = !!serverPagination;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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',
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum zamiast stringa

onRowClick,
}: DataTableProps<TData, TValue>) {
const [pagination, setPagination] = useState<PaginationState>({
const [clientPagination, setClientPagination] = useState<PaginationState>({
Copy link
Copy Markdown
Collaborator

@rrogalski rrogalski May 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 = () =>
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ogólnie to wartości puste reprezentujemy przez null, a nie undefined, ale to już szczegół

{
status: UserStatus.ACTIVE,
userRole: roleFilter,
search: debouncedSearch || undefined,
Copy link
Copy Markdown
Collaborator

@rrogalski rrogalski May 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to || undefined jest dziwne, przecież debouncedSearch zawsze istnieje

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

może wrzućmy ten plik do folderu src/lib bo trochę nie pasuje obok komponentów ui

@FAZ110 FAZ110 merged commit cea7e8d into develop May 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants