import type { PrimitiveAtom } from 'jotai'; import type { ReactElement } from 'react'; import type { JsonDecoder } from 'ts.data.json'; import type { Column, ListingModel, SearchParameter } from '../../..'; import type { ListingSubItems } from '../../Listing/models'; interface CrudPageRootLabels { title: string; welcome: { title: string; description?: string; }; actions: { create: string; }; listing: { search: string; }; } export interface UseListingQueryKeyProps { queryKeyName: string; filtersAtom: PrimitiveAtom; } export interface UseGetItemsProps { queryKeyName: string; filtersAtom: PrimitiveAtom; decoder?: JsonDecoder.Decoder>; baseEndpoint: string; getSearchParameters: ({ search, filters }: { search: string; filters: TFilters; }) => SearchParameter; } export interface UseGetItemsState { items: Array; hasItems: boolean; isDataEmpty: boolean; isLoading: boolean; total: number; } export interface DeleteItem { deleteEndpoint: (item: ItemToDelete) => string; modalSize?: 'small' | 'medium' | 'large' | 'xlarge'; labels: { successMessage: | ((item: ItemToDelete) => string | ReactElement) | string | ReactElement; title: | ((item: ItemToDelete) => string | ReactElement) | string | ReactElement; description: | ((item: ItemToDelete) => string | ReactElement) | string | ReactElement; cancel: string; confirm: string; }; } export interface GetItem { baseEndpoint: (id: number) => string; decoder?: JsonDecoder.Decoder; adapter: (item: TItem) => TItemForm; itemQueryKey: string; } export interface Form { Form: (props: { Buttons: () => JSX.Element; initialValues?: TItemForm; isLoading?: boolean; }) => JSX.Element; getItem: GetItem; modalSize?: 'small' | 'medium' | 'large' | 'xlarge'; labels: { add: { title: string; cancel: string; confirm: string; }; update: { title: string; cancel: string; confirm: string; }; }; } export interface ListingProps { rows: Array; total: number; isLoading: boolean; columns: Array; subItems?: ListingSubItems & { canDeleteSubItems?: boolean; }; filters: JSX.Element; } export interface ItemToDelete { id: number; name: string; parent?: { id: number; name: string }; } export interface CrudPageRootProps extends UseGetItemsProps, Omit, 'rows' | 'total' | 'isLoading'> { form: Form; labels: CrudPageRootLabels; deleteItem: DeleteItem; }