pagamio-frontend-commons-lib
Version:
Pagamio library for Frontend reusable components like the form engine and table container
159 lines (158 loc) • 7.11 kB
TypeScript
import type { QueryParamConfig, ResponseMapping } from '../../api';
import type { BaseEntity, CoreTableColumnDef, SortConfig } from '../../pagamio-table/data-table/types';
/**
* Props interface for usePagamioTable hook
*/
export interface UsePagamioTableProps<T extends BaseEntity> {
/** Function to fetch data from the API */
fetchData?: (query?: Record<string, string>, signal?: AbortSignal) => Promise<any>;
/** Data for client-side operations */
data?: T[];
/** Table column definitions */
columns: CoreTableColumnDef<T>[];
/** Initial filter values */
defaultFilters?: Record<string, string>;
/** Configuration for response structure mapping */
responseMapping?: ResponseMapping;
/** Configuration for query parameter formatting */
queryParamConfig?: QueryParamConfig;
/** Pagination configuration */
pagination?: {
enabled: boolean;
mode: 'client' | 'server';
pageSize?: number;
pageIndex?: number;
};
/** Filtering configuration */
filtering?: {
enabled: boolean;
mode: 'client' | 'server';
searchMode?: 'client' | 'server';
};
/** Sorting configuration */
sorting?: {
enabled: boolean;
mode: 'client' | 'server';
};
}
interface UsePagamioTableReturn<T extends BaseEntity> {
data: T[];
totalItems: number;
loading: boolean;
error: string | null;
currentPage: number;
itemsPerPage: number;
searchQuery: string;
selectedFilters: Record<string, string>;
appliedFilters: Record<string, string>;
sortConfig: SortConfig;
columns: CoreTableColumnDef<T>[];
handleApplyFilters: () => void;
handlePageChange: (newPage: number) => void;
handlePaginationChange: (newPageIndex: number, newPageSize: number) => void;
setSearchQuery: (query: string) => void;
setCurrentPage: (page: number) => void;
setItemsPerPage: (size: number) => void;
handleFilterChange: (columnKey: string, value: string) => void;
handleSort: (sortBy: string, sortDir: 'asc' | 'desc') => void;
handleClearFilters: () => void;
refresh: () => void;
}
export declare const springBootMapping: ResponseMapping;
export declare const arrayResponseMapping: ResponseMapping;
/**
* Custom hook for managing table data with pagination, sorting, and filtering.
* Supports both client-side and server-side operations.
*
* @template T - The type of data items in the table. Must extend `BaseEntity`.
*
* @param {UsePagamioTableProps<T>} props - Configuration options for the hook.
* @param {Function} [props.fetchData] - Function to fetch data from the API (required for server-side operations).
* @param {T[]} [props.data] - Initial data for client-side operations.
* @param {CoreTableColumnDef<T>[]} props.columns - Column definitions for the table.
* @param {Record<string, string>} [props.defaultFilters] - Initial filter values.
* @param {ResponseMapping} [props.responseMapping] - Configuration for mapping API response structure.
* @param {QueryParamConfig} [props.queryParamConfig] - Configuration for query parameter formatting.
* @param {Object} [props.pagination] - Pagination configuration.
* @param {boolean} [props.pagination.enabled] - Whether pagination is enabled.
* @param {'client' | 'server'} [props.pagination.mode] - Pagination mode ('client' or 'server').
* @param {number} [props.pagination.pageSize] - Default page size.
* @param {Object} [props.filtering] - Filtering configuration.
* @param {boolean} [props.filtering.enabled] - Whether filtering is enabled.
* @param {'client' | 'server'} [props.filtering.mode] - Filtering mode ('client' or 'server').
* @param {Object} [props.sorting] - Sorting configuration.
* @param {boolean} [props.sorting.enabled] - Whether sorting is enabled.
* @param {'client' | 'server'} [props.sorting.mode] - Sorting mode ('client' or 'server').
*
* @returns {Object} - Table state and utility functions.
* @returns {T[]} data - The processed and paginated data.
* @returns {number} totalItems - Total number of items (for server-side pagination).
* @returns {boolean} loading - Whether data is being fetched.
* @returns {string | null} error - Error message, if any.
* @returns {number} currentPage - Current page index.
* @returns {number} itemsPerPage - Number of items per page.
* @returns {string} searchQuery - Current search query.
* @returns {Record<string, string>} appliedFilters - Currently applied filters.
* @returns {Record<string, string>} selectedFilters - Currently selected filters.
* @returns {SortConfig} sortConfig - Current sorting configuration.
* @returns {CoreTableColumnDef<T>[]} columns - Column definitions.
* @returns {Function} handleApplyFilters - Function to apply filters.
* @returns {Function} handlePageChange - Function to change the current page.
* @returns {Function} handlePaginationChange - Function to change pagination settings.
* @returns {Function} setSearchQuery - Function to update the search query.
* @returns {Function} setCurrentPage - Function to update the current page.
* @returns {Function} setItemsPerPage - Function to update the items per page.
* @returns {Function} handleFilterChange - Function to update filters.
* @returns {Function} handleSort - Function to update sorting.
* @returns {Function} handleClearFilters - Function to clear all filters.
* @returns {Function} refresh - Function to manually refresh the table data.
*/
export declare const usePagamioTable: <T extends BaseEntity>({ fetchData, data: clientData, columns, defaultFilters, responseMapping, queryParamConfig, pagination, filtering, sorting, }: UsePagamioTableProps<T>) => UsePagamioTableReturn<T>;
export {};
/**
* Example usage of the `usePagamioTable` hook.
*
* @example
* const table = usePagamioTable<Product>({
* fetchData: fetchProducts,
* columns: columns as unknown as CoreTableColumnDef<Product>[],
* defaultFilters: initialFilters,
* pagination: { enabled: true, mode: "server" },
* filtering: { enabled: true, mode: "server" },
* queryParamConfig: {
* filtering: { searchParam: "name", filterFormat: "flat" },
* },
* });
*
* // Render the table
* return (
* <CoreTable
* columns={table.columns}
* data={table.data}
* pagination={{
* enabled: true,
* pageIndex: table.currentPage,
* pageSize: table.itemsPerPage,
* itemsPerPage: table.itemsPerPage,
* itemsPerPageOptions: [10, 25, 50],
* onPageChange: table.handlePageChange,
* onPaginationChange: table.handlePaginationChange,
* }}
* filtering={{
* filters: filters,
* appliedFilters: table.selectedFilters,
* onTableFilter: table.handleFilterChange,
* }}
* sorting={{
* sortConfig: table.sortConfig,
* onSort: table.handleSort,
* }}
* search={{
* enabled: true,
* searchQuery: table.searchQuery,
* onSearch: (e) => table.setSearchQuery(e.target.value),
* }}
* onClearFilters={table.handleClearFilters}
* />
* );
*/