erp-pos-ecommerce-shared 0.2.19 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interfaces/form.interface.ts","../src/services/config.ts","../src/services/product.service.ts","../src/utils/notifications.tsx","../src/components/form/ImageForm.tsx","../src/components/form/FieldGenerator.tsx","../src/components/form/ButtonGenerator.tsx","../src/components/form/schemaGenerator.ts","../src/components/form/FormGenerator.tsx","../src/components/form/CreateEditForm.tsx","../src/theme/constants.ts","../src/hooks/useMediaQuery.ts","../src/components/table/BottomPagination.tsx","../src/interfaces/datatable.interface.ts","../src/hooks/useDataTable.ts","../src/components/table/TableHeader.tsx","../src/components/table/TableBody.tsx","../src/components/table/TableSkeleton.tsx","../src/components/table/EmptyState.tsx","../src/components/table/SimpleDataTable.tsx","../src/components/table/SearchInput.tsx","../src/components/table/FilterSelect.tsx","../src/components/table/FilterDate.tsx","../src/components/table/DataTable.tsx","../src/components/TablePage.tsx","../src/components/FormPage.tsx"],"names":["error","jsx","Text","date","Button","Fragment","jsxs","Box","Group","useMutation","Flex","useMantineMediaQuery","Select","useMemo","useState","useEffect","Table","Checkbox","flexRender","ActionIcon","_","Title","ScrollArea","TextInput","useRef","Menu","X","Search","ChevronUp","ChevronDown","Paper","Card"],"mappings":"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","file":"components.js","sourcesContent":["import type { TblProductsImage } from './product.interface';\n\nexport type IField =\n | ITextField\n | IPasswordField\n | INumberField\n | ISelectField\n | IMultiSelectField\n | IDateField\n | IEmailField\n | IHiddenField\n | ISwitchField\n | IFileField\n | ITagField;\n\nexport interface IHiddenField extends IBaseField {\n type: typeof FieldTypes.HIDDEN;\n}\n\nexport interface ITextField extends IBaseField {\n type: typeof FieldTypes.TEXT;\n}\n\nexport interface IEmailField extends IBaseField {\n type: typeof FieldTypes.EMAIL;\n}\n\nexport interface IPasswordField extends IBaseField {\n type: typeof FieldTypes.PASSWORD;\n}\n\nexport interface ITagField\n extends IBaseField,\n Omit<ISelect, 'options'> {\n type: typeof FieldTypes.TAG;\n options: TagData[];\n}\n\nexport interface ISwitchField extends IBaseField {\n type: typeof FieldTypes.SWITCH;\n defaultChecked?: boolean;\n labelPosition?: 'left' | 'right';\n onLabel?: string;\n offLabel?: string;\n}\n\nexport type FileType =\n | 'image'\n | 'video'\n | 'audio'\n | 'pdf'\n | 'document';\n\nexport interface IFileField extends IBaseField {\n type: typeof FieldTypes.FILE;\n multiple?: boolean;\n accept?: string[] | readonly string[];\n maxSize?: number;\n maxFiles?: number;\n maxSizeMessage?: string;\n maxFilesMessage?: string;\n fileType: FileType;\n defaultImages?: TblProductsImage[];\n}\n\nexport interface INumberField extends IBaseField {\n type: typeof FieldTypes.NUMBER;\n min?: number;\n max?: number;\n preffix?: string;\n suffix?: string;\n allowNegative?: boolean;\n allowDecimal?: boolean;\n decimalScale?: number;\n fixedDecimalScale?: boolean;\n decimalSeparator?: string;\n hideControls?: boolean;\n step?: number;\n}\n\nexport interface ISelectField extends IBaseField, ISelect {\n type: typeof FieldTypes.SELECT;\n}\n\nexport interface IMultiSelectField extends IBaseField, ISelect {\n type: typeof FieldTypes.MULTISELECT;\n}\n\nexport interface IDateField extends IBaseField {\n type: typeof FieldTypes.DATE;\n}\n\nexport interface ISelect extends IBaseField {\n options: IOptions[];\n allowDeselect?: boolean;\n clearable?: boolean;\n searchable?: boolean;\n nothingFoundMessage?: string;\n checkIconPosition?: 'right' | 'left';\n withCheckIcon?: boolean;\n limit?: number;\n renderOption?: (option: IOptions) => React.ReactNode;\n}\n\ntype ColumnWidth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport interface IBaseField {\n name: string;\n label?: string;\n description?: string;\n placeholder?: string;\n required?: boolean;\n error?: string;\n disabled?: boolean;\n defaultValue?: string | number | boolean | string[] | Date;\n requiredMessage?: string;\n columnWidth?: ColumnWidth;\n onChange?: (value: string) => void;\n section?: number;\n page?: number;\n}\n\nexport interface IButton {\n hidden?: boolean;\n type: ButtonTypes;\n label: string;\n fullWidth?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n disabled?: boolean;\n loading?: boolean;\n Icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n color?: string;\n variant?: \"gradient\" | \"subtle\" | \"filled\" | \"light\" | \"outline\" | \"transparent\" | \"white\" | \"default\"\n}\n\nexport interface IOptions {\n value: string;\n label: string;\n}\n\nexport interface TagData {\n value: string;\n}\n\nexport const FieldTypes = {\n TEXT: 'text',\n EMAIL: 'email',\n NUMBER: 'number',\n PASSWORD: 'password',\n SELECT: 'select',\n MULTISELECT: 'multiselect',\n DATE: 'date',\n HIDDEN: 'hidden',\n SWITCH: 'switch',\n FILE: 'file',\n TAG: 'tag',\n} as const;\n\nexport type FieldTypes = (typeof FieldTypes)[keyof typeof FieldTypes];\nexport type ButtonTypes =\n (typeof ButtonTypes)[keyof typeof ButtonTypes];\n\nexport const ButtonTypes = {\n SUBMIT: 'submit',\n BUTTON: 'button',\n RESET: 'reset',\n} as const;\n","import axios, { type AxiosInstance } from 'axios'\n\n/**\n * Configuration for the shared API client.\n * Each consuming app must call configureApi() with its own baseURL and auth.\n */\nexport interface IApiConfig {\n /** Backend base URL (e.g. \"http://localhost:4000/\" or \"https://api.myapp.com/\") */\n baseURL: string\n /** Returns the current auth token for request headers */\n getToken: () => string | undefined\n /** Called when a new token is received after refresh (e.g. update your store) */\n onTokenRefresh?: (newToken: string) => void\n /** Called when refresh fails (e.g. clear session, redirect to login) */\n onUnauthorized?: () => void\n}\n\n// Default instance; replaced when configureApi() is called by the consuming app\nlet api: AxiosInstance = axios.create({\n baseURL: '',\n headers: { 'Content-Type': 'application/json' }\n})\n\n/**\n * Configure the shared API client. Must be called by the consuming app before using any service.\n * @example\n * // In your app (e.g. main.tsx or before first API call):\n * import { configureApi } from 'erp-pos-ecommerce-shared'\n * import { useAuthStore } from './store/authStore'\n *\n * configureApi({\n * baseURL: import.meta.env.VITE_API_URL ?? 'http://localhost:4000/',\n * getToken: () => useAuthStore.getState().token,\n * onTokenRefresh: (newToken) => useAuthStore.setState({ token: newToken }),\n * onUnauthorized: () => { useAuthStore.setState({ token: undefined }); redirectToLogin() }\n * })\n */\nexport function configureApi(config: IApiConfig): AxiosInstance {\n const { baseURL, getToken, onTokenRefresh, onUnauthorized } = config\n\n const newApi = axios.create({\n baseURL,\n headers: {\n 'Content-Type': 'application/json',\n ...(getToken() && { Authorization: `Bearer ${getToken()}` })\n }\n })\n\n newApi.interceptors.request.use((reqConfig) => {\n const token = getToken()\n if (token) {\n reqConfig.headers.Authorization = `Bearer ${token}`\n }\n return reqConfig\n })\n\n const refreshAxios = axios.create({ baseURL })\n\n newApi.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config\n\n if (error.response?.status === 401 && !originalRequest._retry && onTokenRefresh && onUnauthorized) {\n originalRequest._retry = true\n\n try {\n const response = await refreshAxios.get('/auth/refresh', {\n headers: getToken() ? { Authorization: `Bearer ${getToken()}` } : {}\n })\n const newToken = response.data?.token\n if (newToken) {\n onTokenRefresh(newToken)\n originalRequest.headers.Authorization = `Bearer ${newToken}`\n return newApi(originalRequest)\n }\n } catch {\n onUnauthorized()\n return Promise.reject(error)\n }\n }\n\n return Promise.reject(error)\n }\n )\n\n api = newApi\n return api\n}\n\n/**\n * Shared axios instance used by all services.\n * Valid only after the consuming app has called configureApi().\n */\nexport { api }\n","import type { IFilterType } from '../interfaces/filters.interface'\nimport type {\n IProductResponse,\n IProduct,\n IProductDetailsResponse,\n IProductDetails\n} from '../interfaces/product.interface'\nimport { api } from './config'\n\ninterface ProductQuery {\n skip?: number\n limit?: number\n filters?: IFilterType\n}\n\ninterface CategoryQuery {\n category: number\n skip?: number\n limit?: number\n filters?: IFilterType\n}\n\nexport const getProductsForSelect = async (): Promise<IProduct[]> => {\n const { data } = await api.get<IProduct[]>('/product/select')\n return data\n}\n\nexport const getProducts = async ({\n skip = 0,\n limit = 16,\n filters\n}: ProductQuery): Promise<IProductDetailsResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.categoryId && { categoryId: filters.categoryId.toString() }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductDetailsResponse>(`product?${queryParams}`)\n return data\n}\n\nexport const getProductsTable = async ({\n skip = 0,\n limit = 16,\n filters\n}: ProductQuery): Promise<IProductResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.categoryId && { categoryId: filters.categoryId.toString() }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductResponse>(`product/table?${queryParams}`)\n return data\n}\n\nexport const getProductById = async ({\n productId\n}: {\n productId: number\n}): Promise<IProduct> => {\n const { data } = await api.get(`product/${productId}`)\n return data.data\n}\n\nexport const getProductVariants = async ({\n productId,\n skip = 0,\n limit = 10,\n query = ''\n}: {\n productId: number\n skip?: number\n limit?: number\n query?: string\n}): Promise<IProductDetailsResponse> => {\n const { data } = await api.get<IProductDetailsResponse>(`/product/variants/${productId}`, {\n params: {\n skip: skip.toString(),\n limit: limit.toString(),\n ...(query && { query })\n }\n })\n return data\n}\n\nexport const getProductVariantsForSelect = async ({\n productId\n}: {\n productId: number\n}): Promise<IProductDetails[]> => {\n const { data } = await api.get<IProductDetails[]>(`/product/variants/select/${productId}`)\n return data\n}\n\nexport const getProductVariantById = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<IProductDetails> => {\n const { data } = await api.get<IProductDetails>(`/product/variants/variant/${productDetailId}`)\n return data\n}\n\nexport const createProductVariant = async (variant: FormData): Promise<IProductDetails> => {\n const { data } = await api.post<IProductDetails>('product/variants', variant, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const createProductVariants = async (formData: FormData): Promise<IProductDetails[]> => {\n const { data } = await api.post<IProductDetails[]>('product/variants', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const updateProductVariant = async (data: FormData): Promise<IProductDetails> => {\n const { data: response } = await api.put<IProductDetails>(\n `product/variants/update/${data.get('productDetailID')}`,\n data,\n {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n }\n )\n return response\n}\n\nexport const deleteProductVariant = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<void> => {\n await api.delete(`/product/variants/${productDetailId}`)\n}\n\nexport const restoreProductVariant = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<void> => {\n await api.patch(`/product/variants/${productDetailId}`)\n}\n\nexport const createProduct = async (product: FormData): Promise<IProduct> => {\n const { data } = await api.post<IProduct>('product/', product, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const updateProduct = async ({\n productId,\n product\n}: {\n productId: number\n product: FormData\n}): Promise<IProduct> => {\n const { data } = await api.put<IProduct>(`/product/${productId}`, product, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const deleteImageFromProduct = async ({\n imageId\n}: {\n imageId: number\n}): Promise<void> => {\n await api.delete(`/product/images/${imageId}`)\n}\n\nexport const deleteProduct = async ({ productId }: { productId: number }): Promise<void> => {\n await api.delete(`/product/${productId}`)\n}\n\nexport const restoreProduct = async ({ productId }: { productId: number }): Promise<void> => {\n await api.patch(`/product/${productId}`)\n}\n\nexport const getProductsByCategory = async ({\n category,\n skip = 0,\n limit = 10,\n filters\n}: CategoryQuery): Promise<IProductResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductResponse>(`product/category/${category}?${queryParams}`)\n return data\n}\n\nexport interface PrintProductTagResponse {\n message?: string\n [key: string]: unknown\n}\n\nexport const printProductTag = async ({\n stockId,\n productId,\n isSmall\n}: {\n stockId: number\n productId: number\n isSmall: boolean\n}): Promise<PrintProductTagResponse> => {\n const { data } = await api.post<PrintProductTagResponse>(`/product/printproducttag/`, {\n stockID: stockId,\n productID: productId,\n isSmall\n })\n return data\n}\n","import type { ReactNode } from 'react';\nimport { notifications } from '@mantine/notifications';\nimport { Text } from '@mantine/core';\n\n// Icons are provided by the consuming app so this library stays icon-agnostic\nlet defaultSuccessIcon: ReactNode = undefined;\nlet defaultErrorIcon: ReactNode = undefined;\n\n/**\n * Configure default icons for success and error notifications.\n * Call this once at app startup (e.g. in your root layout) with your preferred icon library.\n * @example\n * // With lucide-react\n * configureNotificationIcons({ successIcon: <Check />, errorIcon: <X /> });\n * // With react-icons\n * configureNotificationIcons({ successIcon: <FiCheck />, errorIcon: <FiX /> });\n */\nexport const configureNotificationIcons = (config: {\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n}): void => {\n if (config.successIcon !== undefined) defaultSuccessIcon = config.successIcon;\n if (config.errorIcon !== undefined) defaultErrorIcon = config.errorIcon;\n};\n\nexport const successNotification = ({\n title,\n message,\n icon,\n}: {\n title: string;\n message: string;\n /** Override the default success icon for this call (optional) */\n icon?: ReactNode;\n}): void => {\n notifications.show({\n title: <Text>{title}</Text>,\n message: message,\n color: 'teal',\n icon: icon ?? defaultSuccessIcon,\n });\n};\n\nexport const errorNotification = ({\n title,\n message,\n icon,\n}: {\n title: string;\n message: string;\n /** Override the default error icon for this call (optional) */\n icon?: ReactNode;\n}): void => {\n notifications.show({\n title: <Text>{title}</Text>,\n message: message,\n color: 'red',\n icon: icon ?? defaultErrorIcon,\n });\n};\n","import type { ReactNode } from \"react\";\nimport {\n ActionIcon,\n Box,\n Button,\n Group,\n Image,\n rem,\n ScrollArea,\n Text,\n} from \"@mantine/core\";\nimport { Dropzone, IMAGE_MIME_TYPE } from \"@mantine/dropzone\";\nimport { modals } from \"@mantine/modals\";\nimport type { TblProductsImage } from \"../../interfaces/product.interface\";\nimport { deleteImageFromProduct } from \"../../services/product.service\";\nimport { useMutation } from \"@tanstack/react-query\";\n// Eliminado react-hook-form. Definimos una interfaz genérica compatible con TanStack Form\ninterface GenericFieldController<TValue> {\n value: TValue;\n onChange: (value: TValue) => void;\n onBlur?: () => void;\n}\nimport { useRef } from \"react\";\nimport { getIsDevEnv } from \"../../config/env\";\nimport {\n errorNotification,\n successNotification,\n} from \"../../utils/notifications\";\n\n// Icons are provided by the consuming app so this library stays icon-agnostic\nlet imageFormIcons: {\n acceptIcon?: ReactNode;\n rejectIcon?: ReactNode;\n idleIcon?: ReactNode;\n cameraIcon?: ReactNode;\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n} = {};\n\n/**\n * Configure icons for ImageForm (dropzone, camera button, notifications, delete).\n * Call once at app startup with your preferred icon library.\n * @example\n * import { Camera, Check, Image, Upload, X } from \"lucide-react\";\n * configureImageFormIcons({\n * acceptIcon: <Upload />, rejectIcon: <X />, idleIcon: <Image />,\n * cameraIcon: <Camera />, successIcon: <Check />, errorIcon: <X />,\n * });\n */\nexport const configureImageFormIcons = (config: {\n acceptIcon?: ReactNode;\n rejectIcon?: ReactNode;\n idleIcon?: ReactNode;\n cameraIcon?: ReactNode;\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n}): void => {\n imageFormIcons = { ...imageFormIcons, ...config };\n};\n\n// Añadir tipo para manejar tanto File como TblProductsImage\ntype ImageType = File | TblProductsImage;\n\ninterface ImageFormProps {\n field: GenericFieldController<\n File | TblProductsImage | (File | TblProductsImage)[] | null | undefined\n >;\n label: string;\n required?: boolean;\n multiple?: boolean;\n maxSize?: number;\n maxFiles?: number;\n maxSizeMessage?: string;\n maxFilesMessage?: string;\n defaultImages?: TblProductsImage[];\n error?: string;\n enableCamera?: boolean;\n}\n\nexport const ImageForm = ({\n field,\n label,\n required = false,\n multiple = false,\n maxSize = 5 * 1024 ** 2,\n maxFiles = 5,\n maxSizeMessage = \"El tamaño máximo de cada imagen es de 5mb\",\n maxFilesMessage = \"No se pueden subir más de 5 imágenes\",\n defaultImages = [],\n error,\n enableCamera = true,\n}: ImageFormProps): React.ReactNode => {\n const { mutate: deleteImage } = useMutation({\n mutationKey: [\"product\"],\n mutationFn: deleteImageFromProduct,\n onSuccess: () => {\n successNotification({\n title: \"Imagen eliminada con éxito\",\n message: \"La imagen ha sido eliminada con éxito\",\n icon: imageFormIcons.successIcon,\n });\n },\n onError: (error) => {\n errorNotification({\n title: \"Error al eliminar la imagen\",\n message: getIsDevEnv()\n ? error.message\n : \"Ha ocurrido un error al eliminar la imagen\",\n icon: imageFormIcons.errorIcon,\n });\n },\n });\n\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const handleCameraAccess = async (): Promise<void> => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n },\n });\n\n modals.open({\n title: \"Tomar foto\",\n size: \"lg\",\n children: (\n <Box>\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n style={{\n width: \"100%\",\n maxHeight: \"400px\",\n transform: \"scaleX(-1)\",\n }}\n />\n <Group justify=\"center\" mt=\"md\">\n <Button\n leftSection={imageFormIcons.cameraIcon}\n onClick={() => {\n const video = videoRef.current;\n if (!video) return;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n ctx.save();\n ctx.scale(-1, 1);\n ctx.drawImage(\n video,\n -canvas.width,\n 0,\n canvas.width,\n canvas.height,\n );\n ctx.restore();\n }\n\n canvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], \"photo.jpg\", {\n type: \"image/jpeg\",\n });\n const existing: ImageType[] = Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? ([field.value as ImageType] as ImageType[])\n : [];\n const newArray = [...existing, file];\n field.onChange(multiple ? newArray : file);\n\n stream.getTracks().forEach((track) => track.stop());\n modals.closeAll();\n }\n }, \"image/jpeg\");\n }}\n >\n Tomar foto\n </Button>\n </Group>\n </Box>\n ),\n onClose: () => {\n stream.getTracks().forEach((track) => track.stop());\n },\n });\n\n setTimeout(() => {\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n }\n }, 100);\n } catch (error) {\n console.error(\"Error accessing camera:\", error);\n errorNotification({\n title: \"Error al acceder a la cámara\",\n message: \"No se pudo acceder a la cámara del dispositivo\",\n icon: imageFormIcons.errorIcon,\n });\n }\n };\n\n return (\n <>\n <Text my={10} fw={500} size=\"lg\">\n {label} {required ? <span style={{ color: \"red\" }}> *</span> : \"\"}\n </Text>\n <Dropzone\n onDrop={(files) => {\n field.onChange(multiple ? files : files[0] || null);\n }}\n multiple={multiple}\n onReject={(files) => {\n const errorMessages = files.map((file) => {\n if (file.errors[0]?.code === \"file-too-large\") {\n return maxSizeMessage;\n }\n if (file.errors[0]?.code === \"too-many-files\") {\n return maxFilesMessage;\n }\n return `Error con el archivo ${file.file.name}`;\n });\n\n modals.open({\n title: \"Error al subir archivos\",\n children: (\n <Box>\n <Text size=\"xl\">Error al subir archivos</Text>\n <Text size=\"sm\" c=\"dimmed\">\n {errorMessages.map((message, i) => (\n <Box key={i}>{message}</Box>\n ))}\n </Text>\n </Box>\n ),\n });\n }}\n maxSize={maxSize}\n accept={IMAGE_MIME_TYPE}\n >\n <Group\n justify=\"center\"\n gap=\"xl\"\n mih={220}\n style={{ pointerEvents: \"none\" }}\n >\n <Dropzone.Accept>\n {imageFormIcons.acceptIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-blue-6)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.acceptIcon}\n </Box>\n ) : null}\n </Dropzone.Accept>\n <Dropzone.Reject>\n {imageFormIcons.rejectIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-red-6)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.rejectIcon}\n </Box>\n ) : null}\n </Dropzone.Reject>\n <Dropzone.Idle>\n {imageFormIcons.idleIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-dimmed)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.idleIcon}\n </Box>\n ) : null}\n </Dropzone.Idle>\n\n <Box>\n <Text size=\"xl\" inline>\n Arrastra imágenes aquí o haz clic para seleccionar archivos\n </Text>\n <Text size=\"sm\" c=\"dimmed\" inline mt={7}>\n {maxFiles\n ? `Adjunta tantos archivos como desees, cada archivo no debe exceder los ${maxSize / 1024 ** 2}mb`\n : `Adjunta una imagen, el archivo no debe exceder los ${maxSize / 1024 ** 2}mb`}\n </Text>\n </Box>\n </Group>\n </Dropzone>\n\n {error ? (\n <Text size=\"sm\" c=\"red\">\n {error}\n </Text>\n ) : null}\n\n {enableCamera && (\n <Group justify=\"center\" my=\"md\">\n <Button\n fullWidth\n leftSection={imageFormIcons.cameraIcon}\n variant=\"filled\"\n onClick={handleCameraAccess}\n >\n <Text>Tomar foto</Text>\n </Button>\n <Text size=\"sm\" c=\"dimmed\">\n {enableCamera ? \"Toma una foto con la cámara del dispositivo\" : \"\"}\n </Text>\n </Group>\n )}\n\n {defaultImages.length > 0 && (\n <ScrollArea h={150} type=\"always\">\n <Group my={10}>\n {defaultImages.map((image) => (\n <Box key={image.productImageID} pos=\"relative\">\n <Image\n src={\n image.imageUrl.includes(\"uploads\")\n ? `http://localhost:4000/${image.imageUrl}`\n : image.imageUrl\n }\n w={100}\n h={100}\n />\n <ActionIcon\n onClick={() => {\n deleteImage({ imageId: image.productImageID });\n }}\n radius=\"xl\"\n color=\"red\"\n variant=\"filled\"\n size=\"xs\"\n style={{ position: \"absolute\", top: 5, right: 5 }}\n >\n {imageFormIcons.errorIcon}\n </ActionIcon>\n </Box>\n ))}\n </Group>\n </ScrollArea>\n )}\n\n {(Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : []\n ).length > 0 && (\n <ScrollArea h={150} type=\"always\">\n <Group my={10}>\n {(Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : []\n ).map((file, index) => (\n <Box key={index} pos=\"relative\">\n <Image\n src={\n file instanceof File\n ? URL.createObjectURL(file)\n : (file as TblProductsImage).imageUrl?.includes(\"uploads\")\n ? `http://localhost:4000/${(file as TblProductsImage).imageUrl}`\n : (file as TblProductsImage).imageUrl\n }\n w={100}\n h={100}\n />\n <ActionIcon\n radius=\"xl\"\n color=\"red\"\n variant=\"filled\"\n size=\"xs\"\n style={{ position: \"absolute\", top: 5, right: 5 }}\n onClick={() => {\n const list: ImageType[] = Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : [];\n const newImages = list.filter((_, i) => i !== index);\n field.onChange(\n multiple\n ? (newImages as (File | TblProductsImage)[])\n : (newImages[0] ?? null),\n );\n }}\n >\n {imageFormIcons.errorIcon}\n </ActionIcon>\n </Box>\n ))}\n </Group>\n </ScrollArea>\n )}\n </>\n );\n};\n","import { FieldTypes, type IField } from \"../../interfaces/form.interface\";\nimport type {\n ReactFormExtendedApi,\n FormValidateOrFn,\n FormAsyncValidateOrFn,\n} from \"@tanstack/react-form\";\n\nimport {\n TextInput,\n PasswordInput,\n NumberInput,\n Select,\n MultiSelect,\n Switch,\n TagsInput,\n} from \"@mantine/core\";\nimport { DatePickerInput } from \"@mantine/dates\";\nimport { ImageForm } from \"./ImageForm\";\n\nexport type FormValues = Record<string, unknown>;\n\ntype MaybeValidator = FormValidateOrFn<FormValues> | undefined;\ntype MaybeAsyncValidator = FormAsyncValidateOrFn<FormValues> | undefined;\n\nexport type FormInstance = ReactFormExtendedApi<\n FormValues,\n MaybeValidator, // TOnMount\n MaybeValidator, // TOnChange\n MaybeAsyncValidator, // TOnChangeAsync\n MaybeValidator, // TOnBlur\n MaybeAsyncValidator, // TOnBlurAsync\n MaybeValidator, // TOnSubmit\n MaybeAsyncValidator, // TOnSubmitAsync\n MaybeValidator, // TOnDynamic\n MaybeAsyncValidator, // TOnDynamicAsync\n MaybeAsyncValidator, // TOnServer\n unknown // TSubmitMeta\n>;\n\nexport const fieldGenerator = ({\n field,\n form,\n}: {\n field: IField;\n form: FormInstance;\n}): React.ReactNode => {\n switch (field.type) {\n case FieldTypes.TEXT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TextInput\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n f.handleChange(e.target.value);\n field.onChange?.(e.target.value);\n }}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.EMAIL:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TextInput\n type=\"email\"\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n f.handleChange(e.target.value)\n }\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.PASSWORD:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <PasswordInput\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e) => f.handleChange(e.target.value)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.NUMBER:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <NumberInput\n hideControls={field.hideControls}\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n min={field.min}\n max={field.max}\n step={field.step}\n allowNegative={field.allowNegative}\n allowDecimal={field.allowDecimal}\n decimalScale={field.decimalScale}\n fixedDecimalScale={field.fixedDecimalScale}\n decimalSeparator={field.decimalSeparator}\n prefix={field.preffix}\n suffix={field.suffix}\n value={(f.state.value as number) ?? \"\"}\n onChange={(val) => {\n const nextValue =\n typeof val === \"number\"\n ? val\n : val === \"\"\n ? undefined\n : Number(val);\n f.handleChange(nextValue);\n }}\n onBlur={f.handleBlur}\n placeholder={field.placeholder}\n />\n )}\n />\n );\n case FieldTypes.SELECT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <Select\n label={field.label}\n placeholder={field.placeholder}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n data={field.options}\n searchable={field.searchable}\n nothingFoundMessage={field.nothingFoundMessage}\n limit={field.limit}\n withCheckIcon={field.withCheckIcon}\n checkIconPosition={field.checkIconPosition}\n clearable={field.clearable}\n onChange={(value) => {\n f.handleChange(value ?? \"\");\n if (value && field.onChange) field.onChange(value);\n }}\n value={(f.state.value as string) ?? null}\n />\n )}\n />\n );\n case FieldTypes.MULTISELECT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <MultiSelect\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n withCheckIcon={field.withCheckIcon}\n checkIconPosition={field.checkIconPosition}\n clearable={field.clearable}\n searchable={field.searchable}\n nothingFoundMessage={field.nothingFoundMessage}\n data={field.options}\n value={(f.state.value as string[]) ?? []}\n onChange={(vals) => f.handleChange(vals)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.DATE:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <DatePickerInput\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as Date | null) ?? null}\n onChange={(date) => f.handleChange(date ?? null)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.SWITCH:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <Switch\n my={5}\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n checked={Boolean(f.state.value)}\n onChange={(e) => f.handleChange(e.currentTarget.checked)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.FILE:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <ImageForm\n label={field.label || \"\"}\n required={field.required}\n field={{\n value: f.state.value as File | File[] | null | undefined,\n onChange: f.handleChange,\n onBlur: f.handleBlur,\n }}\n multiple={field.multiple}\n maxSize={field.maxSize}\n maxFiles={field.maxFiles}\n maxSizeMessage={field.maxSizeMessage}\n maxFilesMessage={field.maxFilesMessage}\n defaultImages={field.defaultImages}\n error={f.state.meta.errors?.join(\", \")}\n />\n )}\n />\n );\n case FieldTypes.TAG:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TagsInput\n label={field.label}\n placeholder={field.placeholder}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n data={field.options}\n value={(f.state.value as string[]) ?? []}\n onChange={(vals) => f.handleChange(vals)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.HIDDEN:\n return <form.Field name={field.name} children={() => null} />;\n default:\n return null;\n }\n};\n","import { Button } from \"@mantine/core\";\nimport type { IButton } from \"../../interfaces/form.interface\";\n\nexport const buttonGenerator = (\n button: IButton,\n loading: boolean,\n): React.ReactNode => {\n switch (button.type) {\n case \"submit\":\n return (\n <Button\n loading={button.loading || loading}\n key={button.label}\n color={button.color || \"green\"}\n type={button.type}\n variant={button.variant || \"filled\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n case \"button\":\n if (button.hidden) return <></>;\n return (\n <Button\n onClick={button.onClick}\n color={button.color || \"gray\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n case \"reset\":\n return (\n <Button\n color={button.color || \"red\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n default:\n return (\n <Button\n color={button.color || \"gray\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n }\n};\n","import * as z from 'zod';\n\nimport { type IField, FieldTypes } from \"../../interfaces/form.interface\";\n\nconst generateFieldSchema = (field: IField): z.ZodType => {\n if (field.required) {\n switch (field.type) {\n case FieldTypes.TEXT:\n return z\n .string()\n .min(1, field.requiredMessage ?? 'Este campo es requerido');\n case FieldTypes.SELECT:\n return z\n .string()\n .min(1, field.requiredMessage ?? 'Este campo es requerido');\n case FieldTypes.MULTISELECT:\n return z\n .array(z.string())\n .min(\n 1,\n field.requiredMessage ??\n 'Debe seleccionar al menos una opción'\n );\n case FieldTypes.EMAIL:\n return z\n .string()\n .email(\n field.requiredMessage ?? 'Correo electrónico inválido'\n );\n case FieldTypes.SWITCH:\n return z.boolean().optional();\n case FieldTypes.DATE:\n return z.date().refine((date) => date != null, {\n message: field.requiredMessage ?? 'La fecha es requerida',\n });\n case FieldTypes.NUMBER:\n return field.required\n ? z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(\n field.min ?? -Infinity,\n field.requiredMessage ?? 'Este campo es requerido'\n )\n : z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(field.min ?? -Infinity);\n case FieldTypes.FILE:\n return field.multiple\n ? z\n .array(z.instanceof(File))\n .min(\n 1,\n field.requiredMessage ??\n 'Se requiere al menos un archivo'\n )\n : z.instanceof(File);\n case FieldTypes.TAG:\n return z.array(z.string()).optional();\n default:\n return z.string().optional();\n }\n }\n switch (field.type) {\n case FieldTypes.TEXT:\n return z.string().optional();\n case FieldTypes.SELECT:\n return z.string().optional();\n case FieldTypes.MULTISELECT:\n return z.array(z.string()).optional();\n case FieldTypes.EMAIL:\n return z\n .string()\n .email('Correo electrónico inválido')\n .optional();\n case FieldTypes.SWITCH:\n return z.boolean().optional();\n case FieldTypes.DATE:\n return z\n .date()\n .refine((date) => date != null, {\n message: 'La fecha es requerida',\n })\n .optional();\n case FieldTypes.NUMBER:\n return field.required\n ? z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(\n field.min ?? -Infinity,\n field.requiredMessage ?? 'Este campo es requerido'\n )\n : z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(field.min ?? -Infinity)\n .optional();\n case FieldTypes.FILE:\n return field.multiple\n ? z.array(z.instanceof(File)).optional().default([])\n : z.instanceof(File).optional().nullable();\n case FieldTypes.TAG:\n return z.array(z.string()).optional();\n default:\n return z.string().optional();\n }\n};\n\nexport const generateFormSchema = (\n fields: IField[]\n): z.ZodObject<z.ZodRawShape> => {\n return z.object({\n ...fields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: generateFieldSchema(field),\n };\n }, {}),\n });\n};\n","import { useForm } from \"@tanstack/react-form\";\nimport { isAxiosError } from \"axios\";\nimport {\n Box,\n Flex,\n LoadingOverlay,\n Stepper,\n Button,\n Group,\n} from \"@mantine/core\";\nimport {\n type IField,\n FieldTypes,\n type IButton,\n} from \"../../interfaces/form.interface\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fieldGenerator, type FormInstance } from \"./FieldGenerator\";\nexport type { FormInstance };\nimport { buttonGenerator } from \"./ButtonGenerator\";\nimport { generateFormSchema } from \"./schemaGenerator\";\nimport {\n errorNotification,\n successNotification,\n} from \"../../utils/notifications\";\ninterface FormGeneratorProps<TData, TVariables> {\n fields: IField[];\n buttons: IButton[];\n loading: boolean;\n name: string;\n mutation: UseMutationResult<TData, unknown, TVariables, unknown>;\n buildVariables?: (values: Record<string, unknown> | FormData) => TVariables;\n hasFiles?: boolean;\n typeOfForm?: \"create\" | \"edit\";\n navigateAway?: boolean;\n setData?: (data: TData) => void;\n onSuccess?: (data: TData) => void;\n wrapJsonByName?: boolean; // Si no hay files y no hay buildVariables, envolver como { [name]: values }\n onFormRef?: (form: FormInstance) => void;\n}\n\nexport const FormGenerator = <TData, TVariables = unknown>({\n fields,\n buttons,\n name,\n loading,\n mutation,\n buildVariables,\n hasFiles = false,\n typeOfForm,\n navigateAway: _navigateAway = true,\n setData,\n onSuccess,\n wrapJsonByName = true,\n onFormRef,\n}: FormGeneratorProps<TData, TVariables>): React.ReactNode => {\n // const navigate = useNavigate();\n\n const formSchema = generateFormSchema(fields);\n\n // Multi-step support via `page` field prop\n const maxPage = useMemo(() => {\n const max = fields.reduce((acc, f) => Math.max(acc, f.page ?? 1), 1);\n return max < 1 ? 1 : max;\n }, [fields]);\n const hasMultipleSteps = maxPage > 1;\n const [currentStep, setCurrentStep] = useState(1);\n\n const getDefaultValueByType = (\n type: FieldTypes,\n ): string | number | boolean | null | [] => {\n switch (type) {\n case FieldTypes.NUMBER:\n return null;\n case FieldTypes.SWITCH:\n return false;\n case FieldTypes.MULTISELECT:\n return [];\n case FieldTypes.FILE:\n return [];\n default:\n return \"\";\n }\n };\n\n const { mutate, isPending } = mutation;\n\n const form = useForm({\n defaultValues: fields.reduce(\n (acc, field) => {\n return {\n ...acc,\n [field.name]: field.defaultValue ?? getDefaultValueByType(field.type),\n } as Record<string, unknown>;\n },\n {} as Record<string, unknown>,\n ),\n onSubmit: async ({ value }) => {\n // Validación con Zod antes de enviar\n const validationResult = formSchema.safeParse(value);\n if (!validationResult.success) {\n errorNotification({\n title: \"Error de validación\",\n message: \"Por favor verifica los datos ingresados\",\n });\n return;\n }\n\n const hasFileField = fields.some((f) => f.type === FieldTypes.FILE);\n const shouldUseFormData = hasFiles || hasFileField;\n\n if (shouldUseFormData) {\n const formData = new FormData();\n\n Object.entries(validationResult.data).forEach(([key, rawVal]) => {\n const fieldDef = fields.find((f) => f.name === key);\n const val = rawVal as unknown;\n\n if (fieldDef?.type === FieldTypes.FILE && val) {\n if (Array.isArray(val)) {\n (val as unknown[]).forEach((item) => {\n if (item instanceof File) formData.append(key, item);\n });\n } else if (val instanceof File) {\n formData.append(key, val);\n }\n return;\n }\n\n if (Array.isArray(val)) {\n const items = val as unknown[];\n const hasFile = items.some((item) => item instanceof File);\n if (hasFile) {\n items.forEach((item) => {\n if (item instanceof File) formData.append(key, item);\n });\n } else {\n // For TAG fields, send as comma-separated string\n if (fieldDef?.type === FieldTypes.TAG) {\n formData.append(key, items.join(\",\"));\n } else {\n // For other arrays, send as JSON string\n formData.append(key, JSON.stringify(items));\n }\n }\n return;\n }\n\n if (val instanceof Date) {\n formData.append(key, val.toISOString());\n return;\n }\n\n if (val != null && typeof val === \"object\") {\n formData.append(key, JSON.stringify(val));\n return;\n }\n\n formData.append(key, val != null ? String(val) : \"\");\n });\n\n const variables = buildVariables\n ? (buildVariables(formData) as TVariables)\n : (formData as unknown as TVariables);\n\n mutate(variables, {\n onSuccess: (data) => {\n successNotification({\n title: `${typeOfForm === \"create\" ? \"Creado\" : \"Editado\"} exitosamente`,\n message: `${name} ha sido ${typeOfForm === \"create\" ? \"creado\" : \"editado\"} exitosamente, serás redirigido a la lista de ${name}`,\n });\n setData && setData(data as TData);\n onSuccess && onSuccess(data as TData);\n },\n onError: (error: unknown) => {\n const message = isAxiosError(error)\n ? error.response?.data?.message\n : undefined;\n errorNotification({\n title: `Error al ${typeOfForm === \"create\" ? \"crear\" : \"editar\"} el ${name}`,\n message:\n message ?? \"Ha ocurrido un error al crear o editar el registro\",\n });\n },\n });\n } else {\n const raw = validationResult.data as Record<string, unknown>;\n const variables = buildVariables\n ? (buildVariables(raw) as TVariables)\n : ((wrapJsonByName ? { [name]: raw } : raw) as unknown as TVariables);\n\n mutate(variables, {\n onSuccess: (data) => {\n successNotification({\n title: `${typeOfForm === \"create\" ? \"Creado\" : \"Editado\"} exitosamente`,\n message: `${name} ha sido ${typeOfForm === \"create\" ? \"creado\" : \"editado\"} exitosamente, serás redirigido a la lista de ${name}`,\n });\n setData && setData(data as TData);\n onSuccess && onSuccess(data as TData);\n },\n onError: (error: unknown) => {\n const message = isAxiosError(error)\n ? error.response?.data?.message\n : undefined;\n errorNotification({\n title: `Error al ${typeOfForm === \"create\" ? \"crear\" : \"editar\"} el ${name}`,\n message:\n message ?? \"Ha ocurrido un error al crear o editar el registro\",\n });\n },\n });\n }\n },\n });\n\n const visibleFields = useMemo(\n () =>\n hasMultipleSteps\n ? fields.filter((f) => (f.page ?? 1) === currentStep)\n : fields,\n [fields, hasMultipleSteps, currentStep],\n );\n\n const handleNext = async (): Promise<void> => {\n // Validate only current step fields\n const stepFields = fields.filter((f) => (f.page ?? 1) === currentStep);\n if (stepFields.length > 0) {\n const stepSchema = generateFormSchema(stepFields);\n const currentValues = form.state.values as Record<string, unknown>;\n const stepValues = stepFields.reduce<Record<string, unknown>>(\n (acc, f) => {\n acc[f.name] = currentValues[f.name];\n return acc;\n },\n {},\n );\n const res = stepSchema.safeParse(stepValues);\n if (!res.success) {\n errorNotification({\n title: \"Datos incompletos\",\n message: \"Por favor completa los campos requeridos de este paso\",\n });\n return;\n }\n }\n setCurrentStep((s) => Math.min(s + 1, maxPage));\n };\n\n const handleBack = (): void => {\n setCurrentStep((s) => Math.max(1, s - 1));\n };\n\n useEffect(() => {\n fields.forEach((field) => {\n const currentValue = (form.state.values as Record<string, unknown>)[\n field.name\n ];\n const defaultValue =\n field.defaultValue ?? getDefaultValueByType(field.type);\n\n // Verifica si el campo es de tipo TAG y si el valor actual es un array vacío\n if (\n field.type === FieldTypes.TAG &&\n Array.isArray(currentValue) &&\n currentValue.length === 0\n ) {\n form.setFieldValue(field.name as string, defaultValue as unknown);\n } else if (currentValue === \"\" || currentValue === defaultValue) {\n form.setFieldValue(field.name as string, defaultValue as unknown);\n }\n });\n }, [fields]);\n\n useEffect(() => {\n if (onFormRef) {\n onFormRef(form);\n }\n }, [form, onFormRef]);\n\n return (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (hasMultipleSteps && currentStep < maxPage) {\n await handleNext();\n } else {\n form.handleSubmit();\n }\n }}\n encType=\"multipart/form-data\"\n >\n <LoadingOverlay visible={loading!} />\n {hasMultipleSteps && (\n <Box mb={16}>\n <Stepper active={currentStep - 1} allowNextStepsSelect={false}>\n {Array.from({ length: maxPage }).map((_, idx) => (\n <Stepper.Step key={idx} label={`Paso ${idx + 1}`} />\n ))}\n </Stepper>\n </Box>\n )}\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: fields.some((field) => field.section === 2)\n ? \"repeat(2, 1fr)\"\n : \"1fr\",\n gap: \"20px\",\n alignItems: \"start\",\n }}\n >\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(12, 1fr)\",\n gap: \"10px\",\n height: \"fit-content\",\n }}\n >\n {visibleFields\n .filter(\n (field) => field.section === undefined || field.section === 1,\n )\n .map((field) => (\n <Box\n key={field.name}\n style={{\n gridColumn: `span ${field.columnWidth || 12}`,\n }}\n >\n {fieldGenerator({ field, form })}\n </Box>\n ))}\n </Box>\n {visibleFields.some((field) => field.section === 2) && (\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(12, 1fr)\",\n gap: \"10px\",\n height: \"fit-content\",\n }}\n >\n {visibleFields\n .filter((field) => field.section === 2)\n .map((field) => (\n <Box\n key={field.name}\n style={{\n gridColumn: `span ${field.columnWidth || 12}`,\n }}\n >\n {fieldGenerator({ field, form })}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n <Group justify=\"space-between\" mt={20}>\n {hasMultipleSteps && (\n <Group>\n <Button\n type=\"button\"\n variant=\"default\"\n onClick={handleBack}\n disabled={currentStep === 1}\n >\n Atrás\n </Button>\n {currentStep < maxPage && (\n <Button type=\"button\" onClick={handleNext}>\n Siguiente\n </Button>\n )}\n </Group>\n )}\n <Flex justify=\"flex-end\" style={{ flex: 1 }}>\n {buttons.map((button) =>\n hasMultipleSteps &&\n currentStep < maxPage &&\n button.type === \"submit\"\n ? buttonGenerator({ ...button, disabled: true }, isPending)\n : buttonGenerator(button, isPending),\n )}\n </Flex>\n </Group>\n </form>\n );\n};\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { Button, Card, Container, Flex, Title } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport type { IField, IButton } from \"../../interfaces/form.interface\";\nimport { FormGenerator } from \"./FormGenerator\";\n\ninterface CreateEditFormProps<T> {\n fields: IField[];\n buttons: IButton[];\n mutationKey: string[];\n mutationFn: (data: T | FormData) => Promise<T>;\n typeOfForm: \"create\" | \"edit\";\n dataKey: string;\n loading: boolean;\n cardWidth?: number;\n hasFiles?: boolean;\n onSuccess?: () => void;\n setData?: (data: T) => void;\n navigateAway?: boolean;\n showBackButton?: boolean;\n /**\n * Callback when the user clicks \"Regresar\". Provide your router's go-back logic here.\n * @example React Router: () => navigate(-1)\n * @example TanStack Router: () => router.history.back()\n * @example TanStack Start: () => navigate({ to: '..' })\n */\n onGoBack?: () => void;\n /**\n * Optional icon for the back button. Pass your own icon component so the lib stays router/UI-agnostic.\n * @example <ArrowLeft /> from lucide-react\n */\n backButtonIcon?: ReactNode;\n}\n\nexport const CreateEditForm = <T,>({\n fields,\n buttons,\n mutationKey,\n mutationFn,\n typeOfForm,\n dataKey,\n loading,\n cardWidth,\n hasFiles,\n onSuccess,\n setData,\n navigateAway = true,\n showBackButton = true,\n onGoBack,\n backButtonIcon,\n}: CreateEditFormProps<T>): React.ReactNode => {\n const showBack = showBackButton && onGoBack != null;\n\n const mutation = useMutation({\n mutationKey,\n mutationFn: mutationFn as (data: T | FormData) => Promise<T>,\n });\n\n return (\n <>\n {showBack && (\n <Flex justify={\"start\"}>\n <Button\n leftSection={backButtonIcon}\n variant=\"transparent\"\n mx={20}\n mt={10}\n onClick={onGoBack}\n >\n Regresar a {dataKey}\n </Button>\n </Flex>\n )}\n <Container w={cardWidth ?? 500} my={-10}>\n <Flex direction={\"column\"}>\n <Title order={1} my={10}>\n {typeOfForm === \"create\" ? \"Crear\" : \"Editar\"} {dataKey}\n </Title>\n <Card withBorder>\n <FormGenerator<T>\n typeOfForm={typeOfForm}\n name={dataKey}\n loading={loading}\n fields={fields}\n buttons={buttons}\n mutation={mutation as UseMutationResult<T, unknown, unknown, unknown>}\n hasFiles={hasFiles}\n onSuccess={onSuccess}\n setData={setData}\n navigateAway={navigateAway}\n />\n </Card>\n </Flex>\n </Container>\n </>\n );\n};\n","\texport const barBorder =\n\t\t\"light-dark(#e5e5e5, var(--mantine-color-dark-4))\";\n\texport const barSurface =\n\t\t\"light-dark(var(--mantine-color-white), var(--mantine-color-dark-6))\";\n\texport const barTextActive =\n\t\t\"light-dark(#111827, var(--mantine-color-dark-0))\";\n\texport const barTextInactive =\n\t\t\"light-dark(#6b7280, var(--mantine-color-dark-2))\";\nexport const defaultHeaderBgColor =\n \"light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6))\";\n export const paginationBorder =\n\t\t\"light-dark(#e5e5e5, var(--mantine-color-dark-4))\";\n\texport const paginationSurface =\n\t\t\"light-dark(var(--mantine-color-white), var(--mantine-color-dark-6))\";\n","import { useMediaQuery as useMantineMediaQuery } from \"@mantine/hooks\";\n\nexport const useMediaQuery = () => {\n const isMobile = useMantineMediaQuery(\"(max-width: 767px)\");\n const isDesktop = useMantineMediaQuery(\"(min-width: 992px)\");\n const isTablet = useMantineMediaQuery(\"(min-width: 768px) and (max-width: 991px)\");\n return { isMobile, isDesktop, isTablet };\n};","import { Flex, Text, Select, Pagination, Group } from \"@mantine/core\";\nimport { paginationBorder, paginationSurface } from \"../../theme/constants\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\n\n\ninterface BottomPaginationProps {\n total: number;\n pageSize: number;\n pageIndex: number;\n onPageSizeChange: (value: number) => void;\n onPageIndexChange: (value: number) => void;\n}\n\nexport const BottomPagination = ({\n total,\n pageSize,\n pageIndex,\n onPageSizeChange,\n onPageIndexChange,\n}: BottomPaginationProps) => {\n\n const { isMobile, isDesktop } = useMediaQuery();\n \n const totalPages = Math.ceil(total / pageSize);\n const currentPage = pageIndex + 1; // pageIndex is 0-based, display is 1-based\n\n const handlePageChange = (page: number) => {\n onPageIndexChange(page - 1); // Convert back to 0-based\n };\n\n const pageSizeOptions = [\n { value: \"5\", label: \"5\" },\n { value: \"10\", label: \"10\" },\n { value: \"15\", label: \"15\" },\n { value: \"20\", label: \"20\" },\n { value: \"50\", label: \"50\" },\n ];\n\n // Don't render pagination if there's no data\n if (total === 0) {\n return null;\n }\n\n return (\n <Flex\n align=\"center\"\n py=\"sm\"\n px=\"lg\"\n style={{\n position: \"relative\",\n borderTop:\n \"1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4))\",\n backgroundColor:\n \"light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6))\",\n }}\n >\n <Pagination\n radius=\"md\"\n withEdges={isDesktop}\n total={totalPages}\n value={currentPage}\n onChange={handlePageChange}\n size=\"sm\"\n siblings={ !isMobile ? 1 : 0 }\n boundaries={ !isMobile ? 1 : 0 }\n style={\n isDesktop\n ? {\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }\n : undefined\n }\n />\n\n <Group style={{ marginLeft: \"auto\", alignItems: \"center\" }}>\n <Text size=\"xs\" c=\"dimmed\">\n Mostrar\n </Text>\n <Select\n value={pageSize.toString()}\n onChange={(value) => value && onPageSizeChange(parseInt(value, 10))}\n data={pageSizeOptions}\n size=\"xs\"\n w={65}\n styles={{\n input: {\n border: `1px solid ${paginationBorder}`,\n backgroundColor: paginationSurface,\n fontSize: \"0.75rem\",\n },\n }}\n comboboxProps={{ withinPortal: false }}\n />\n <Text size=\"xs\" c=\"dimmed\" visibleFrom=\"sm\">\n registros\n </Text>\n {total !== undefined && !isMobile && (\n <Text size=\"xs\" c=\"dimmed\" ml=\"xs\">\n ({total} en total)\n </Text>\n )}\n </Group>\n </Flex>\n );\n};\n","import type { ColumnFiltersState } from '@tanstack/react-table'\n\n/**\n * State passed to onStateChange on every table interaction.\n * Use these values to build your API request.\n */\nexport interface ServerTableState {\n pageIndex: number\n pageSize: number\n globalFilter: string\n columnFilters: ColumnFiltersState\n sorting: { id: string; desc: boolean }[]\n}\n\n/**\n * Style options for the table header row.\n * Pass as the headerStyle (or legacy headerBgColor) prop to customize appearance.\n */\nexport interface TableHeaderStyle {\n /** Header background color. Use light-dark(light, dark) for theme-aware colors */\n bgColor?: string;\n /** Header text (and icon) color */\n textColor?: string;\n /** Header background color on hover (if not set, a default is used) */\n hoverBgColor?: string;\n /** Header text color on hover (if not set, same as textColor) */\n hoverTextColor?: string;\n /** Header font weight (e.g. 600, 700, \"bold\") */\n fontWeight?: number | string;\n /** Header font size in px */\n fontSize?: number | string;\n /** Horizontal padding for header cells (e.g. \"4px 10px\") */\n padding?: string;\n}\n\n/**\n * Configuration for the DataTable UI.\n * Pass partial overrides via the `config` prop to customize defaults.\n */\nexport interface DataTableConfig {\n /** Page size options for the pagination selector */\n pageSizeOptions: number[];\n /** Default page size when the table first loads */\n defaultPageSize: number;\n /** Placeholder for the search input */\n searchPlaceholder: string;\n /** Whether to show the search input */\n enableGlobalFilter: boolean;\n}\n\nexport const defaultDataTableConfig: DataTableConfig = {\n pageSizeOptions: [5, 10, 15, 20, 50],\n defaultPageSize: 10,\n searchPlaceholder: 'Buscar...',\n enableGlobalFilter: true,\n}\n","import {\n type ColumnFiltersState,\n type ColumnDef,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n defaultDataTableConfig,\n type DataTableConfig,\n type ServerTableState,\n} from '../interfaces/datatable.interface'\n\nexport interface UseDataTableOptions<TData> {\n data: TData[]\n columns: ColumnDef<TData, unknown>[]\n /** Override default config (look, labels, page sizes, etc.) */\n config?: Partial<DataTableConfig>\n /** Enable row selection (checkboxes). When true, selectedRows is returned */\n enableRowSelection?: boolean\n /** Total row count from server. Used to compute pageCount. */\n totalRowCount?: number\n /** Called when table state changes (filters, pagination, search, sort). Use for API calls. */\n onStateChange?: (state: ServerTableState) => void\n}\n\nexport interface UseDataTableReturn<TData> {\n /** TanStack Table instance: use for headers, rows, getRowModel(), etc. */\n table: ReturnType<typeof useReactTable<TData>>\n /** Current global search value (for SearchInput) */\n globalFilter: string\n /** Set global search (for SearchInput onChange) */\n setGlobalFilter: (value: string) => void\n /** Column filters state (for FilterSelect, FilterDate, etc.) */\n columnFilters: ColumnFiltersState\n /** Set column filter value for a specific column */\n setColumnFilter: (columnId: string, value: unknown) => void\n /** Current server table state (pageIndex, pageSize, filters, etc.) */\n serverState: ServerTableState\n /** Merged config (defaults + your overrides) */\n config: DataTableConfig\n /** Selected row data (only when enableRowSelection is true) */\n selectedRows: TData[]\n}\n\nexport function useDataTable<TData>({\n data,\n columns,\n config: configOverride,\n enableRowSelection = false,\n totalRowCount,\n onStateChange,\n}: UseDataTableOptions<TData>): UseDataTableReturn<TData> {\n const mergedConfig = useMemo<DataTableConfig>(\n () => ({ ...defaultDataTableConfig, ...configOverride }),\n [configOverride],\n )\n\n const [pagination, setPagination] = useState({\n pageIndex: 0,\n pageSize: mergedConfig.defaultPageSize,\n })\n const [sorting, setSorting] = useState<{ id: string; desc: boolean }[]>([])\n const [rowSelection, setRowSelection] = useState<Record<string, boolean>>({})\n const [globalFilter, setGlobalFilter] = useState('')\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n\n const setColumnFilter = useMemo(\n () => (columnId: string, value: unknown) => {\n setColumnFilters((prev) => {\n const rest = prev.filter((f) => f.id !== columnId)\n if (value === undefined || value === null || value === '') return rest\n return [...rest, { id: columnId, value }]\n })\n },\n [],\n )\n\n // Reset to page 0 when search or column filters change\n useEffect(() => {\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [globalFilter, columnFilters])\n\n const serverState: ServerTableState = useMemo(\n () => ({\n pageIndex: pagination.pageIndex,\n pageSize: pagination.pageSize,\n globalFilter,\n columnFilters,\n sorting,\n }),\n [pagination.pageIndex, pagination.pageSize, globalFilter, columnFilters, sorting],\n )\n\n useEffect(() => {\n onStateChange?.(serverState)\n }, [onStateChange, serverState])\n\n const table = useReactTable<TData>({\n data,\n columns,\n state: {\n pagination,\n sorting,\n rowSelection: enableRowSelection ? rowSelection : undefined,\n globalFilter,\n columnFilters,\n },\n onPaginationChange: setPagination,\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onGlobalFilterChange: setGlobalFilter,\n onColumnFiltersChange: setColumnFilters,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n enableRowSelection,\n manualPagination: true,\n manualFiltering: true,\n /** Sort is applied client-side to the current page only (no server refetch) */\n manualSorting: false,\n pageCount:\n totalRowCount != null\n ? Math.max(1, Math.ceil(totalRowCount / pagination.pageSize))\n : undefined,\n })\n\n const selectedRows = useMemo<TData[]>(\n () =>\n enableRowSelection\n ? table.getSelectedRowModel().rows.map((row) => row.original)\n : [],\n [enableRowSelection, rowSelection],\n )\n\n return {\n table,\n globalFilter,\n setGlobalFilter,\n columnFilters,\n setColumnFilter,\n serverState,\n config: mergedConfig,\n selectedRows,\n }\n}\n","import { useState } from \"react\";\nimport { Checkbox, Table, UnstyledButton } from \"@mantine/core\";\nimport { flexRender, type useReactTable } from \"@tanstack/react-table\";\nimport { defaultHeaderBgColor } from \"../../theme/constants\";\nimport type { TableHeaderStyle as TableHeaderStyleType } from \"../../interfaces/datatable.interface\";\n\nconst defaultHeaderTextColor =\n \"light-dark(var(--mantine-color-dimmed), var(--mantine-color-gray-4))\";\nconst defaultHeaderHoverBg =\n \"light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-2))\";\n\n/** Normalize legacy string (bg only) to TableHeaderStyle object */\nfunction normalizeHeaderStyle(\n value: string | TableHeaderStyleType | undefined,\n): TableHeaderStyleType {\n if (value == null) {\n return {\n bgColor: defaultHeaderBgColor,\n textColor: defaultHeaderTextColor,\n hoverBgColor: defaultHeaderHoverBg,\n };\n }\n if (typeof value === \"string\") {\n return {\n bgColor: value,\n textColor: defaultHeaderTextColor,\n hoverBgColor: defaultHeaderHoverBg,\n };\n }\n return {\n bgColor: value.bgColor ?? defaultHeaderBgColor,\n textColor: value.textColor ?? defaultHeaderTextColor,\n hoverBgColor: value.hoverBgColor ?? defaultHeaderHoverBg,\n hoverTextColor: value.hoverTextColor ?? value.textColor ?? defaultHeaderTextColor,\n fontWeight: value.fontWeight,\n fontSize: value.fontSize,\n padding: value.padding,\n };\n}\n\ninterface TableHeaderProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n /** Icon when column is unsorted */\n SortIcon?: React.ElementType;\n /** Icon when column is sorted ascending */\n SortIconAsc?: React.ElementType;\n /** Icon when column is sorted descending */\n SortIconDesc?: React.ElementType;\n canCheck?: boolean;\n /** Whether the table has an actions column (no header label, needs background) */\n hasActionsColumn?: boolean;\n /** Header style: color string (legacy, used as bg) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyleType;\n}\n\nexport const TableHeader = <TData,>({\n table,\n SortIcon,\n SortIconAsc,\n SortIconDesc,\n canCheck = false,\n hasActionsColumn = false,\n headerBgColor,\n}: TableHeaderProps<TData>) => {\n const [hoveredHeaderId, setHoveredHeaderId] = useState<string | null>(null);\n const style = normalizeHeaderStyle(headerBgColor);\n const bgColor = style.bgColor ?? defaultHeaderBgColor;\n const hoverBg = style.hoverBgColor ?? defaultHeaderHoverBg;\n const hoverText = style.hoverTextColor ?? style.textColor ?? defaultHeaderTextColor;\n\n const getSortIcon = (sortState: false | \"asc\" | \"desc\") => {\n if (sortState === \"asc\") return SortIconAsc;\n if (sortState === \"desc\") return SortIconDesc;\n return SortIcon;\n };\n\n const baseButtonStyle: React.CSSProperties = {\n padding: style.padding ?? \"4px 10px\",\n fontSize: style.fontSize ?? 14,\n fontWeight: style.fontWeight ?? 700,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n transition: \"background-color 0.1s ease, color 0.1s ease\",\n borderRadius: \"var(--mantine-radius-lg)\",\n };\n\n return (\n <Table.Thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Tr key={headerGroup.id}>\n {canCheck && (\n <Table.Th\n bg={bgColor}\n w={10}\n styles={{\n th: {\n padding: \"0 0 0 6px\",\n },\n }}\n >\n <Checkbox\n size=\"xs\"\n style={{\n padding: 0,\n }}\n checked={table.getIsAllRowsSelected()}\n indeterminate={\n table.getIsSomeRowsSelected() && !table.getIsAllRowsSelected()\n }\n onChange={table.getToggleAllRowsSelectedHandler()}\n aria-label=\"Toggle all rows selected\"\n />\n </Table.Th>\n )}\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sortState = header.column.getIsSorted();\n const Icon = canSort ? getSortIcon(sortState) : null;\n const isHovered = hoveredHeaderId === header.id;\n\n return (\n <Table.Th key={header.id} bg={bgColor} style={header.column.columnDef.size ? { width: header.column.columnDef.size, minWidth: header.column.columnDef.size } : undefined}>\n <UnstyledButton\n style={{\n ...baseButtonStyle,\n color: isHovered ? hoverText : (style.textColor ?? defaultHeaderTextColor),\n backgroundColor: isHovered ? hoverBg : undefined,\n }}\n onClick={header.column.getToggleSortingHandler()}\n onMouseEnter={() => setHoveredHeaderId(header.id)}\n onMouseLeave={() => setHoveredHeaderId(null)}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {Icon && <Icon size={16} />}\n </UnstyledButton>\n </Table.Th>\n );\n })}\n {hasActionsColumn && <Table.Th bg={bgColor} />}\n </Table.Tr>\n ))}\n </Table.Thead>\n );\n};\n","import { useState } from \"react\";\nimport { ActionIcon, Checkbox, Flex, Menu, Table, Text } from \"@mantine/core\";\nimport { MoreVertical } from \"lucide-react\";\nimport { flexRender, type useReactTable } from \"@tanstack/react-table\";\n\ninterface TableBodyProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n canCheck?: boolean;\n columnActions?: (row: TData) => React.ReactNode;\n MenuIcon?: React.ElementType;\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n onRowClick?: (row: TData) => void;\n onRowHover?: (row: TData) => void;\n}\n\nexport const TableBody = <TData,>({\n table,\n canCheck = false,\n columnActions,\n MenuIcon = MoreVertical,\n listMenuActions,\n onRowClick,\n onRowHover,\n}: TableBodyProps<TData>) => {\n const [hoveredRowId, setHoveredRowId] = useState<string | null>(null);\n\n return (\n <Table.Tbody>\n {table.getRowModel().rows.map((row) => (\n <Table.Tr\n key={row.id}\n style={{\n ...(onRowClick ? { cursor: \"pointer\" } : {}),\n ...(hoveredRowId === row.id\n ? {\n backgroundColor:\n \"light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5))\",\n }\n : {}),\n }}\n onMouseEnter={() => {\n setHoveredRowId(row.id);\n onRowHover?.(row.original);\n }}\n onMouseLeave={() => setHoveredRowId(null)}\n >\n {canCheck && (\n <Table.Td\n styles={{\n td: {\n padding: \"0 0 0 6px\",\n },\n }}\n >\n <Checkbox\n size=\"xs\"\n styles={{\n root: {\n width: 5,\n },\n }}\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n disabled={!row.getCanSelect()}\n aria-label=\"Select row\"\n />\n </Table.Td>\n )}\n {row.getVisibleCells().map((cell) => (\n <Table.Td\n key={cell.id}\n style={cell.column.columnDef.size ? { width: cell.column.columnDef.size, minWidth: cell.column.columnDef.size } : undefined}\n onClick={() => onRowClick?.(row.original)}\n >\n <Text\n size=\"sm\"\n style={{\n color:\n \"light-dark(var(--mantine-color-dark-7), var(--mantine-color-gray-1))\",\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Text>\n </Table.Td>\n ))}\n {(columnActions || listMenuActions) && (\n <Table.Td>\n <Flex justify=\"flex-end\" align=\"center\" gap=\"sm\">\n {columnActions?.(row.original)}\n {listMenuActions && (\n <Menu variant=\"subtle\">\n <Menu.Target>\n <ActionIcon variant=\"subtle\" color=\"gray\" size=\"sm\">\n <MenuIcon size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n {listMenuActions(row.original).map((action) => (\n <Menu.Item\n key={action.label}\n onClick={action.onClick}\n leftSection={action.Icon && <action.Icon />}\n >\n {action.label}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n )}\n </Flex>\n </Table.Td>\n )}\n </Table.Tr>\n ))}\n </Table.Tbody>\n );\n};\n","import { Skeleton, Table } from \"@mantine/core\";\n\ninterface TableSkeletonProps {\n /** Number of skeleton rows to show */\n rowCount: number;\n /** Number of data columns (excluding checkbox and actions) */\n columnCount: number;\n /** Whether to show the checkbox column */\n canCheck?: boolean;\n /** Whether to show the actions column */\n hasActionsColumn?: boolean;\n}\n\nconst cellStyle = { minHeight: 40, verticalAlign: \"middle\" as const };\n\nexport const TableSkeleton = ({\n rowCount,\n columnCount,\n canCheck = false,\n hasActionsColumn = false,\n}: TableSkeletonProps) => {\n return (\n <Table.Tbody>\n {Array.from({ length: rowCount }).map((_, rowIdx) => (\n <Table.Tr key={rowIdx}>\n {canCheck && (\n <Table.Td style={cellStyle}>\n <Skeleton height={16} width={18} radius=\"sm\" />\n </Table.Td>\n )}\n {Array.from({ length: columnCount }).map((_, colIdx) => (\n <Table.Td key={colIdx} style={cellStyle}>\n <Skeleton\n height={16}\n width={\n colIdx === columnCount - 1\n ? 40\n : `${60 + (colIdx % 2) * 15}%`\n }\n radius=\"sm\"\n />\n </Table.Td>\n ))}\n {hasActionsColumn && (\n <Table.Td style={cellStyle}>\n <Skeleton height={16} width={32} radius=\"sm\" />\n </Table.Td>\n )}\n </Table.Tr>\n ))}\n </Table.Tbody>\n );\n};\n","import React from \"react\";\nimport { Stack, Text, Title, Button, Box } from \"@mantine/core\";\n\ninterface EmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n actionButton?: {\n label: string;\n onClick: () => void;\n variant?: \"filled\" | \"light\" | \"outline\";\n color?: string;\n };\n IconPlus?: React.ElementType;\n IconFileX?: React.ElementType;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n title = \"No hay datos disponibles\",\n description = \"No se encontraron elementos para mostrar. Intenta ajustar los filtros o agrega nuevos elementos.\",\n icon,\n actionButton,\n IconPlus,\n IconFileX,\n}) => {\n const defaultIcon = (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 64,\n height: 64,\n borderRadius: \"50%\",\n backgroundColor: \"var(--mantine-color-gray-1)\",\n margin: \"0 auto\",\n }}\n >\n {IconFileX ? (\n <IconFileX size={32} color=\"var(--mantine-color-gray-6)\" />\n ) : null}\n </Box>\n );\n\n return (\n <Stack\n align=\"center\"\n justify=\"center\"\n gap=\"md\"\n py=\"xl\"\n px=\"md\"\n style={{\n textAlign: \"center\",\n minHeight: 300,\n }}\n >\n {icon || defaultIcon}\n\n <Stack gap=\"xs\" align=\"center\">\n <Title\n order={3}\n size=\"h4\"\n fw={600}\n style={{\n color: \"var(--mantine-color-gray-9)\",\n fontSize: \"18px\",\n }}\n >\n {title}\n </Title>\n\n <Text\n size=\"sm\"\n c=\"dimmed\"\n style={{\n maxWidth: 400,\n lineHeight: 1.5,\n }}\n >\n {description}\n </Text>\n </Stack>\n\n {actionButton && (\n <Button\n variant={actionButton.variant || \"light\"}\n color={actionButton.color || \"blue\"}\n leftSection={IconPlus ? <IconPlus size={16} /> : null}\n onClick={actionButton.onClick}\n mt=\"xs\"\n >\n {actionButton.label}\n </Button>\n )}\n </Stack>\n );\n};\n","import {\n flexRender,\n useReactTable,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { Flex, Paper, ScrollArea, Table } from \"@mantine/core\";\nimport { ArrowUpDown, ArrowDown, ArrowUp, FileX } from \"lucide-react\";\nimport type React from \"react\";\nimport type { TableHeaderStyle } from \"../../interfaces/datatable.interface\";\nimport { defaultHeaderBgColor } from \"../../theme/constants\";\nimport { TableHeader } from \"./TableHeader\";\nimport { TableBody } from \"./TableBody\";\nimport { TableSkeleton } from \"./TableSkeleton\";\nimport { EmptyState } from \"./EmptyState\";\n\ninterface DataTableProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n /** Whether to show the border */\n withBorder?: boolean;\n /** Border radius */\n borderRadius?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n /** Icon when column is unsorted */\n SortIcon?: React.ElementType;\n /** Icon when column is sorted ascending */\n SortIconAsc?: React.ElementType;\n /** Icon when column is sorted descending */\n SortIconDesc?: React.ElementType;\n /** Icon when empty state */\n EmptyStateIcon?: React.ElementType;\n /** Title when empty state */\n EmptyStateTitle?: string;\n /** Description when empty state */\n EmptyStateDescription?: string;\n /** Whether to show the checkboxes */\n canCheck?: boolean;\n /** Column actions */\n columnActions?: (row: TData) => React.ReactNode;\n /** List menu actions */\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /** Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyle;\n /** Whether the table is loading (shows skeleton rows instead of data) */\n loading?: boolean;\n /** Number of skeleton rows to show when loading */\n skeletonRowCount?: number;\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void;\n /** Called when a row is hovered */\n onRowHover?: (row: TData) => void;\n /** Empty state to display when no data is available */\n emptyState?: React.ReactNode;\n /** Height of the table */\n tableHeight?: number;\n}\n\nexport const SimpleDataTable = <TData,>({\n tableHeight = 600,\n table,\n withBorder,\n borderRadius = \"md\",\n SortIcon = ArrowUpDown,\n SortIconAsc = ArrowUp,\n SortIconDesc = ArrowDown,\n canCheck = false,\n columnActions,\n listMenuActions,\n headerBgColor,\n loading = false,\n skeletonRowCount = 10,\n onRowClick,\n onRowHover,\n emptyState = (\n <EmptyState\n title=\"No data found\"\n description=\"No data found\"\n icon={<FileX size={32} color=\"var(--mantine-color-gray-6)\" />}\n />\n ),\n}: DataTableProps<TData>) => {\n const dataColumnsCount = table.getAllLeafColumns().length;\n const hasActionsColumn = !!(columnActions || listMenuActions);\n const headerBg =\n typeof headerBgColor === \"string\"\n ? headerBgColor\n : headerBgColor?.bgColor ?? defaultHeaderBgColor;\n\n return (\n <Paper withBorder={withBorder} radius={borderRadius}>\n <ScrollArea h={tableHeight} type=\"scroll\" scrollbarSize={8}>\n <Table\n style={{ width: \"100%\", tableLayout: \"fixed\" }}\n styles={{\n thead: {\n position: \"sticky\",\n top: 0,\n zIndex: 1,\n background: headerBg,\n boxShadow: \"0 1px 0 0 light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4))\",\n },\n }}\n >\n <TableHeader\n canCheck={canCheck}\n table={table}\n SortIcon={SortIcon}\n SortIconAsc={SortIconAsc}\n SortIconDesc={SortIconDesc}\n hasActionsColumn={hasActionsColumn}\n headerBgColor={headerBgColor}\n />\n {loading ? (\n <TableSkeleton\n rowCount={skeletonRowCount}\n columnCount={dataColumnsCount}\n canCheck={canCheck}\n hasActionsColumn={hasActionsColumn}\n />\n ) : table.getRowCount() > 0 ? (\n <TableBody\n onRowClick={onRowClick}\n onRowHover={onRowHover}\n table={table}\n canCheck={canCheck}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n />\n ) : (\n <Table.Tbody>\n <Table.Tr>\n <Table.Td\n colSpan={\n (table.getHeaderGroups()[0]?.headers.length ?? 1) +\n (canCheck ? 1 : 0)\n }\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n style={{ minHeight: 200 }}\n >\n {emptyState}\n </Flex>\n </Table.Td>\n </Table.Tr>\n </Table.Tbody>\n )}\n </Table>\n </ScrollArea>\n </Paper>\n );\n};\n","import { ActionIcon, TextInput } from \"@mantine/core\";\nimport { Search, X } from \"lucide-react\";\nimport { barBorder, barTextActive, barSurface } from \"../../theme/constants\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n onClear?: () => void;\n IconSearch?: React.ElementType;\n IconX?: React.ElementType;\n}\n\nexport const SearchInput = ({\n value,\n onChange,\n placeholder = \"Buscar...\",\n onClear,\n IconSearch = Search,\n IconX = X,\n}: SearchInputProps) => {\n return (\n <TextInput\n w={200}\n size=\"sm\"\n radius=\"lg\"\n value={value}\n onChange={(event) => onChange(event.currentTarget.value)}\n placeholder={placeholder}\n leftSection={\n IconSearch ? (\n <IconSearch\n size={16}\n style={{\n color: \"var(--mantine-color-gray-6)\",\n strokeWidth: 2,\n }}\n />\n ) : undefined\n }\n rightSection={\n value && IconX ? (\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n radius=\"lg\"\n onClick={() => {\n onChange(\"\");\n onClear?.();\n }}\n style={{\n transition: \"all 0.2s ease\",\n }}\n >\n <IconX size={16} />\n </ActionIcon>\n ) : undefined\n }\n styles={{\n input: {\n border: `1px solid ${barBorder}`,\n color: barTextActive,\n backgroundColor: barSurface,\n fontSize: \"14px\",\n fontWeight: 500,\n transition: \"all 0.2s ease\",\n \"&:focus\": {\n borderColor: \"var(--mantine-color-blue-5)\",\n backgroundColor: \"var(--mantine-color-default)\",\n boxShadow: \"0 0 0 3px var(--mantine-color-blue-1)\",\n },\n \"&::placeholder\": {\n color: \"var(--mantine-color-gray-5)\",\n fontWeight: 400,\n },\n },\n }}\n />\n );\n};\n","import { ActionIcon, Button, Menu, ScrollArea, TextInput } from \"@mantine/core\";\nimport type { IFilterSelectOption } from \"../../interfaces/filters.interface\";\nimport { barBorder, barSurface, barTextActive } from \"../../theme/constants\";\nimport {\n Check,\n ChevronDown,\n ChevronUp,\n ListFilter,\n Search,\n X,\n} from \"lucide-react\";\nimport { useRef, useMemo, useState } from \"react\";\n\nexport interface FilterSelectProps {\n /** Column id to filter */\n columnId: string;\n /** Select options (value, label pairs). Import FilterSelectOption from interfaces/filters */\n options: IFilterSelectOption[];\n /** Current filter value */\n onChange: (columnId: string, value: string | null) => void;\n /** Placeholder when no selection */\n placeholder?: string;\n /** Icon to show in the button */\n Icon?: React.ElementType;\n /** Enable search input inside dropdown */\n searchable?: boolean;\n}\n\nexport const FilterSelect = ({\n columnId,\n options,\n onChange,\n placeholder = \"Todos\",\n Icon = ListFilter,\n searchable = false,\n}: FilterSelectProps) => {\n const [open, setOpen] = useState<boolean>(false);\n const [selectedOption, setSelectedOption] =\n useState<IFilterSelectOption | null>(null);\n const [search, setSearch] = useState(\"\");\n const searchRef = useRef<HTMLInputElement>(null);\n\n const filteredOptions = useMemo(\n () =>\n searchable && search\n ? options.filter((o) =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n )\n : options,\n [options, search, searchable],\n );\n\n const handleClear = () => {\n setSelectedOption(null);\n onChange(columnId, null);\n };\n\n const handleSelect = (option: IFilterSelectOption) => {\n if (selectedOption?.value === option.value) {\n setSelectedOption(null);\n onChange(columnId, null);\n } else {\n setSelectedOption(option);\n onChange(columnId, option.value);\n }\n };\n\n return (\n <Menu\n opened={open}\n onChange={(opened) => {\n setOpen(opened);\n if (!opened) {\n setSearch(\"\");\n }\n }}\n onOpen={() => {\n setTimeout(() => searchRef.current?.focus(), 50);\n }}\n styles={{\n dropdown: {\n minWidth: 180,\n },\n }}\n >\n <Menu.Target>\n <Button\n radius=\"md\"\n variant=\"filled\"\n leftSection={Icon ? <Icon size={15} /> : null}\n rightSection={\n selectedOption ? (\n <ActionIcon\n component=\"div\"\n variant=\"subtle\"\n radius=\"md\"\n onClick={(event) => {\n event.stopPropagation();\n handleClear();\n }}\n >\n <X size={12} />\n </ActionIcon>\n ) : open ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )\n }\n size=\"sm\"\n styles={{\n root: {\n border: `1px solid ${barBorder}`,\n backgroundColor: barSurface,\n color: barTextActive,\n fontWeight: 400,\n fontSize: \"0.8125rem\",\n },\n }}\n >\n {selectedOption ? selectedOption.label : placeholder}\n </Button>\n </Menu.Target>\n <Menu.Dropdown style={{ boxShadow: \"0 0 10px 0 rgba(0, 0, 0, 0.1)\", borderRadius: \"8px\" }}>\n {searchable && (\n <TextInput\n ref={searchRef}\n variant=\"unstyled\"\n placeholder=\"Buscar...\"\n leftSection={<Search size={14} />}\n value={search}\n onChange={(e) => setSearch(e.currentTarget.value)}\n />\n )}\n <ScrollArea mah={240} scrollbars=\"y\" type=\"always\">\n {filteredOptions.map((option) => (\n <Menu.Item\n leftSection={\n selectedOption?.value === option.value ? (\n <Check size={12} />\n ) : null\n }\n key={option.value}\n onClick={() => {\n handleSelect(option);\n }}\n >\n {option.label}\n </Menu.Item>\n ))}\n </ScrollArea>\n {searchable && filteredOptions.length === 0 && (\n <Menu.Item disabled>Sin resultados</Menu.Item>\n )}\n </Menu.Dropdown>\n </Menu>\n );\n};\n","import { useState } from \"react\";\nimport type { Row } from \"@tanstack/react-table\";\n\n/**\n * TanStack Table filterFn for date columns.\n * Keeps rows where the cell value (YYYY-MM-DD) is >= the selected date.\n * Usage: add `filterFn: dateGteFilterFn` to the column definition.\n */\nexport const dateGteFilterFn = <TData,>(\n row: Row<TData>,\n columnId: string,\n filterValue: string,\n): boolean => {\n const cellValue = row.getValue<string>(columnId);\n if (!filterValue || !cellValue) return true;\n return cellValue >= filterValue;\n};\nimport { ActionIcon, Button, Popover } from \"@mantine/core\";\nimport { DatePicker } from \"@mantine/dates\";\nimport type { DateValue } from \"@mantine/dates\";\nimport { CalendarDays, ChevronDown, ChevronUp, X } from \"lucide-react\";\nimport { barBorder, barSurface, barTextActive } from \"../../theme/constants\";\n\nexport interface FilterDateProps {\n /** Column id to filter */\n columnId: string;\n /** Current filter value (ISO date string or null) */\n value: string | null;\n /** Called when filter changes */\n onChange: (columnId: string, value: string | null) => void;\n /** Placeholder when no date selected */\n placeholder?: string;\n}\n\nconst toLocalIso = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst fromIso = (iso: string): Date => {\n const parts = iso.split(\"-\").map(Number);\n return new Date(parts[0]!, parts[1]! - 1, parts[2]!);\n};\n\nconst formatDisplay = (iso: string): string => {\n const d = fromIso(iso);\n return d.toLocaleDateString(\"es-MX\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n};\n\nexport const FilterDate = ({\n columnId,\n value,\n onChange,\n placeholder = \"Seleccionar fecha\",\n}: FilterDateProps) => {\n const [open, setOpen] = useState(false);\n\n const dateValue = value ? fromIso(value) : null;\n\n const handleChange = (date: DateValue) => {\n if (!date) {\n onChange(columnId, null);\n return;\n }\n const d = date instanceof Date ? date : new Date(date);\n onChange(columnId, toLocalIso(d));\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(columnId, null);\n };\n\n const buttonLabel = value ? formatDisplay(value) : placeholder;\n\n return (\n <Popover\n opened={open}\n onChange={setOpen}\n position=\"bottom-start\"\n withinPortal={false}\n >\n <Popover.Target>\n <Button\n radius=\"md\"\n variant=\"filled\"\n leftSection={<CalendarDays size={14} />}\n rightSection={\n value ? (\n <ActionIcon\n component=\"div\"\n radius=\"md\"\n variant=\"subtle\"\n onClick={(event) => handleClear(event)}\n >\n <X size={12} />\n </ActionIcon>\n ) : open ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )\n }\n size=\"sm\"\n onClick={() => setOpen((o) => !o)}\n styles={{\n root: {\n border: `1px solid ${barBorder}`,\n backgroundColor: barSurface,\n color: barTextActive,\n fontWeight: 400,\n fontSize: \"0.8125rem\",\n },\n }}\n >\n {buttonLabel}\n </Button>\n </Popover.Target>\n\n <Popover.Dropdown p=\"xs\">\n <DatePicker value={dateValue} onChange={handleChange} size=\"sm\" />\n </Popover.Dropdown>\n </Popover>\n );\n};\n","import { useEffect } from \"react\";\nimport type { ColumnDef, useReactTable } from \"@tanstack/react-table\";\nimport { useDataTable } from \"../../hooks/useDataTable\";\nimport { SimpleDataTable } from \"./SimpleDataTable\";\nimport { Flex, Group, Paper } from \"@mantine/core\";\nimport { SearchInput } from \"./SearchInput\";\nimport { FilterSelect } from \"./FilterSelect\";\nimport { FilterDate } from \"./FilterDate\";\nimport { BottomPagination } from \"./BottomPagination\";\nimport type {\n DataTableConfig,\n ITableFilterConfig,\n ServerTableState,\n TableHeaderStyle,\n} from \"../../interfaces\";\n\ninterface DataTableProps<TData> {\n /** Data to display in the table (current page, already paginated by server) */\n data: TData[];\n /** Columns to display in the table */\n columns: ColumnDef<TData>[];\n /** Configuration for the table */\n config?: Partial<DataTableConfig>;\n /** Dynamic filters (selects, dates, etc.) */\n filters?: ITableFilterConfig[];\n /** Total row count from server (used for pagination) */\n totalRowCount?: number;\n /** Called when table state changes (page, search, filters, sort). Use to call your API. */\n onStateChange?: (state: ServerTableState) => void;\n /** Whether the table is loading (shows skeleton) */\n loading?: boolean;\n /** Whether to enable row selection */\n enableRowCheck?: boolean;\n /** Called when row selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyle;\n /** Column actions to display per row */\n columnActions?: (row: TData) => React.ReactNode;\n /** List menu actions to display per row */\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void;\n /** Called when a row is hovered */\n onRowHover?: (row: TData) => void;\n /** Empty state to display when no data is available */\n emptyState?: React.ReactNode;\n /** Table instance */\n table?: ReturnType<typeof useReactTable<TData>>;\n /** Custom Header component */\n CustomHeader?: React.ReactNode;\n /** Whether to show the search input */\n showSearchInput?: boolean;\n /** Whether to show the bottom pagination */\n showBottomPagination?: boolean;\n /** Height of the table */\n tableHeight?: number;\n}\n\nexport const DataTable = <TData,>({\n showSearchInput = true,\n showBottomPagination = true,\n data,\n columns,\n config,\n filters,\n totalRowCount,\n onStateChange,\n loading = false,\n enableRowCheck: canCheck = false,\n onSelectionChange,\n headerBgColor,\n columnActions,\n listMenuActions,\n onRowClick,\n onRowHover,\n emptyState,\n table: ExternalTable,\n CustomHeader,\n tableHeight = 600,\n}: DataTableProps<TData>) => {\n const {\n table: internalTable,\n globalFilter,\n setGlobalFilter,\n columnFilters,\n setColumnFilter,\n config: mergedConfig,\n selectedRows,\n } = useDataTable({\n data,\n columns,\n config,\n enableRowSelection: canCheck,\n totalRowCount,\n onStateChange,\n });\n\n const table = ExternalTable ?? internalTable;\n\n useEffect(() => {\n if (canCheck && onSelectionChange) {\n onSelectionChange(selectedRows);\n }\n }, [canCheck, onSelectionChange, selectedRows]);\n\n const getFilterValue = (columnId: string) =>\n (columnFilters.find((f) => f.id === columnId)?.value as string | null) ??\n null;\n\n return (\n <Flex direction=\"column\" gap=\"md\">\n <Flex justify=\"space-between\" align=\"center\">\n <Group gap=\"md\" wrap=\"wrap\">\n {showSearchInput && mergedConfig.enableGlobalFilter && (\n <SearchInput\n value={globalFilter}\n onChange={setGlobalFilter}\n placeholder={mergedConfig.searchPlaceholder}\n />\n )}\n {filters?.map((f) =>\n f.type === \"date\" ? (\n <FilterDate\n key={f.columnId}\n columnId={f.columnId}\n value={getFilterValue(f.columnId)}\n onChange={setColumnFilter}\n placeholder={f.placeholder}\n />\n ) : (\n <FilterSelect\n key={f.columnId}\n columnId={f.columnId}\n options={f.options ?? []}\n onChange={setColumnFilter}\n placeholder={f.placeholder ?? \"Todos\"}\n searchable={f.searchable}\n />\n ),\n )}\n </Group>\n {CustomHeader}\n </Flex>\n <Paper withBorder radius=\"md\" style={{ overflow: \"hidden\" }}>\n <SimpleDataTable\n tableHeight={tableHeight}\n onRowClick={onRowClick}\n onRowHover={onRowHover}\n table={table}\n canCheck={canCheck}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n headerBgColor={headerBgColor}\n loading={loading}\n skeletonRowCount={mergedConfig.defaultPageSize}\n emptyState={emptyState}\n />\n {showBottomPagination && (\n <BottomPagination\n total={totalRowCount ?? 0}\n pageSize={table.getState().pagination.pageSize}\n pageIndex={table.getState().pagination.pageIndex}\n onPageSizeChange={(value) => table.setPageSize(value)}\n onPageIndexChange={(value) =>\n table.setPagination({\n pageIndex: value,\n pageSize: table.getState().pagination.pageSize,\n })\n }\n />\n )}\n </Paper>\n </Flex>\n );\n};\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { DataTable } from \"./table/DataTable\";\nimport type { ColumnDef, useReactTable } from \"@tanstack/react-table\";\nimport type { ITableFilterConfig } from \"../interfaces/filters.interface\";\nimport type {\n DataTableConfig,\n ServerTableState,\n TableHeaderStyle,\n} from \"../interfaces/datatable.interface\";\nimport type { TableQueryParams } from \"../queries/types\";\nimport { useState, useCallback } from \"react\";\nimport { Flex, Title } from \"@mantine/core\";\n\n/** Shape that the query must return for TablePage to work correctly. */\nexport interface PaginatedResponse<TRow> {\n data: TRow[];\n total: number;\n}\n\ninterface TablePageProps<TRow> {\n /**\n * Factory that receives the current pagination/filter params and returns\n * the query options. Called every time the table state changes.\n */\n getQueryOptions: (\n params: TableQueryParams,\n ) => UseQueryOptions<PaginatedResponse<TRow>>;\n /**\n * Title of the table\n */\n title?: string;\n\n /**\n * Columns of the table\n */\n columns: ColumnDef<TRow>[];\n /**\n * Filters of the table\n */\n filters?: ITableFilterConfig[];\n /**\n * Whether the table is loading externally\n */\n isLoadingExternal?: boolean;\n /**\n * Called when a row is clicked\n */\n onRowClick?: (row: TRow) => void;\n /**\n * Called when a row is hovered\n */\n onRowHover?: (row: TRow) => void;\n /**\n * Empty state of the table\n */\n emptyState?: React.ReactNode;\n /**\n * Table instance\n */\n table?: ReturnType<typeof useReactTable<TRow>>;\n /**\n * Whether to enable row selection\n */\n enableRowSelection?: boolean;\n /**\n * Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? }\n */\n headerBgColor?: TableHeaderStyle;\n /**\n * Column actions to display per row\n */\n columnActions?: (row: TRow) => React.ReactNode;\n /**\n * List menu actions to display per row\n */\n listMenuActions?: (\n row: TRow,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /**\n * Called when row selection changes\n */\n onSelectionChange?: (selectedRows: TRow[]) => void;\n /**\n * Configuration for the table\n */\n config?: Partial<DataTableConfig>;\n /**\n * Custom Header component\n */\n CustomHeader?: React.ReactNode;\n /**\n * Whether to show the search input\n */\n showSearchInput?: boolean;\n /**\n * Whether to show the bottom pagination\n */\n showBottomPagination?: boolean;\n /**\n * Height of the table\n */\n tableHeight?: number;\n}\n\nexport const TablePage = <TRow,>({\n getQueryOptions,\n title,\n columns,\n filters,\n isLoadingExternal,\n onRowClick,\n onRowHover,\n emptyState,\n table,\n enableRowSelection,\n headerBgColor,\n columnActions,\n listMenuActions,\n onSelectionChange,\n config,\n CustomHeader,\n showSearchInput = true,\n showBottomPagination = true,\n tableHeight = 600,\n}: TablePageProps<TRow>) => {\n const [tableParams, setTableParams] = useState<TableQueryParams>({\n skip: 0,\n limit: 10,\n query: undefined,\n });\n\n const handleStateChange = useCallback((state: ServerTableState) => {\n setTableParams({\n skip: state.pageIndex * state.pageSize,\n limit: state.pageSize,\n query: state.globalFilter || undefined,\n columnFilters:\n state.columnFilters.length > 0 ? state.columnFilters : undefined,\n });\n }, []);\n\n const { data, isLoading } = useQuery(getQueryOptions(tableParams));\n\n return (\n <Flex direction=\"column\" gap=\"sm\">\n {title && <Title order={1}>{title}</Title>}\n <DataTable<TRow>\n showBottomPagination={showBottomPagination}\n tableHeight={tableHeight}\n emptyState={emptyState}\n showSearchInput={showSearchInput}\n table={table}\n onRowClick={(row) => onRowClick?.(row)}\n onRowHover={(row) => onRowHover?.(row)}\n totalRowCount={data?.total}\n data={data?.data ?? []}\n loading={isLoading || isLoadingExternal}\n columns={columns}\n filters={filters}\n onStateChange={handleStateChange}\n enableRowCheck={enableRowSelection}\n headerBgColor={headerBgColor}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n onSelectionChange={onSelectionChange}\n config={config}\n CustomHeader={CustomHeader}\n />\n </Flex>\n );\n};\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { Button, Card, Container, Flex, Paper, Title } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport type { IField, IButton } from \"../interfaces/form.interface\";\nimport { FormGenerator, type FormInstance } from \"./form/FormGenerator\";\n\ninterface FormPagePropsBase<TData, TVariables = unknown> {\n fields: IField[];\n buttons: IButton[];\n mutationOptions: UseMutationOptions<TData, Error, TVariables>;\n typeOfForm: \"create\" | \"edit\";\n dataKey: string;\n loading: boolean;\n cardWidth?: number | string;\n onSuccess?: (data: TData) => void;\n setData?: (data: TData) => void;\n navigateAway?: boolean;\n showBackButton?: boolean;\n /**\n * Callback when the user clicks \"Regresar\". Provide your router's go-back logic here.\n * @example React Router: () => navigate(-1)\n * @example TanStack Router: () => router.history.back()\n * @example TanStack Start: () => navigate({ to: '..' })\n */\n onGoBack?: () => void;\n /**\n * Optional icon for the back button. Pass your own icon component so the lib stays router/UI-agnostic.\n * @example <ArrowLeft /> from lucide-react\n */\n backButtonIcon?: ReactNode;\n onFormRef?: (form: FormInstance) => void;\n}\n\ninterface FormPagePropsWithFiles<TData, TVariables = unknown>\n extends FormPagePropsBase<TData, TVariables> {\n hasFiles: true;\n buildVariables?: (values: FormData) => TVariables;\n}\n\ninterface FormPagePropsWithoutFiles<TData, TVariables = unknown>\n extends FormPagePropsBase<TData, TVariables> {\n hasFiles?: false;\n buildVariables?: (values: Record<string, unknown>) => TVariables;\n}\n\ntype FormPageProps<TData, TVariables = unknown> =\n | FormPagePropsWithFiles<TData, TVariables>\n | FormPagePropsWithoutFiles<TData, TVariables>;\n\nexport const FormPage = <TData, TVariables = unknown>({\n fields,\n buttons,\n mutationOptions,\n buildVariables,\n typeOfForm,\n dataKey,\n loading,\n cardWidth,\n hasFiles,\n onSuccess,\n setData,\n navigateAway = true,\n showBackButton = true,\n onGoBack,\n backButtonIcon,\n onFormRef,\n}: FormPageProps<TData, TVariables>): React.ReactNode => {\n const showBack = showBackButton && onGoBack != null;\n\n const mutation = useMutation(mutationOptions);\n\n return (\n <>\n {showBack && (\n <Flex justify={\"start\"}>\n <Button\n leftSection={backButtonIcon}\n variant=\"transparent\"\n mx={20}\n mt={10}\n onClick={onGoBack}\n >\n Regresar a {dataKey}\n </Button>\n </Flex>\n )}\n <Flex justify={\"center\"} align={\"center\"} w={\"100%\"}>\n <Paper w={cardWidth ?? 500} my={-10}>\n <Flex direction={\"column\"}>\n <Title order={1} my={10}>\n {typeOfForm === \"create\" ? \"Crear\" : \"Editar\"} {dataKey}\n </Title>\n <Card withBorder>\n <FormGenerator<TData, TVariables>\n typeOfForm={typeOfForm}\n name={dataKey}\n loading={loading}\n fields={fields}\n buttons={buttons}\n mutation={mutation}\n buildVariables={\n buildVariables as\n | ((\n values: Record<string, unknown> | FormData,\n ) => TVariables)\n | undefined\n }\n hasFiles={hasFiles}\n onSuccess={onSuccess}\n setData={setData}\n navigateAway={navigateAway}\n onFormRef={onFormRef}\n />\n </Card>\n </Flex>\n </Paper>\n </Flex>\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/interfaces/form.interface.ts","../src/services/config.ts","../src/services/product.service.ts","../src/utils/notifications.tsx","../src/components/form/ImageForm.tsx","../src/components/form/FieldGenerator.tsx","../src/components/form/ButtonGenerator.tsx","../src/components/form/schemaGenerator.ts","../src/components/form/FormGenerator.tsx","../src/components/form/CreateEditForm.tsx","../src/theme/constants.ts","../src/hooks/useMediaQuery.ts","../src/components/table/BottomPagination.tsx","../src/interfaces/datatable.interface.ts","../src/hooks/useDataTable.ts","../src/components/table/TableHeader.tsx","../src/components/table/TableBody.tsx","../src/components/table/TableSkeleton.tsx","../src/components/table/EmptyState.tsx","../src/components/table/SimpleDataTable.tsx","../src/components/table/SearchInput.tsx","../src/components/table/FilterSelect.tsx","../src/components/table/FilterDate.tsx","../src/components/table/DataTable.tsx","../src/components/TablePage.tsx","../src/components/FormPage.tsx"],"names":["error","jsx","Text","date","Button","Fragment","jsxs","Box","Group","useMutation","Flex","useMantineMediaQuery","Select","useMemo","useState","useEffect","Table","Checkbox","flexRender","ActionIcon","_","Title","ScrollArea","TextInput","useRef","Menu","X","Search","ChevronUp","ChevronDown","Paper","Card"],"mappings":"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","file":"components.js","sourcesContent":["import type { TblProductsImage } from './product.interface';\n\nexport type IField =\n | ITextField\n | IPasswordField\n | INumberField\n | ISelectField\n | IMultiSelectField\n | IDateField\n | IEmailField\n | IHiddenField\n | ISwitchField\n | IFileField\n | ITagField;\n\nexport interface IHiddenField extends IBaseField {\n type: typeof FieldTypes.HIDDEN;\n}\n\nexport interface ITextField extends IBaseField {\n type: typeof FieldTypes.TEXT;\n}\n\nexport interface IEmailField extends IBaseField {\n type: typeof FieldTypes.EMAIL;\n}\n\nexport interface IPasswordField extends IBaseField {\n type: typeof FieldTypes.PASSWORD;\n}\n\nexport interface ITagField\n extends IBaseField,\n Omit<ISelect, 'options'> {\n type: typeof FieldTypes.TAG;\n options: TagData[];\n}\n\nexport interface ISwitchField extends IBaseField {\n type: typeof FieldTypes.SWITCH;\n defaultChecked?: boolean;\n labelPosition?: 'left' | 'right';\n onLabel?: string;\n offLabel?: string;\n}\n\nexport type FileType =\n | 'image'\n | 'video'\n | 'audio'\n | 'pdf'\n | 'document';\n\nexport interface IFileField extends IBaseField {\n type: typeof FieldTypes.FILE;\n multiple?: boolean;\n accept?: string[] | readonly string[];\n maxSize?: number;\n maxFiles?: number;\n maxSizeMessage?: string;\n maxFilesMessage?: string;\n fileType: FileType;\n defaultImages?: TblProductsImage[];\n}\n\nexport interface INumberField extends IBaseField {\n type: typeof FieldTypes.NUMBER;\n min?: number;\n max?: number;\n preffix?: string;\n suffix?: string;\n allowNegative?: boolean;\n allowDecimal?: boolean;\n decimalScale?: number;\n fixedDecimalScale?: boolean;\n decimalSeparator?: string;\n hideControls?: boolean;\n step?: number;\n}\n\nexport interface ISelectField extends IBaseField, ISelect {\n type: typeof FieldTypes.SELECT;\n}\n\nexport interface IMultiSelectField extends IBaseField, ISelect {\n type: typeof FieldTypes.MULTISELECT;\n}\n\nexport interface IDateField extends IBaseField {\n type: typeof FieldTypes.DATE;\n}\n\nexport interface ISelect extends IBaseField {\n options: IOptions[];\n allowDeselect?: boolean;\n clearable?: boolean;\n searchable?: boolean;\n nothingFoundMessage?: string;\n checkIconPosition?: 'right' | 'left';\n withCheckIcon?: boolean;\n limit?: number;\n renderOption?: (option: IOptions) => React.ReactNode;\n}\n\ntype ColumnWidth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport interface IBaseField {\n name: string;\n label?: string;\n description?: string;\n placeholder?: string;\n required?: boolean;\n error?: string;\n disabled?: boolean;\n defaultValue?: string | number | boolean | string[] | Date;\n requiredMessage?: string;\n columnWidth?: ColumnWidth;\n onChange?: (value: string) => void;\n section?: number;\n page?: number;\n}\n\nexport interface IButton {\n hidden?: boolean;\n type: ButtonTypes;\n label: string;\n fullWidth?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n disabled?: boolean;\n loading?: boolean;\n Icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n color?: string;\n variant?: \"gradient\" | \"subtle\" | \"filled\" | \"light\" | \"outline\" | \"transparent\" | \"white\" | \"default\"\n}\n\nexport interface IOptions {\n value: string;\n label: string;\n}\n\nexport interface TagData {\n value: string;\n}\n\nexport const FieldTypes = {\n TEXT: 'text',\n EMAIL: 'email',\n NUMBER: 'number',\n PASSWORD: 'password',\n SELECT: 'select',\n MULTISELECT: 'multiselect',\n DATE: 'date',\n HIDDEN: 'hidden',\n SWITCH: 'switch',\n FILE: 'file',\n TAG: 'tag',\n} as const;\n\nexport type FieldTypes = (typeof FieldTypes)[keyof typeof FieldTypes];\nexport type ButtonTypes =\n (typeof ButtonTypes)[keyof typeof ButtonTypes];\n\nexport const ButtonTypes = {\n SUBMIT: 'submit',\n BUTTON: 'button',\n RESET: 'reset',\n} as const;\n","import axios, { type AxiosInstance } from 'axios'\n\n/**\n * Configuration for the shared API client.\n * Each consuming app must call configureApi() with its own baseURL and auth.\n */\nexport interface IApiConfig {\n /** Backend base URL (e.g. \"http://localhost:4000/\" or \"https://api.myapp.com/\") */\n baseURL: string\n /** Returns the current auth token for request headers */\n getToken: () => string | undefined\n /** Called when a new token is received after refresh (e.g. update your store) */\n onTokenRefresh?: (newToken: string) => void\n /** Called when refresh fails (e.g. clear session, redirect to login) */\n onUnauthorized?: () => void\n}\n\n// Default instance; replaced when configureApi() is called by the consuming app\nlet api: AxiosInstance = axios.create({\n baseURL: '',\n headers: { 'Content-Type': 'application/json' }\n})\n\n/**\n * Configure the shared API client. Must be called by the consuming app before using any service.\n * @example\n * // In your app (e.g. main.tsx or before first API call):\n * import { configureApi } from 'erp-pos-ecommerce-shared'\n * import { useAuthStore } from './store/authStore'\n *\n * configureApi({\n * baseURL: import.meta.env.VITE_API_URL ?? 'http://localhost:4000/',\n * getToken: () => useAuthStore.getState().token,\n * onTokenRefresh: (newToken) => useAuthStore.setState({ token: newToken }),\n * onUnauthorized: () => { useAuthStore.setState({ token: undefined }); redirectToLogin() }\n * })\n */\nexport function configureApi(config: IApiConfig): AxiosInstance {\n const { baseURL, getToken, onTokenRefresh, onUnauthorized } = config\n\n const newApi = axios.create({\n baseURL,\n headers: {\n 'Content-Type': 'application/json',\n ...(getToken() && { Authorization: `Bearer ${getToken()}` })\n }\n })\n\n newApi.interceptors.request.use((reqConfig) => {\n const token = getToken()\n if (token) {\n reqConfig.headers.Authorization = `Bearer ${token}`\n }\n return reqConfig\n })\n\n const refreshAxios = axios.create({ baseURL })\n\n newApi.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config\n\n if (error.response?.status === 401 && !originalRequest._retry && onTokenRefresh && onUnauthorized) {\n originalRequest._retry = true\n\n try {\n const response = await refreshAxios.get('/auth/refresh', {\n headers: getToken() ? { Authorization: `Bearer ${getToken()}` } : {}\n })\n const newToken = response.data?.token\n if (newToken) {\n onTokenRefresh(newToken)\n originalRequest.headers.Authorization = `Bearer ${newToken}`\n return newApi(originalRequest)\n }\n } catch {\n onUnauthorized()\n return Promise.reject(error)\n }\n }\n\n return Promise.reject(error)\n }\n )\n\n api = newApi\n return api\n}\n\n/**\n * Shared axios instance used by all services.\n * Valid only after the consuming app has called configureApi().\n */\nexport { api }\n","import type { IFilterType } from '../interfaces/filters.interface'\nimport type {\n IProductResponse,\n IProduct,\n IProductDetailsResponse,\n IProductDetails\n} from '../interfaces/product.interface'\nimport { api } from './config'\n\ninterface ProductQuery {\n skip?: number\n limit?: number\n filters?: IFilterType\n}\n\ninterface CategoryQuery {\n category: number\n skip?: number\n limit?: number\n filters?: IFilterType\n}\n\nexport const getProductsForSelect = async (): Promise<IProduct[]> => {\n const { data } = await api.get<IProduct[]>('/product/select')\n return data\n}\n\nexport const getProducts = async ({\n skip = 0,\n limit = 16,\n filters\n}: ProductQuery): Promise<IProductDetailsResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.categoryId && { categoryId: filters.categoryId.toString() }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductDetailsResponse>(`product?${queryParams}`)\n return data\n}\n\nexport const getProductsTable = async ({\n skip = 0,\n limit = 16,\n filters\n}: ProductQuery): Promise<IProductResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.categoryId && { categoryId: filters.categoryId.toString() }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductResponse>(`product/table?${queryParams}`)\n return data\n}\n\nexport const getProductById = async ({\n productId\n}: {\n productId: number\n}): Promise<IProduct> => {\n const { data } = await api.get(`product/${productId}`)\n return data.data\n}\n\nexport const getProductVariants = async ({\n productId,\n skip = 0,\n limit = 10,\n query = ''\n}: {\n productId: number\n skip?: number\n limit?: number\n query?: string\n}): Promise<IProductDetailsResponse> => {\n const { data } = await api.get<IProductDetailsResponse>(`/product/variants/${productId}`, {\n params: {\n skip: skip.toString(),\n limit: limit.toString(),\n ...(query && { query })\n }\n })\n return data\n}\n\nexport const getProductVariantsForSelect = async ({\n productId\n}: {\n productId: number\n}): Promise<IProductDetails[]> => {\n const { data } = await api.get<IProductDetails[]>(`/product/variants/select/${productId}`)\n return data\n}\n\nexport const getProductVariantById = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<IProductDetails> => {\n const { data } = await api.get<IProductDetails>(`/product/variants/variant/${productDetailId}`)\n return data\n}\n\nexport const createProductVariant = async (variant: FormData): Promise<IProductDetails> => {\n const { data } = await api.post<IProductDetails>('product/variants', variant, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const createProductVariants = async (formData: FormData): Promise<IProductDetails[]> => {\n const { data } = await api.post<IProductDetails[]>('product/variants', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const updateProductVariant = async (data: FormData): Promise<IProductDetails> => {\n const { data: response } = await api.put<IProductDetails>(\n `product/variants/update/${data.get('productDetailID')}`,\n data,\n {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n }\n )\n return response\n}\n\nexport const deleteProductVariant = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<void> => {\n await api.delete(`/product/variants/${productDetailId}`)\n}\n\nexport const restoreProductVariant = async ({\n productDetailId\n}: {\n productDetailId: number\n}): Promise<void> => {\n await api.patch(`/product/variants/${productDetailId}`)\n}\n\nexport const createProduct = async (product: FormData): Promise<IProduct> => {\n const { data } = await api.post<IProduct>('product/', product, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const updateProduct = async ({\n productId,\n product\n}: {\n productId: number\n product: FormData\n}): Promise<IProduct> => {\n const { data } = await api.put<IProduct>(`/product/${productId}`, product, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n })\n return data\n}\n\nexport const deleteImageFromProduct = async ({\n imageId\n}: {\n imageId: number\n}): Promise<void> => {\n await api.delete(`/product/images/${imageId}`)\n}\n\nexport const deleteProduct = async ({ productId }: { productId: number }): Promise<void> => {\n await api.delete(`/product/${productId}`)\n}\n\nexport const restoreProduct = async ({ productId }: { productId: number }): Promise<void> => {\n await api.patch(`/product/${productId}`)\n}\n\nexport const getProductsByCategory = async ({\n category,\n skip = 0,\n limit = 10,\n filters\n}: CategoryQuery): Promise<IProductResponse> => {\n const queryParams = new URLSearchParams({\n skip: skip.toString(),\n limit: limit.toString(),\n ...(filters?.query && { query: filters.query }),\n ...(filters?.batchId && { batchId: filters.batchId }),\n ...(filters?.supplierId && { supplierId: filters.supplierId.toString() }),\n ...(filters?.warehouseId && { warehouseId: filters.warehouseId.toString() }),\n ...(filters?.priceRangeMin && { minPrice: filters.priceRangeMin.toString() }),\n ...(filters?.priceRangeMax && { maxPrice: filters.priceRangeMax.toString() })\n })\n\n const { data } = await api.get<IProductResponse>(`product/category/${category}?${queryParams}`)\n return data\n}\n\nexport interface PrintProductTagResponse {\n message?: string\n [key: string]: unknown\n}\n\nexport const printProductTag = async ({\n stockId,\n productId,\n isSmall\n}: {\n stockId: number\n productId: number\n isSmall: boolean\n}): Promise<PrintProductTagResponse> => {\n const { data } = await api.post<PrintProductTagResponse>(`/product/printproducttag/`, {\n stockID: stockId,\n productID: productId,\n isSmall\n })\n return data\n}\n","import type { ReactNode } from 'react';\nimport { notifications } from '@mantine/notifications';\nimport { Text } from '@mantine/core';\n\n// Icons are provided by the consuming app so this library stays icon-agnostic\nlet defaultSuccessIcon: ReactNode = undefined;\nlet defaultErrorIcon: ReactNode = undefined;\n\n/**\n * Configure default icons for success and error notifications.\n * Call this once at app startup (e.g. in your root layout) with your preferred icon library.\n * @example\n * // With lucide-react\n * configureNotificationIcons({ successIcon: <Check />, errorIcon: <X /> });\n * // With react-icons\n * configureNotificationIcons({ successIcon: <FiCheck />, errorIcon: <FiX /> });\n */\nexport const configureNotificationIcons = (config: {\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n}): void => {\n if (config.successIcon !== undefined) defaultSuccessIcon = config.successIcon;\n if (config.errorIcon !== undefined) defaultErrorIcon = config.errorIcon;\n};\n\nexport const successNotification = ({\n title,\n message,\n icon,\n}: {\n title: string;\n message: string;\n /** Override the default success icon for this call (optional) */\n icon?: ReactNode;\n}): void => {\n notifications.show({\n title: <Text>{title}</Text>,\n message: message,\n color: 'teal',\n icon: icon ?? defaultSuccessIcon,\n });\n};\n\nexport const errorNotification = ({\n title,\n message,\n icon,\n}: {\n title: string;\n message: string;\n /** Override the default error icon for this call (optional) */\n icon?: ReactNode;\n}): void => {\n notifications.show({\n title: <Text>{title}</Text>,\n message: message,\n color: 'red',\n icon: icon ?? defaultErrorIcon,\n });\n};\n","import type { ReactNode } from \"react\";\nimport {\n ActionIcon,\n Box,\n Button,\n Group,\n Image,\n rem,\n ScrollArea,\n Text,\n} from \"@mantine/core\";\nimport { Dropzone, IMAGE_MIME_TYPE } from \"@mantine/dropzone\";\nimport { modals } from \"@mantine/modals\";\nimport type { TblProductsImage } from \"../../interfaces/product.interface\";\nimport { deleteImageFromProduct } from \"../../services/product.service\";\nimport { useMutation } from \"@tanstack/react-query\";\n// Eliminado react-hook-form. Definimos una interfaz genérica compatible con TanStack Form\ninterface GenericFieldController<TValue> {\n value: TValue;\n onChange: (value: TValue) => void;\n onBlur?: () => void;\n}\nimport { useRef } from \"react\";\nimport { getIsDevEnv } from \"../../config/env\";\nimport {\n errorNotification,\n successNotification,\n} from \"../../utils/notifications\";\n\n// Icons are provided by the consuming app so this library stays icon-agnostic\nlet imageFormIcons: {\n acceptIcon?: ReactNode;\n rejectIcon?: ReactNode;\n idleIcon?: ReactNode;\n cameraIcon?: ReactNode;\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n} = {};\n\n/**\n * Configure icons for ImageForm (dropzone, camera button, notifications, delete).\n * Call once at app startup with your preferred icon library.\n * @example\n * import { Camera, Check, Image, Upload, X } from \"lucide-react\";\n * configureImageFormIcons({\n * acceptIcon: <Upload />, rejectIcon: <X />, idleIcon: <Image />,\n * cameraIcon: <Camera />, successIcon: <Check />, errorIcon: <X />,\n * });\n */\nexport const configureImageFormIcons = (config: {\n acceptIcon?: ReactNode;\n rejectIcon?: ReactNode;\n idleIcon?: ReactNode;\n cameraIcon?: ReactNode;\n successIcon?: ReactNode;\n errorIcon?: ReactNode;\n}): void => {\n imageFormIcons = { ...imageFormIcons, ...config };\n};\n\n// Añadir tipo para manejar tanto File como TblProductsImage\ntype ImageType = File | TblProductsImage;\n\ninterface ImageFormProps {\n field: GenericFieldController<\n File | TblProductsImage | (File | TblProductsImage)[] | null | undefined\n >;\n label: string;\n required?: boolean;\n multiple?: boolean;\n maxSize?: number;\n maxFiles?: number;\n maxSizeMessage?: string;\n maxFilesMessage?: string;\n defaultImages?: TblProductsImage[];\n error?: string;\n enableCamera?: boolean;\n}\n\nexport const ImageForm = ({\n field,\n label,\n required = false,\n multiple = false,\n maxSize = 5 * 1024 ** 2,\n maxFiles = 5,\n maxSizeMessage = \"El tamaño máximo de cada imagen es de 5mb\",\n maxFilesMessage = \"No se pueden subir más de 5 imágenes\",\n defaultImages = [],\n error,\n enableCamera = true,\n}: ImageFormProps): React.ReactNode => {\n const { mutate: deleteImage } = useMutation({\n mutationKey: [\"product\"],\n mutationFn: deleteImageFromProduct,\n onSuccess: () => {\n successNotification({\n title: \"Imagen eliminada con éxito\",\n message: \"La imagen ha sido eliminada con éxito\",\n icon: imageFormIcons.successIcon,\n });\n },\n onError: (error) => {\n errorNotification({\n title: \"Error al eliminar la imagen\",\n message: getIsDevEnv()\n ? error.message\n : \"Ha ocurrido un error al eliminar la imagen\",\n icon: imageFormIcons.errorIcon,\n });\n },\n });\n\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const handleCameraAccess = async (): Promise<void> => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n },\n });\n\n modals.open({\n title: \"Tomar foto\",\n size: \"lg\",\n children: (\n <Box>\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n style={{\n width: \"100%\",\n maxHeight: \"400px\",\n transform: \"scaleX(-1)\",\n }}\n />\n <Group justify=\"center\" mt=\"md\">\n <Button\n leftSection={imageFormIcons.cameraIcon}\n onClick={() => {\n const video = videoRef.current;\n if (!video) return;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n ctx.save();\n ctx.scale(-1, 1);\n ctx.drawImage(\n video,\n -canvas.width,\n 0,\n canvas.width,\n canvas.height,\n );\n ctx.restore();\n }\n\n canvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], \"photo.jpg\", {\n type: \"image/jpeg\",\n });\n const existing: ImageType[] = Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? ([field.value as ImageType] as ImageType[])\n : [];\n const newArray = [...existing, file];\n field.onChange(multiple ? newArray : file);\n\n stream.getTracks().forEach((track) => track.stop());\n modals.closeAll();\n }\n }, \"image/jpeg\");\n }}\n >\n Tomar foto\n </Button>\n </Group>\n </Box>\n ),\n onClose: () => {\n stream.getTracks().forEach((track) => track.stop());\n },\n });\n\n setTimeout(() => {\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n }\n }, 100);\n } catch (error) {\n console.error(\"Error accessing camera:\", error);\n errorNotification({\n title: \"Error al acceder a la cámara\",\n message: \"No se pudo acceder a la cámara del dispositivo\",\n icon: imageFormIcons.errorIcon,\n });\n }\n };\n\n return (\n <>\n <Text my={10} fw={500} size=\"lg\">\n {label} {required ? <span style={{ color: \"red\" }}> *</span> : \"\"}\n </Text>\n <Dropzone\n onDrop={(files) => {\n field.onChange(multiple ? files : files[0] || null);\n }}\n multiple={multiple}\n onReject={(files) => {\n const errorMessages = files.map((file) => {\n if (file.errors[0]?.code === \"file-too-large\") {\n return maxSizeMessage;\n }\n if (file.errors[0]?.code === \"too-many-files\") {\n return maxFilesMessage;\n }\n return `Error con el archivo ${file.file.name}`;\n });\n\n modals.open({\n title: \"Error al subir archivos\",\n children: (\n <Box>\n <Text size=\"xl\">Error al subir archivos</Text>\n <Text size=\"sm\" c=\"dimmed\">\n {errorMessages.map((message, i) => (\n <Box key={i}>{message}</Box>\n ))}\n </Text>\n </Box>\n ),\n });\n }}\n maxSize={maxSize}\n accept={IMAGE_MIME_TYPE}\n >\n <Group\n justify=\"center\"\n gap=\"xl\"\n mih={220}\n style={{ pointerEvents: \"none\" }}\n >\n <Dropzone.Accept>\n {imageFormIcons.acceptIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-blue-6)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.acceptIcon}\n </Box>\n ) : null}\n </Dropzone.Accept>\n <Dropzone.Reject>\n {imageFormIcons.rejectIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-red-6)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.rejectIcon}\n </Box>\n ) : null}\n </Dropzone.Reject>\n <Dropzone.Idle>\n {imageFormIcons.idleIcon ? (\n <Box\n style={{\n width: rem(52),\n height: rem(52),\n color: \"var(--mantine-color-dimmed)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {imageFormIcons.idleIcon}\n </Box>\n ) : null}\n </Dropzone.Idle>\n\n <Box>\n <Text size=\"xl\" inline>\n Arrastra imágenes aquí o haz clic para seleccionar archivos\n </Text>\n <Text size=\"sm\" c=\"dimmed\" inline mt={7}>\n {maxFiles\n ? `Adjunta tantos archivos como desees, cada archivo no debe exceder los ${maxSize / 1024 ** 2}mb`\n : `Adjunta una imagen, el archivo no debe exceder los ${maxSize / 1024 ** 2}mb`}\n </Text>\n </Box>\n </Group>\n </Dropzone>\n\n {error ? (\n <Text size=\"sm\" c=\"red\">\n {error}\n </Text>\n ) : null}\n\n {enableCamera && (\n <Group justify=\"center\" my=\"md\">\n <Button\n fullWidth\n leftSection={imageFormIcons.cameraIcon}\n variant=\"filled\"\n onClick={handleCameraAccess}\n >\n <Text>Tomar foto</Text>\n </Button>\n <Text size=\"sm\" c=\"dimmed\">\n {enableCamera ? \"Toma una foto con la cámara del dispositivo\" : \"\"}\n </Text>\n </Group>\n )}\n\n {defaultImages.length > 0 && (\n <ScrollArea h={150} type=\"always\">\n <Group my={10}>\n {defaultImages.map((image) => (\n <Box key={image.productImageID} pos=\"relative\">\n <Image\n src={\n image.imageUrl.includes(\"uploads\")\n ? `http://localhost:4000/${image.imageUrl}`\n : image.imageUrl\n }\n w={100}\n h={100}\n />\n <ActionIcon\n onClick={() => {\n deleteImage({ imageId: image.productImageID });\n }}\n radius=\"xl\"\n color=\"red\"\n variant=\"filled\"\n size=\"xs\"\n style={{ position: \"absolute\", top: 5, right: 5 }}\n >\n {imageFormIcons.errorIcon}\n </ActionIcon>\n </Box>\n ))}\n </Group>\n </ScrollArea>\n )}\n\n {(Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : []\n ).length > 0 && (\n <ScrollArea h={150} type=\"always\">\n <Group my={10}>\n {(Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : []\n ).map((file, index) => (\n <Box key={index} pos=\"relative\">\n <Image\n src={\n file instanceof File\n ? URL.createObjectURL(file)\n : (file as TblProductsImage).imageUrl?.includes(\"uploads\")\n ? `http://localhost:4000/${(file as TblProductsImage).imageUrl}`\n : (file as TblProductsImage).imageUrl\n }\n w={100}\n h={100}\n />\n <ActionIcon\n radius=\"xl\"\n color=\"red\"\n variant=\"filled\"\n size=\"xs\"\n style={{ position: \"absolute\", top: 5, right: 5 }}\n onClick={() => {\n const list: ImageType[] = Array.isArray(field.value)\n ? (field.value as ImageType[])\n : field.value\n ? [field.value as ImageType]\n : [];\n const newImages = list.filter((_, i) => i !== index);\n field.onChange(\n multiple\n ? (newImages as (File | TblProductsImage)[])\n : (newImages[0] ?? null),\n );\n }}\n >\n {imageFormIcons.errorIcon}\n </ActionIcon>\n </Box>\n ))}\n </Group>\n </ScrollArea>\n )}\n </>\n );\n};\n","import { FieldTypes, type IField } from \"../../interfaces/form.interface\";\nimport type {\n ReactFormExtendedApi,\n FormValidateOrFn,\n FormAsyncValidateOrFn,\n} from \"@tanstack/react-form\";\n\nimport {\n TextInput,\n PasswordInput,\n NumberInput,\n Select,\n MultiSelect,\n Switch,\n TagsInput,\n} from \"@mantine/core\";\nimport { DatePickerInput } from \"@mantine/dates\";\nimport { ImageForm } from \"./ImageForm\";\n\nexport type FormValues = Record<string, unknown>;\n\ntype MaybeValidator = FormValidateOrFn<FormValues> | undefined;\ntype MaybeAsyncValidator = FormAsyncValidateOrFn<FormValues> | undefined;\n\nexport type FormInstance = ReactFormExtendedApi<\n FormValues,\n MaybeValidator, // TOnMount\n MaybeValidator, // TOnChange\n MaybeAsyncValidator, // TOnChangeAsync\n MaybeValidator, // TOnBlur\n MaybeAsyncValidator, // TOnBlurAsync\n MaybeValidator, // TOnSubmit\n MaybeAsyncValidator, // TOnSubmitAsync\n MaybeValidator, // TOnDynamic\n MaybeAsyncValidator, // TOnDynamicAsync\n MaybeAsyncValidator, // TOnServer\n unknown // TSubmitMeta\n>;\n\nexport const fieldGenerator = ({\n field,\n form,\n}: {\n field: IField;\n form: FormInstance;\n}): React.ReactNode => {\n switch (field.type) {\n case FieldTypes.TEXT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TextInput\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n f.handleChange(e.target.value);\n field.onChange?.(e.target.value);\n }}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.EMAIL:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TextInput\n type=\"email\"\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n f.handleChange(e.target.value)\n }\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.PASSWORD:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <PasswordInput\n label={field.label}\n description={field.description}\n placeholder={field.placeholder}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as string) ?? \"\"}\n onChange={(e) => f.handleChange(e.target.value)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.NUMBER:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <NumberInput\n hideControls={field.hideControls}\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n min={field.min}\n max={field.max}\n step={field.step}\n allowNegative={field.allowNegative}\n allowDecimal={field.allowDecimal}\n decimalScale={field.decimalScale}\n fixedDecimalScale={field.fixedDecimalScale}\n decimalSeparator={field.decimalSeparator}\n prefix={field.preffix}\n suffix={field.suffix}\n value={(f.state.value as number) ?? \"\"}\n onChange={(val) => {\n const nextValue =\n typeof val === \"number\"\n ? val\n : val === \"\"\n ? undefined\n : Number(val);\n f.handleChange(nextValue);\n }}\n onBlur={f.handleBlur}\n placeholder={field.placeholder}\n />\n )}\n />\n );\n case FieldTypes.SELECT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <Select\n label={field.label}\n placeholder={field.placeholder}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n data={field.options}\n searchable={field.searchable}\n nothingFoundMessage={field.nothingFoundMessage}\n limit={field.limit}\n withCheckIcon={field.withCheckIcon}\n checkIconPosition={field.checkIconPosition}\n clearable={field.clearable}\n onChange={(value) => {\n f.handleChange(value ?? \"\");\n if (value && field.onChange) field.onChange(value);\n }}\n value={(f.state.value as string) ?? null}\n />\n )}\n />\n );\n case FieldTypes.MULTISELECT:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <MultiSelect\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n withCheckIcon={field.withCheckIcon}\n checkIconPosition={field.checkIconPosition}\n clearable={field.clearable}\n searchable={field.searchable}\n nothingFoundMessage={field.nothingFoundMessage}\n data={field.options}\n value={(f.state.value as string[]) ?? []}\n onChange={(vals) => f.handleChange(vals)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.DATE:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <DatePickerInput\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n value={(f.state.value as Date | null) ?? null}\n onChange={(date) => f.handleChange(date ?? null)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.SWITCH:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <Switch\n my={5}\n label={field.label}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n checked={Boolean(f.state.value)}\n onChange={(e) => f.handleChange(e.currentTarget.checked)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.FILE:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <ImageForm\n label={field.label || \"\"}\n required={field.required}\n field={{\n value: f.state.value as File | File[] | null | undefined,\n onChange: f.handleChange,\n onBlur: f.handleBlur,\n }}\n multiple={field.multiple}\n maxSize={field.maxSize}\n maxFiles={field.maxFiles}\n maxSizeMessage={field.maxSizeMessage}\n maxFilesMessage={field.maxFilesMessage}\n defaultImages={field.defaultImages}\n error={f.state.meta.errors?.join(\", \")}\n />\n )}\n />\n );\n case FieldTypes.TAG:\n return (\n <form.Field\n name={field.name}\n children={(f) => (\n <TagsInput\n label={field.label}\n placeholder={field.placeholder}\n description={field.description}\n required={field.required}\n error={f.state.meta.errors?.join(\", \")}\n disabled={field.disabled}\n data={field.options}\n value={(f.state.value as string[]) ?? []}\n onChange={(vals) => f.handleChange(vals)}\n onBlur={f.handleBlur}\n />\n )}\n />\n );\n case FieldTypes.HIDDEN:\n return <form.Field name={field.name} children={() => null} />;\n default:\n return null;\n }\n};\n","import { Button } from \"@mantine/core\";\nimport type { IButton } from \"../../interfaces/form.interface\";\n\nexport const buttonGenerator = (\n button: IButton,\n loading: boolean,\n): React.ReactNode => {\n switch (button.type) {\n case \"submit\":\n return (\n <Button\n loading={button.loading || loading}\n key={button.label}\n color={button.color || \"green\"}\n type={button.type}\n variant={button.variant || \"filled\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n case \"button\":\n if (button.hidden) return <></>;\n return (\n <Button\n onClick={button.onClick}\n color={button.color || \"gray\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n case \"reset\":\n return (\n <Button\n color={button.color || \"red\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n default:\n return (\n <Button\n color={button.color || \"gray\"}\n variant={button.variant || \"outline\"}\n leftSection={button.iconPosition === \"left\" ? button.Icon : null}\n rightSection={button.iconPosition === \"right\" ? button.Icon : null}\n loading={button.loading || loading}\n key={button.label}\n type={button.type}\n disabled={button.disabled || button.loading || loading}\n fullWidth={button.fullWidth}\n >\n {button.label}\n </Button>\n );\n }\n};\n","import * as z from 'zod';\n\nimport { type IField, FieldTypes } from \"../../interfaces/form.interface\";\n\nconst generateFieldSchema = (field: IField): z.ZodType => {\n if (field.required) {\n switch (field.type) {\n case FieldTypes.TEXT:\n return z\n .string()\n .min(1, field.requiredMessage ?? 'Este campo es requerido');\n case FieldTypes.SELECT:\n return z\n .string()\n .min(1, field.requiredMessage ?? 'Este campo es requerido');\n case FieldTypes.MULTISELECT:\n return z\n .array(z.string())\n .min(\n 1,\n field.requiredMessage ??\n 'Debe seleccionar al menos una opción'\n );\n case FieldTypes.EMAIL:\n return z\n .string()\n .email(\n field.requiredMessage ?? 'Correo electrónico inválido'\n );\n case FieldTypes.SWITCH:\n return z.boolean().optional();\n case FieldTypes.DATE:\n return z.date().refine((date) => date != null, {\n message: field.requiredMessage ?? 'La fecha es requerida',\n });\n case FieldTypes.NUMBER:\n return field.required\n ? z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(\n field.min ?? -Infinity,\n field.requiredMessage ?? 'Este campo es requerido'\n )\n : z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(field.min ?? -Infinity);\n case FieldTypes.FILE:\n return field.multiple\n ? z\n .array(z.instanceof(File))\n .min(\n 1,\n field.requiredMessage ??\n 'Se requiere al menos un archivo'\n )\n : z.instanceof(File);\n case FieldTypes.TAG:\n return z.array(z.string()).optional();\n default:\n return z.string().optional();\n }\n }\n switch (field.type) {\n case FieldTypes.TEXT:\n return z.string().optional();\n case FieldTypes.SELECT:\n return z.string().optional();\n case FieldTypes.MULTISELECT:\n return z.array(z.string()).optional();\n case FieldTypes.EMAIL:\n return z\n .string()\n .email('Correo electrónico inválido')\n .optional();\n case FieldTypes.SWITCH:\n return z.boolean().optional();\n case FieldTypes.DATE:\n return z\n .date()\n .refine((date) => date != null, {\n message: 'La fecha es requerida',\n })\n .optional();\n case FieldTypes.NUMBER:\n return field.required\n ? z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(\n field.min ?? -Infinity,\n field.requiredMessage ?? 'Este campo es requerido'\n )\n : z\n .number({\n error: 'Debe ser un número válido',\n })\n .min(field.min ?? -Infinity)\n .optional();\n case FieldTypes.FILE:\n return field.multiple\n ? z.array(z.instanceof(File)).optional().default([])\n : z.instanceof(File).optional().nullable();\n case FieldTypes.TAG:\n return z.array(z.string()).optional();\n default:\n return z.string().optional();\n }\n};\n\nexport const generateFormSchema = (\n fields: IField[]\n): z.ZodObject<z.ZodRawShape> => {\n return z.object({\n ...fields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: generateFieldSchema(field),\n };\n }, {}),\n });\n};\n","import { useForm } from \"@tanstack/react-form\";\nimport { isAxiosError } from \"axios\";\nimport {\n Box,\n Flex,\n LoadingOverlay,\n Stepper,\n Button,\n Group,\n} from \"@mantine/core\";\nimport {\n type IField,\n FieldTypes,\n type IButton,\n} from \"../../interfaces/form.interface\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fieldGenerator, type FormInstance } from \"./FieldGenerator\";\nexport type { FormInstance };\nimport { buttonGenerator } from \"./ButtonGenerator\";\nimport { generateFormSchema } from \"./schemaGenerator\";\nimport {\n errorNotification,\n successNotification,\n} from \"../../utils/notifications\";\ninterface FormGeneratorProps<TData, TVariables> {\n fields: IField[];\n buttons: IButton[];\n loading: boolean;\n name: string;\n mutation: UseMutationResult<TData, unknown, TVariables, unknown>;\n buildVariables?: (values: Record<string, unknown> | FormData) => TVariables;\n hasFiles?: boolean;\n typeOfForm?: \"create\" | \"edit\";\n navigateAway?: boolean;\n setData?: (data: TData) => void;\n onSuccess?: (data: TData) => void;\n wrapJsonByName?: boolean; // Si no hay files y no hay buildVariables, envolver como { [name]: values }\n onFormRef?: (form: FormInstance) => void;\n}\n\nexport const FormGenerator = <TData, TVariables = unknown>({\n fields,\n buttons,\n name,\n loading,\n mutation,\n buildVariables,\n hasFiles = false,\n typeOfForm,\n navigateAway: _navigateAway = true,\n setData,\n onSuccess,\n wrapJsonByName = true,\n onFormRef,\n}: FormGeneratorProps<TData, TVariables>): React.ReactNode => {\n // const navigate = useNavigate();\n\n const formSchema = generateFormSchema(fields);\n\n // Multi-step support via `page` field prop\n const maxPage = useMemo(() => {\n const max = fields.reduce((acc, f) => Math.max(acc, f.page ?? 1), 1);\n return max < 1 ? 1 : max;\n }, [fields]);\n const hasMultipleSteps = maxPage > 1;\n const [currentStep, setCurrentStep] = useState(1);\n\n const getDefaultValueByType = (\n type: FieldTypes,\n ): string | number | boolean | null | [] => {\n switch (type) {\n case FieldTypes.NUMBER:\n return null;\n case FieldTypes.SWITCH:\n return false;\n case FieldTypes.MULTISELECT:\n return [];\n case FieldTypes.FILE:\n return [];\n default:\n return \"\";\n }\n };\n\n const { mutate, isPending } = mutation;\n\n const form = useForm({\n defaultValues: fields.reduce(\n (acc, field) => {\n return {\n ...acc,\n [field.name]: field.defaultValue ?? getDefaultValueByType(field.type),\n } as Record<string, unknown>;\n },\n {} as Record<string, unknown>,\n ),\n onSubmit: async ({ value }) => {\n // Validación con Zod antes de enviar\n const validationResult = formSchema.safeParse(value);\n if (!validationResult.success) {\n errorNotification({\n title: \"Error de validación\",\n message: \"Por favor verifica los datos ingresados\",\n });\n return;\n }\n\n const hasFileField = fields.some((f) => f.type === FieldTypes.FILE);\n const shouldUseFormData = hasFiles || hasFileField;\n\n if (shouldUseFormData) {\n const formData = new FormData();\n\n Object.entries(validationResult.data).forEach(([key, rawVal]) => {\n const fieldDef = fields.find((f) => f.name === key);\n const val = rawVal as unknown;\n\n if (fieldDef?.type === FieldTypes.FILE && val) {\n if (Array.isArray(val)) {\n (val as unknown[]).forEach((item) => {\n if (item instanceof File) formData.append(key, item);\n });\n } else if (val instanceof File) {\n formData.append(key, val);\n }\n return;\n }\n\n if (Array.isArray(val)) {\n const items = val as unknown[];\n const hasFile = items.some((item) => item instanceof File);\n if (hasFile) {\n items.forEach((item) => {\n if (item instanceof File) formData.append(key, item);\n });\n } else {\n // For TAG fields, send as comma-separated string\n if (fieldDef?.type === FieldTypes.TAG) {\n formData.append(key, items.join(\",\"));\n } else {\n // For other arrays, send as JSON string\n formData.append(key, JSON.stringify(items));\n }\n }\n return;\n }\n\n if (val instanceof Date) {\n formData.append(key, val.toISOString());\n return;\n }\n\n if (val != null && typeof val === \"object\") {\n formData.append(key, JSON.stringify(val));\n return;\n }\n\n formData.append(key, val != null ? String(val) : \"\");\n });\n\n const variables = buildVariables\n ? (buildVariables(formData) as TVariables)\n : (formData as unknown as TVariables);\n\n mutate(variables, {\n onSuccess: (data) => {\n successNotification({\n title: `${typeOfForm === \"create\" ? \"Creado\" : \"Editado\"} exitosamente`,\n message: `${name} ha sido ${typeOfForm === \"create\" ? \"creado\" : \"editado\"} exitosamente, serás redirigido a la lista de ${name}`,\n });\n setData && setData(data as TData);\n onSuccess && onSuccess(data as TData);\n },\n onError: (error: unknown) => {\n const message = isAxiosError(error)\n ? error.response?.data?.message\n : undefined;\n errorNotification({\n title: `Error al ${typeOfForm === \"create\" ? \"crear\" : \"editar\"} el ${name}`,\n message:\n message ?? \"Ha ocurrido un error al crear o editar el registro\",\n });\n },\n });\n } else {\n const raw = validationResult.data as Record<string, unknown>;\n const variables = buildVariables\n ? (buildVariables(raw) as TVariables)\n : ((wrapJsonByName ? { [name]: raw } : raw) as unknown as TVariables);\n\n mutate(variables, {\n onSuccess: (data) => {\n successNotification({\n title: `${typeOfForm === \"create\" ? \"Creado\" : \"Editado\"} exitosamente`,\n message: `${name} ha sido ${typeOfForm === \"create\" ? \"creado\" : \"editado\"} exitosamente, serás redirigido a la lista de ${name}`,\n });\n setData && setData(data as TData);\n onSuccess && onSuccess(data as TData);\n },\n onError: (error: unknown) => {\n const message = isAxiosError(error)\n ? error.response?.data?.message\n : undefined;\n errorNotification({\n title: `Error al ${typeOfForm === \"create\" ? \"crear\" : \"editar\"} el ${name}`,\n message:\n message ?? \"Ha ocurrido un error al crear o editar el registro\",\n });\n },\n });\n }\n },\n });\n\n const visibleFields = useMemo(\n () =>\n hasMultipleSteps\n ? fields.filter((f) => (f.page ?? 1) === currentStep)\n : fields,\n [fields, hasMultipleSteps, currentStep],\n );\n\n const handleNext = async (): Promise<void> => {\n // Validate only current step fields\n const stepFields = fields.filter((f) => (f.page ?? 1) === currentStep);\n if (stepFields.length > 0) {\n const stepSchema = generateFormSchema(stepFields);\n const currentValues = form.state.values as Record<string, unknown>;\n const stepValues = stepFields.reduce<Record<string, unknown>>(\n (acc, f) => {\n acc[f.name] = currentValues[f.name];\n return acc;\n },\n {},\n );\n const res = stepSchema.safeParse(stepValues);\n if (!res.success) {\n errorNotification({\n title: \"Datos incompletos\",\n message: \"Por favor completa los campos requeridos de este paso\",\n });\n return;\n }\n }\n setCurrentStep((s) => Math.min(s + 1, maxPage));\n };\n\n const handleBack = (): void => {\n setCurrentStep((s) => Math.max(1, s - 1));\n };\n\n useEffect(() => {\n fields.forEach((field) => {\n const currentValue = (form.state.values as Record<string, unknown>)[\n field.name\n ];\n const defaultValue =\n field.defaultValue ?? getDefaultValueByType(field.type);\n\n // Verifica si el campo es de tipo TAG y si el valor actual es un array vacío\n if (\n field.type === FieldTypes.TAG &&\n Array.isArray(currentValue) &&\n currentValue.length === 0\n ) {\n form.setFieldValue(field.name as string, defaultValue as unknown);\n } else if (currentValue === \"\" || currentValue === defaultValue) {\n form.setFieldValue(field.name as string, defaultValue as unknown);\n }\n });\n }, [fields]);\n\n useEffect(() => {\n if (onFormRef) {\n onFormRef(form);\n }\n }, [form, onFormRef]);\n\n return (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (hasMultipleSteps && currentStep < maxPage) {\n await handleNext();\n } else {\n form.handleSubmit();\n }\n }}\n encType=\"multipart/form-data\"\n >\n <LoadingOverlay visible={loading!} />\n {hasMultipleSteps && (\n <Box mb={16}>\n <Stepper active={currentStep - 1} allowNextStepsSelect={false}>\n {Array.from({ length: maxPage }).map((_, idx) => (\n <Stepper.Step key={idx} label={`Paso ${idx + 1}`} />\n ))}\n </Stepper>\n </Box>\n )}\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: fields.some((field) => field.section === 2)\n ? \"repeat(2, 1fr)\"\n : \"1fr\",\n gap: \"20px\",\n alignItems: \"start\",\n }}\n >\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(12, 1fr)\",\n gap: \"10px\",\n height: \"fit-content\",\n }}\n >\n {visibleFields\n .filter(\n (field) => field.section === undefined || field.section === 1,\n )\n .map((field) => (\n <Box\n key={field.name}\n style={{\n gridColumn: `span ${field.columnWidth || 12}`,\n }}\n >\n {fieldGenerator({ field, form })}\n </Box>\n ))}\n </Box>\n {visibleFields.some((field) => field.section === 2) && (\n <Box\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(12, 1fr)\",\n gap: \"10px\",\n height: \"fit-content\",\n }}\n >\n {visibleFields\n .filter((field) => field.section === 2)\n .map((field) => (\n <Box\n key={field.name}\n style={{\n gridColumn: `span ${field.columnWidth || 12}`,\n }}\n >\n {fieldGenerator({ field, form })}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n <Group justify=\"space-between\" mt={20}>\n {hasMultipleSteps && (\n <Group>\n <Button\n type=\"button\"\n variant=\"default\"\n onClick={handleBack}\n disabled={currentStep === 1}\n >\n Atrás\n </Button>\n {currentStep < maxPage && (\n <Button type=\"button\" onClick={handleNext}>\n Siguiente\n </Button>\n )}\n </Group>\n )}\n <Flex justify=\"flex-end\" style={{ flex: 1 }}>\n {buttons.map((button) =>\n hasMultipleSteps &&\n currentStep < maxPage &&\n button.type === \"submit\"\n ? buttonGenerator({ ...button, disabled: true }, isPending)\n : buttonGenerator(button, isPending),\n )}\n </Flex>\n </Group>\n </form>\n );\n};\n","import { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\nimport { Button, Card, Container, Flex, Title } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport type { IField, IButton } from \"../../interfaces/form.interface\";\nimport { FormGenerator } from \"./FormGenerator\";\n\ninterface CreateEditFormProps<T> {\n fields: IField[];\n buttons: IButton[];\n mutationKey: string[];\n mutationFn: (data: T | FormData) => Promise<T>;\n typeOfForm: \"create\" | \"edit\";\n dataKey: string;\n loading: boolean;\n cardWidth?: number;\n hasFiles?: boolean;\n onSuccess?: () => void;\n setData?: (data: T) => void;\n navigateAway?: boolean;\n showBackButton?: boolean;\n /**\n * Callback when the user clicks \"Regresar\". Provide your router's go-back logic here.\n * @example React Router: () => navigate(-1)\n * @example TanStack Router: () => router.history.back()\n * @example TanStack Start: () => navigate({ to: '..' })\n */\n onGoBack?: () => void;\n /**\n * Optional icon for the back button. Pass your own icon component so the lib stays router/UI-agnostic.\n * @example <ArrowLeft /> from lucide-react\n */\n backButtonIcon?: ReactNode;\n}\n\nexport const CreateEditForm = <T,>({\n fields,\n buttons,\n mutationKey,\n mutationFn,\n typeOfForm,\n dataKey,\n loading,\n cardWidth,\n hasFiles,\n onSuccess,\n setData,\n navigateAway = true,\n showBackButton = true,\n onGoBack,\n backButtonIcon,\n}: CreateEditFormProps<T>): React.ReactNode => {\n const showBack = showBackButton && onGoBack != null;\n\n const mutation = useMutation({\n mutationKey,\n mutationFn: mutationFn as (data: T | FormData) => Promise<T>,\n });\n\n return (\n <>\n {showBack && (\n <Flex justify={\"start\"}>\n <Button\n leftSection={backButtonIcon}\n variant=\"transparent\"\n mx={20}\n mt={10}\n onClick={onGoBack}\n >\n Regresar a {dataKey}\n </Button>\n </Flex>\n )}\n <Container w={cardWidth ?? 500} my={-10}>\n <Flex direction={\"column\"}>\n <Title order={1} my={10}>\n {typeOfForm === \"create\" ? \"Crear\" : \"Editar\"} {dataKey}\n </Title>\n <Card withBorder>\n <FormGenerator<T>\n typeOfForm={typeOfForm}\n name={dataKey}\n loading={loading}\n fields={fields}\n buttons={buttons}\n mutation={mutation as UseMutationResult<T, unknown, unknown, unknown>}\n hasFiles={hasFiles}\n onSuccess={onSuccess}\n setData={setData}\n navigateAway={navigateAway}\n />\n </Card>\n </Flex>\n </Container>\n </>\n );\n};\n","\texport const barBorder =\n\t\t\"light-dark(#e5e5e5, var(--mantine-color-dark-4))\";\n\texport const barSurface =\n\t\t\"light-dark(var(--mantine-color-white), var(--mantine-color-dark-6))\";\n\texport const barTextActive =\n\t\t\"light-dark(#111827, var(--mantine-color-dark-0))\";\n\texport const barTextInactive =\n\t\t\"light-dark(#6b7280, var(--mantine-color-dark-2))\";\nexport const defaultHeaderBgColor =\n \"light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6))\";\n export const paginationBorder =\n\t\t\"light-dark(#e5e5e5, var(--mantine-color-dark-4))\";\n\texport const paginationSurface =\n\t\t\"light-dark(var(--mantine-color-white), var(--mantine-color-dark-6))\";\n","import { useMediaQuery as useMantineMediaQuery } from \"@mantine/hooks\";\n\nexport const useMediaQuery = () => {\n const isMobile = useMantineMediaQuery(\"(max-width: 767px)\");\n const isDesktop = useMantineMediaQuery(\"(min-width: 992px)\");\n const isTablet = useMantineMediaQuery(\"(min-width: 768px) and (max-width: 991px)\");\n return { isMobile, isDesktop, isTablet };\n};","import { Flex, Text, Select, Pagination, Group } from \"@mantine/core\";\nimport { paginationBorder, paginationSurface } from \"../../theme/constants\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\n\n\ninterface BottomPaginationProps {\n total: number;\n pageSize: number;\n pageIndex: number;\n onPageSizeChange: (value: number) => void;\n onPageIndexChange: (value: number) => void;\n}\n\nexport const BottomPagination = ({\n total,\n pageSize,\n pageIndex,\n onPageSizeChange,\n onPageIndexChange,\n}: BottomPaginationProps) => {\n\n const { isMobile, isDesktop } = useMediaQuery();\n \n const totalPages = Math.ceil(total / pageSize);\n const currentPage = pageIndex + 1; // pageIndex is 0-based, display is 1-based\n\n const handlePageChange = (page: number) => {\n onPageIndexChange(page - 1); // Convert back to 0-based\n };\n\n const pageSizeOptions = [\n { value: \"5\", label: \"5\" },\n { value: \"10\", label: \"10\" },\n { value: \"15\", label: \"15\" },\n { value: \"20\", label: \"20\" },\n { value: \"50\", label: \"50\" },\n ];\n\n // Don't render pagination if there's no data\n if (total === 0) {\n return null;\n }\n\n return (\n <Flex\n align=\"center\"\n py=\"sm\"\n px=\"lg\"\n style={{\n position: \"relative\",\n borderTop:\n \"1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4))\",\n backgroundColor:\n \"light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6))\",\n }}\n >\n <Pagination\n radius=\"md\"\n withEdges={isDesktop}\n total={totalPages}\n value={currentPage}\n onChange={handlePageChange}\n size=\"sm\"\n siblings={ !isMobile ? 1 : 0 }\n boundaries={ !isMobile ? 1 : 0 }\n style={\n isDesktop\n ? {\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n }\n : undefined\n }\n />\n\n <Group style={{ marginLeft: \"auto\", alignItems: \"center\" }}>\n <Text size=\"xs\" c=\"dimmed\">\n Mostrar\n </Text>\n <Select\n value={pageSize.toString()}\n onChange={(value) => value && onPageSizeChange(parseInt(value, 10))}\n data={pageSizeOptions}\n size=\"xs\"\n w={65}\n styles={{\n input: {\n border: `1px solid ${paginationBorder}`,\n backgroundColor: paginationSurface,\n fontSize: \"0.75rem\",\n },\n }}\n comboboxProps={{ withinPortal: false }}\n />\n <Text size=\"xs\" c=\"dimmed\" visibleFrom=\"sm\">\n registros\n </Text>\n {total !== undefined && !isMobile && (\n <Text size=\"xs\" c=\"dimmed\" ml=\"xs\">\n ({total} en total)\n </Text>\n )}\n </Group>\n </Flex>\n );\n};\n","import type { ColumnFiltersState } from '@tanstack/react-table'\n\n/**\n * State passed to onStateChange on every table interaction.\n * Use these values to build your API request.\n */\nexport interface ServerTableState {\n pageIndex: number\n pageSize: number\n globalFilter: string\n columnFilters: ColumnFiltersState\n sorting: { id: string; desc: boolean }[]\n}\n\n/**\n * Style options for the table header row.\n * Pass as the headerStyle (or legacy headerBgColor) prop to customize appearance.\n */\nexport interface TableHeaderStyle {\n /** Header background color. Use light-dark(light, dark) for theme-aware colors */\n bgColor?: string;\n /** Header text (and icon) color */\n textColor?: string;\n /** Header background color on hover (if not set, a default is used) */\n hoverBgColor?: string;\n /** Header text color on hover (if not set, same as textColor) */\n hoverTextColor?: string;\n /** Header font weight (e.g. 600, 700, \"bold\") */\n fontWeight?: number | string;\n /** Header font size in px */\n fontSize?: number | string;\n /** Horizontal padding for header cells (e.g. \"4px 10px\") */\n padding?: string;\n}\n\n/**\n * Configuration for the DataTable UI.\n * Pass partial overrides via the `config` prop to customize defaults.\n */\nexport interface DataTableConfig {\n /** Page size options for the pagination selector */\n pageSizeOptions: number[];\n /** Default page size when the table first loads */\n defaultPageSize: number;\n /** Placeholder for the search input */\n searchPlaceholder: string;\n /** Whether to show the search input */\n enableGlobalFilter: boolean;\n}\n\nexport const defaultDataTableConfig: DataTableConfig = {\n pageSizeOptions: [5, 10, 15, 20, 50],\n defaultPageSize: 10,\n searchPlaceholder: 'Buscar...',\n enableGlobalFilter: true,\n}\n","import {\n type ColumnFiltersState,\n type ColumnDef,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n defaultDataTableConfig,\n type DataTableConfig,\n type ServerTableState,\n} from '../interfaces/datatable.interface'\n\nexport interface UseDataTableOptions<TData> {\n data: TData[]\n columns: ColumnDef<TData, unknown>[]\n /** Override default config (look, labels, page sizes, etc.) */\n config?: Partial<DataTableConfig>\n /** Enable row selection (checkboxes). When true, selectedRows is returned */\n enableRowSelection?: boolean\n /** Total row count from server. Used to compute pageCount. */\n totalRowCount?: number\n /** Called when table state changes (filters, pagination, search, sort). Use for API calls. */\n onStateChange?: (state: ServerTableState) => void\n}\n\nexport interface UseDataTableReturn<TData> {\n /** TanStack Table instance: use for headers, rows, getRowModel(), etc. */\n table: ReturnType<typeof useReactTable<TData>>\n /** Current global search value (for SearchInput) */\n globalFilter: string\n /** Set global search (for SearchInput onChange) */\n setGlobalFilter: (value: string) => void\n /** Column filters state (for FilterSelect, FilterDate, etc.) */\n columnFilters: ColumnFiltersState\n /** Set column filter value for a specific column */\n setColumnFilter: (columnId: string, value: unknown) => void\n /** Current server table state (pageIndex, pageSize, filters, etc.) */\n serverState: ServerTableState\n /** Merged config (defaults + your overrides) */\n config: DataTableConfig\n /** Selected row data (only when enableRowSelection is true) */\n selectedRows: TData[]\n}\n\nexport function useDataTable<TData>({\n data,\n columns,\n config: configOverride,\n enableRowSelection = false,\n totalRowCount,\n onStateChange,\n}: UseDataTableOptions<TData>): UseDataTableReturn<TData> {\n const mergedConfig = useMemo<DataTableConfig>(\n () => ({ ...defaultDataTableConfig, ...configOverride }),\n [configOverride],\n )\n\n const [pagination, setPagination] = useState({\n pageIndex: 0,\n pageSize: mergedConfig.defaultPageSize,\n })\n const [sorting, setSorting] = useState<{ id: string; desc: boolean }[]>([])\n const [rowSelection, setRowSelection] = useState<Record<string, boolean>>({})\n const [globalFilter, setGlobalFilter] = useState('')\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n\n const setColumnFilter = useMemo(\n () => (columnId: string, value: unknown) => {\n setColumnFilters((prev) => {\n const rest = prev.filter((f) => f.id !== columnId)\n if (value === undefined || value === null || value === '') return rest\n return [...rest, { id: columnId, value }]\n })\n },\n [],\n )\n\n // Reset to page 0 when search or column filters change\n useEffect(() => {\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [globalFilter, columnFilters])\n\n const serverState: ServerTableState = useMemo(\n () => ({\n pageIndex: pagination.pageIndex,\n pageSize: pagination.pageSize,\n globalFilter,\n columnFilters,\n sorting,\n }),\n [pagination.pageIndex, pagination.pageSize, globalFilter, columnFilters, sorting],\n )\n\n useEffect(() => {\n onStateChange?.(serverState)\n }, [onStateChange, serverState])\n\n const table = useReactTable<TData>({\n data,\n columns,\n state: {\n pagination,\n sorting,\n rowSelection: enableRowSelection ? rowSelection : undefined,\n globalFilter,\n columnFilters,\n },\n onPaginationChange: setPagination,\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onGlobalFilterChange: setGlobalFilter,\n onColumnFiltersChange: setColumnFilters,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n enableRowSelection,\n manualPagination: true,\n manualFiltering: true,\n /** Sort is applied client-side to the current page only (no server refetch) */\n manualSorting: false,\n pageCount:\n totalRowCount != null\n ? Math.max(1, Math.ceil(totalRowCount / pagination.pageSize))\n : undefined,\n })\n\n const selectedRows = useMemo<TData[]>(\n () =>\n enableRowSelection\n ? table.getSelectedRowModel().rows.map((row) => row.original)\n : [],\n [enableRowSelection, rowSelection],\n )\n\n return {\n table,\n globalFilter,\n setGlobalFilter,\n columnFilters,\n setColumnFilter,\n serverState,\n config: mergedConfig,\n selectedRows,\n }\n}\n","import { useState } from \"react\";\nimport { Checkbox, Table, UnstyledButton } from \"@mantine/core\";\nimport { flexRender, type useReactTable } from \"@tanstack/react-table\";\nimport { defaultHeaderBgColor } from \"../../theme/constants\";\nimport type { TableHeaderStyle as TableHeaderStyleType } from \"../../interfaces/datatable.interface\";\n\nconst defaultHeaderTextColor =\n \"light-dark(var(--mantine-color-dimmed), var(--mantine-color-gray-4))\";\nconst defaultHeaderHoverBg =\n \"light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-2))\";\n\n/** Normalize legacy string (bg only) to TableHeaderStyle object */\nfunction normalizeHeaderStyle(\n value: string | TableHeaderStyleType | undefined,\n): TableHeaderStyleType {\n if (value == null) {\n return {\n bgColor: defaultHeaderBgColor,\n textColor: defaultHeaderTextColor,\n hoverBgColor: defaultHeaderHoverBg,\n };\n }\n if (typeof value === \"string\") {\n return {\n bgColor: value,\n textColor: defaultHeaderTextColor,\n hoverBgColor: defaultHeaderHoverBg,\n };\n }\n return {\n bgColor: value.bgColor ?? defaultHeaderBgColor,\n textColor: value.textColor ?? defaultHeaderTextColor,\n hoverBgColor: value.hoverBgColor ?? defaultHeaderHoverBg,\n hoverTextColor: value.hoverTextColor ?? value.textColor ?? defaultHeaderTextColor,\n fontWeight: value.fontWeight,\n fontSize: value.fontSize,\n padding: value.padding,\n };\n}\n\ninterface TableHeaderProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n /** Icon when column is unsorted */\n SortIcon?: React.ElementType;\n /** Icon when column is sorted ascending */\n SortIconAsc?: React.ElementType;\n /** Icon when column is sorted descending */\n SortIconDesc?: React.ElementType;\n canCheck?: boolean;\n /** Whether the table has an actions column (no header label, needs background) */\n hasActionsColumn?: boolean;\n /** Header style: color string (legacy, used as bg) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyleType;\n}\n\nexport const TableHeader = <TData,>({\n table,\n SortIcon,\n SortIconAsc,\n SortIconDesc,\n canCheck = false,\n hasActionsColumn = false,\n headerBgColor,\n}: TableHeaderProps<TData>) => {\n const [hoveredHeaderId, setHoveredHeaderId] = useState<string | null>(null);\n const style = normalizeHeaderStyle(headerBgColor);\n const bgColor = style.bgColor ?? defaultHeaderBgColor;\n const hoverBg = style.hoverBgColor ?? defaultHeaderHoverBg;\n const hoverText = style.hoverTextColor ?? style.textColor ?? defaultHeaderTextColor;\n const totalColumnsSize = table\n .getVisibleLeafColumns()\n .reduce((sum, column) => sum + column.getSize(), 0);\n\n const getSortIcon = (sortState: false | \"asc\" | \"desc\") => {\n if (sortState === \"asc\") return SortIconAsc;\n if (sortState === \"desc\") return SortIconDesc;\n return SortIcon;\n };\n\n const getColumnStyle = (size: number): React.CSSProperties | undefined => {\n if (!size || totalColumnsSize <= 0) return undefined;\n return {\n width: `${(size / totalColumnsSize) * 100}%`,\n minWidth: size,\n };\n };\n\n const baseButtonStyle: React.CSSProperties = {\n padding: style.padding ?? \"4px 10px\",\n fontSize: style.fontSize ?? 14,\n fontWeight: style.fontWeight ?? 700,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n transition: \"background-color 0.1s ease, color 0.1s ease\",\n borderRadius: \"var(--mantine-radius-lg)\",\n };\n\n return (\n <Table.Thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Tr key={headerGroup.id}>\n {canCheck && (\n <Table.Th\n bg={bgColor}\n w={10}\n styles={{\n th: {\n padding: \"0 0 0 6px\",\n },\n }}\n >\n <Checkbox\n size=\"xs\"\n style={{\n padding: 0,\n }}\n checked={table.getIsAllRowsSelected()}\n indeterminate={\n table.getIsSomeRowsSelected() && !table.getIsAllRowsSelected()\n }\n onChange={table.getToggleAllRowsSelectedHandler()}\n aria-label=\"Toggle all rows selected\"\n />\n </Table.Th>\n )}\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sortState = header.column.getIsSorted();\n const Icon = canSort ? getSortIcon(sortState) : null;\n const isHovered = hoveredHeaderId === header.id;\n\n return (\n <Table.Th\n key={header.id}\n bg={bgColor}\n style={getColumnStyle(header.column.getSize())}\n >\n <UnstyledButton\n style={{\n ...baseButtonStyle,\n color: isHovered ? hoverText : (style.textColor ?? defaultHeaderTextColor),\n backgroundColor: isHovered ? hoverBg : undefined,\n }}\n onClick={header.column.getToggleSortingHandler()}\n onMouseEnter={() => setHoveredHeaderId(header.id)}\n onMouseLeave={() => setHoveredHeaderId(null)}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {Icon && <Icon size={16} />}\n </UnstyledButton>\n </Table.Th>\n );\n })}\n {hasActionsColumn && <Table.Th bg={bgColor} />}\n </Table.Tr>\n ))}\n </Table.Thead>\n );\n};\n","import { useState } from \"react\";\nimport { ActionIcon, Checkbox, Flex, Menu, Table, Text } from \"@mantine/core\";\nimport { MoreVertical } from \"lucide-react\";\nimport { flexRender, type useReactTable } from \"@tanstack/react-table\";\n\ninterface TableBodyProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n canCheck?: boolean;\n columnActions?: (row: TData) => React.ReactNode;\n MenuIcon?: React.ElementType;\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n onRowClick?: (row: TData) => void;\n onRowHover?: (row: TData) => void;\n}\n\nexport const TableBody = <TData,>({\n table,\n canCheck = false,\n columnActions,\n MenuIcon = MoreVertical,\n listMenuActions,\n onRowClick,\n onRowHover,\n}: TableBodyProps<TData>) => {\n const [hoveredRowId, setHoveredRowId] = useState<string | null>(null);\n const totalColumnsSize = table\n .getVisibleLeafColumns()\n .reduce((sum, column) => sum + column.getSize(), 0);\n\n const getColumnStyle = (size: number): React.CSSProperties | undefined => {\n if (!size || totalColumnsSize <= 0) return undefined;\n return {\n width: `${(size / totalColumnsSize) * 100}%`,\n minWidth: size,\n };\n };\n\n return (\n <Table.Tbody>\n {table.getRowModel().rows.map((row) => (\n <Table.Tr\n key={row.id}\n style={{\n ...(onRowClick ? { cursor: \"pointer\" } : {}),\n ...(hoveredRowId === row.id\n ? {\n backgroundColor:\n \"light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5))\",\n }\n : {}),\n }}\n onMouseEnter={() => {\n setHoveredRowId(row.id);\n onRowHover?.(row.original);\n }}\n onMouseLeave={() => setHoveredRowId(null)}\n >\n {canCheck && (\n <Table.Td\n styles={{\n td: {\n padding: \"0 0 0 6px\",\n },\n }}\n >\n <Checkbox\n size=\"xs\"\n styles={{\n root: {\n width: 5,\n },\n }}\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n disabled={!row.getCanSelect()}\n aria-label=\"Select row\"\n />\n </Table.Td>\n )}\n {row.getVisibleCells().map((cell) => (\n <Table.Td\n key={cell.id}\n style={getColumnStyle(cell.column.getSize())}\n onClick={() => onRowClick?.(row.original)}\n >\n <Text\n size=\"sm\"\n style={{\n color:\n \"light-dark(var(--mantine-color-dark-7), var(--mantine-color-gray-1))\",\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Text>\n </Table.Td>\n ))}\n {(columnActions || listMenuActions) && (\n <Table.Td>\n <Flex justify=\"flex-end\" align=\"center\" gap=\"sm\">\n {columnActions?.(row.original)}\n {listMenuActions && (\n <Menu variant=\"subtle\">\n <Menu.Target>\n <ActionIcon variant=\"subtle\" color=\"gray\" size=\"sm\">\n <MenuIcon size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n {listMenuActions(row.original).map((action) => (\n <Menu.Item\n key={action.label}\n onClick={action.onClick}\n leftSection={action.Icon && <action.Icon />}\n >\n {action.label}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n )}\n </Flex>\n </Table.Td>\n )}\n </Table.Tr>\n ))}\n </Table.Tbody>\n );\n};\n","import { Skeleton, Table } from \"@mantine/core\";\n\ninterface TableSkeletonProps {\n /** Number of skeleton rows to show */\n rowCount: number;\n /** Number of data columns (excluding checkbox and actions) */\n columnCount: number;\n /** Whether to show the checkbox column */\n canCheck?: boolean;\n /** Whether to show the actions column */\n hasActionsColumn?: boolean;\n}\n\nconst cellStyle = { minHeight: 40, verticalAlign: \"middle\" as const };\n\nexport const TableSkeleton = ({\n rowCount,\n columnCount,\n canCheck = false,\n hasActionsColumn = false,\n}: TableSkeletonProps) => {\n return (\n <Table.Tbody>\n {Array.from({ length: rowCount }).map((_, rowIdx) => (\n <Table.Tr key={rowIdx}>\n {canCheck && (\n <Table.Td style={cellStyle}>\n <Skeleton height={16} width={18} radius=\"sm\" />\n </Table.Td>\n )}\n {Array.from({ length: columnCount }).map((_, colIdx) => (\n <Table.Td key={colIdx} style={cellStyle}>\n <Skeleton\n height={16}\n width={\n colIdx === columnCount - 1\n ? 40\n : `${60 + (colIdx % 2) * 15}%`\n }\n radius=\"sm\"\n />\n </Table.Td>\n ))}\n {hasActionsColumn && (\n <Table.Td style={cellStyle}>\n <Skeleton height={16} width={32} radius=\"sm\" />\n </Table.Td>\n )}\n </Table.Tr>\n ))}\n </Table.Tbody>\n );\n};\n","import React from \"react\";\nimport { Stack, Text, Title, Button, Box } from \"@mantine/core\";\n\ninterface EmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n actionButton?: {\n label: string;\n onClick: () => void;\n variant?: \"filled\" | \"light\" | \"outline\";\n color?: string;\n };\n IconPlus?: React.ElementType;\n IconFileX?: React.ElementType;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n title = \"No hay datos disponibles\",\n description = \"No se encontraron elementos para mostrar. Intenta ajustar los filtros o agrega nuevos elementos.\",\n icon,\n actionButton,\n IconPlus,\n IconFileX,\n}) => {\n const defaultIcon = (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 64,\n height: 64,\n borderRadius: \"50%\",\n backgroundColor: \"var(--mantine-color-gray-1)\",\n margin: \"0 auto\",\n }}\n >\n {IconFileX ? (\n <IconFileX size={32} color=\"var(--mantine-color-gray-6)\" />\n ) : null}\n </Box>\n );\n\n return (\n <Stack\n align=\"center\"\n justify=\"center\"\n gap=\"md\"\n py=\"xl\"\n px=\"md\"\n style={{\n textAlign: \"center\",\n minHeight: 300,\n }}\n >\n {icon || defaultIcon}\n\n <Stack gap=\"xs\" align=\"center\">\n <Title\n order={3}\n size=\"h4\"\n fw={600}\n style={{\n color: \"var(--mantine-color-gray-9)\",\n fontSize: \"18px\",\n }}\n >\n {title}\n </Title>\n\n <Text\n size=\"sm\"\n c=\"dimmed\"\n style={{\n maxWidth: 400,\n lineHeight: 1.5,\n }}\n >\n {description}\n </Text>\n </Stack>\n\n {actionButton && (\n <Button\n variant={actionButton.variant || \"light\"}\n color={actionButton.color || \"blue\"}\n leftSection={IconPlus ? <IconPlus size={16} /> : null}\n onClick={actionButton.onClick}\n mt=\"xs\"\n >\n {actionButton.label}\n </Button>\n )}\n </Stack>\n );\n};\n","import {\n flexRender,\n useReactTable,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { Flex, Paper, ScrollArea, Table } from \"@mantine/core\";\nimport { ArrowUpDown, ArrowDown, ArrowUp, FileX } from \"lucide-react\";\nimport type React from \"react\";\nimport type { TableHeaderStyle } from \"../../interfaces/datatable.interface\";\nimport { defaultHeaderBgColor } from \"../../theme/constants\";\nimport { TableHeader } from \"./TableHeader\";\nimport { TableBody } from \"./TableBody\";\nimport { TableSkeleton } from \"./TableSkeleton\";\nimport { EmptyState } from \"./EmptyState\";\n\ninterface DataTableProps<TData> {\n table: ReturnType<typeof useReactTable<TData>>;\n /** Whether to show the border */\n withBorder?: boolean;\n /** Border radius */\n borderRadius?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n /** Icon when column is unsorted */\n SortIcon?: React.ElementType;\n /** Icon when column is sorted ascending */\n SortIconAsc?: React.ElementType;\n /** Icon when column is sorted descending */\n SortIconDesc?: React.ElementType;\n /** Icon when empty state */\n EmptyStateIcon?: React.ElementType;\n /** Title when empty state */\n EmptyStateTitle?: string;\n /** Description when empty state */\n EmptyStateDescription?: string;\n /** Whether to show the checkboxes */\n canCheck?: boolean;\n /** Column actions */\n columnActions?: (row: TData) => React.ReactNode;\n /** List menu actions */\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /** Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyle;\n /** Whether the table is loading (shows skeleton rows instead of data) */\n loading?: boolean;\n /** Number of skeleton rows to show when loading */\n skeletonRowCount?: number;\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void;\n /** Called when a row is hovered */\n onRowHover?: (row: TData) => void;\n /** Empty state to display when no data is available */\n emptyState?: React.ReactNode;\n /** Height of the table */\n tableHeight?: number;\n}\n\nexport const SimpleDataTable = <TData,>({\n tableHeight = 600,\n table,\n withBorder,\n borderRadius = \"md\",\n SortIcon = ArrowUpDown,\n SortIconAsc = ArrowUp,\n SortIconDesc = ArrowDown,\n canCheck = false,\n columnActions,\n listMenuActions,\n headerBgColor,\n loading = false,\n skeletonRowCount = 10,\n onRowClick,\n onRowHover,\n emptyState = (\n <EmptyState\n title=\"No data found\"\n description=\"No data found\"\n icon={<FileX size={32} color=\"var(--mantine-color-gray-6)\" />}\n />\n ),\n}: DataTableProps<TData>) => {\n const dataColumnsCount = table.getAllLeafColumns().length;\n const hasActionsColumn = !!(columnActions || listMenuActions);\n const headerBg =\n typeof headerBgColor === \"string\"\n ? headerBgColor\n : headerBgColor?.bgColor ?? defaultHeaderBgColor;\n\n return (\n <Paper withBorder={withBorder} radius={borderRadius}>\n <ScrollArea h={tableHeight} type=\"scroll\" scrollbarSize={8}>\n <Table\n style={{ width: \"100%\", tableLayout: \"fixed\" }}\n styles={{\n thead: {\n position: \"sticky\",\n top: 0,\n zIndex: 1,\n background: headerBg,\n boxShadow: \"0 1px 0 0 light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4))\",\n },\n }}\n >\n <TableHeader\n canCheck={canCheck}\n table={table}\n SortIcon={SortIcon}\n SortIconAsc={SortIconAsc}\n SortIconDesc={SortIconDesc}\n hasActionsColumn={hasActionsColumn}\n headerBgColor={headerBgColor}\n />\n {loading ? (\n <TableSkeleton\n rowCount={skeletonRowCount}\n columnCount={dataColumnsCount}\n canCheck={canCheck}\n hasActionsColumn={hasActionsColumn}\n />\n ) : table.getRowCount() > 0 ? (\n <TableBody\n onRowClick={onRowClick}\n onRowHover={onRowHover}\n table={table}\n canCheck={canCheck}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n />\n ) : (\n <Table.Tbody>\n <Table.Tr>\n <Table.Td\n colSpan={\n (table.getHeaderGroups()[0]?.headers.length ?? 1) +\n (canCheck ? 1 : 0)\n }\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n style={{ minHeight: 200 }}\n >\n {emptyState}\n </Flex>\n </Table.Td>\n </Table.Tr>\n </Table.Tbody>\n )}\n </Table>\n </ScrollArea>\n </Paper>\n );\n};\n","import { ActionIcon, TextInput } from \"@mantine/core\";\nimport { Search, X } from \"lucide-react\";\nimport { barBorder, barTextActive, barSurface } from \"../../theme/constants\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n onClear?: () => void;\n IconSearch?: React.ElementType;\n IconX?: React.ElementType;\n}\n\nexport const SearchInput = ({\n value,\n onChange,\n placeholder = \"Buscar...\",\n onClear,\n IconSearch = Search,\n IconX = X,\n}: SearchInputProps) => {\n return (\n <TextInput\n w={200}\n size=\"sm\"\n radius=\"lg\"\n value={value}\n onChange={(event) => onChange(event.currentTarget.value)}\n placeholder={placeholder}\n leftSection={\n IconSearch ? (\n <IconSearch\n size={16}\n style={{\n color: \"var(--mantine-color-gray-6)\",\n strokeWidth: 2,\n }}\n />\n ) : undefined\n }\n rightSection={\n value && IconX ? (\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n radius=\"lg\"\n onClick={() => {\n onChange(\"\");\n onClear?.();\n }}\n style={{\n transition: \"all 0.2s ease\",\n }}\n >\n <IconX size={16} />\n </ActionIcon>\n ) : undefined\n }\n styles={{\n input: {\n border: `1px solid ${barBorder}`,\n color: barTextActive,\n backgroundColor: barSurface,\n fontSize: \"14px\",\n fontWeight: 500,\n transition: \"all 0.2s ease\",\n \"&:focus\": {\n borderColor: \"var(--mantine-color-blue-5)\",\n backgroundColor: \"var(--mantine-color-default)\",\n boxShadow: \"0 0 0 3px var(--mantine-color-blue-1)\",\n },\n \"&::placeholder\": {\n color: \"var(--mantine-color-gray-5)\",\n fontWeight: 400,\n },\n },\n }}\n />\n );\n};\n","import { ActionIcon, Button, Menu, ScrollArea, TextInput } from \"@mantine/core\";\nimport type { IFilterSelectOption } from \"../../interfaces/filters.interface\";\nimport { barBorder, barSurface, barTextActive } from \"../../theme/constants\";\nimport {\n Check,\n ChevronDown,\n ChevronUp,\n ListFilter,\n Search,\n X,\n} from \"lucide-react\";\nimport { useRef, useMemo, useState } from \"react\";\n\nexport interface FilterSelectProps {\n /** Column id to filter */\n columnId: string;\n /** Select options (value, label pairs). Import FilterSelectOption from interfaces/filters */\n options: IFilterSelectOption[];\n /** Current filter value */\n onChange: (columnId: string, value: string | null) => void;\n /** Placeholder when no selection */\n placeholder?: string;\n /** Icon to show in the button */\n Icon?: React.ElementType;\n /** Enable search input inside dropdown */\n searchable?: boolean;\n}\n\nexport const FilterSelect = ({\n columnId,\n options,\n onChange,\n placeholder = \"Todos\",\n Icon = ListFilter,\n searchable = false,\n}: FilterSelectProps) => {\n const [open, setOpen] = useState<boolean>(false);\n const [selectedOption, setSelectedOption] =\n useState<IFilterSelectOption | null>(null);\n const [search, setSearch] = useState(\"\");\n const searchRef = useRef<HTMLInputElement>(null);\n\n const filteredOptions = useMemo(\n () =>\n searchable && search\n ? options.filter((o) =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n )\n : options,\n [options, search, searchable],\n );\n\n const handleClear = () => {\n setSelectedOption(null);\n onChange(columnId, null);\n };\n\n const handleSelect = (option: IFilterSelectOption) => {\n if (selectedOption?.value === option.value) {\n setSelectedOption(null);\n onChange(columnId, null);\n } else {\n setSelectedOption(option);\n onChange(columnId, option.value);\n }\n };\n\n return (\n <Menu\n opened={open}\n onChange={(opened) => {\n setOpen(opened);\n if (!opened) {\n setSearch(\"\");\n }\n }}\n onOpen={() => {\n setTimeout(() => searchRef.current?.focus(), 50);\n }}\n styles={{\n dropdown: {\n minWidth: 180,\n },\n }}\n >\n <Menu.Target>\n <Button\n radius=\"md\"\n variant=\"filled\"\n leftSection={Icon ? <Icon size={15} /> : null}\n rightSection={\n selectedOption ? (\n <ActionIcon\n component=\"div\"\n variant=\"subtle\"\n radius=\"md\"\n onClick={(event) => {\n event.stopPropagation();\n handleClear();\n }}\n >\n <X size={12} />\n </ActionIcon>\n ) : open ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )\n }\n size=\"sm\"\n styles={{\n root: {\n border: `1px solid ${barBorder}`,\n backgroundColor: barSurface,\n color: barTextActive,\n fontWeight: 400,\n fontSize: \"0.8125rem\",\n },\n }}\n >\n {selectedOption ? selectedOption.label : placeholder}\n </Button>\n </Menu.Target>\n <Menu.Dropdown style={{ boxShadow: \"0 0 10px 0 rgba(0, 0, 0, 0.1)\", borderRadius: \"8px\" }}>\n {searchable && (\n <TextInput\n ref={searchRef}\n variant=\"unstyled\"\n placeholder=\"Buscar...\"\n leftSection={<Search size={14} />}\n value={search}\n onChange={(e) => setSearch(e.currentTarget.value)}\n />\n )}\n <ScrollArea mah={240} scrollbars=\"y\" type=\"always\">\n {filteredOptions.map((option) => (\n <Menu.Item\n leftSection={\n selectedOption?.value === option.value ? (\n <Check size={12} />\n ) : null\n }\n key={option.value}\n onClick={() => {\n handleSelect(option);\n }}\n >\n {option.label}\n </Menu.Item>\n ))}\n </ScrollArea>\n {searchable && filteredOptions.length === 0 && (\n <Menu.Item disabled>Sin resultados</Menu.Item>\n )}\n </Menu.Dropdown>\n </Menu>\n );\n};\n","import { useState } from \"react\";\nimport type { Row } from \"@tanstack/react-table\";\n\n/**\n * TanStack Table filterFn for date columns.\n * Keeps rows where the cell value (YYYY-MM-DD) is >= the selected date.\n * Usage: add `filterFn: dateGteFilterFn` to the column definition.\n */\nexport const dateGteFilterFn = <TData,>(\n row: Row<TData>,\n columnId: string,\n filterValue: string,\n): boolean => {\n const cellValue = row.getValue<string>(columnId);\n if (!filterValue || !cellValue) return true;\n return cellValue >= filterValue;\n};\nimport { ActionIcon, Button, Popover } from \"@mantine/core\";\nimport { DatePicker } from \"@mantine/dates\";\nimport type { DateValue } from \"@mantine/dates\";\nimport { CalendarDays, ChevronDown, ChevronUp, X } from \"lucide-react\";\nimport { barBorder, barSurface, barTextActive } from \"../../theme/constants\";\n\nexport interface FilterDateProps {\n /** Column id to filter */\n columnId: string;\n /** Current filter value (ISO date string or null) */\n value: string | null;\n /** Called when filter changes */\n onChange: (columnId: string, value: string | null) => void;\n /** Placeholder when no date selected */\n placeholder?: string;\n}\n\nconst toLocalIso = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst fromIso = (iso: string): Date => {\n const parts = iso.split(\"-\").map(Number);\n return new Date(parts[0]!, parts[1]! - 1, parts[2]!);\n};\n\nconst formatDisplay = (iso: string): string => {\n const d = fromIso(iso);\n return d.toLocaleDateString(\"es-MX\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n};\n\nexport const FilterDate = ({\n columnId,\n value,\n onChange,\n placeholder = \"Seleccionar fecha\",\n}: FilterDateProps) => {\n const [open, setOpen] = useState(false);\n\n const dateValue = value ? fromIso(value) : null;\n\n const handleChange = (date: DateValue) => {\n if (!date) {\n onChange(columnId, null);\n return;\n }\n const d = date instanceof Date ? date : new Date(date);\n onChange(columnId, toLocalIso(d));\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(columnId, null);\n };\n\n const buttonLabel = value ? formatDisplay(value) : placeholder;\n\n return (\n <Popover\n opened={open}\n onChange={setOpen}\n position=\"bottom-start\"\n withinPortal={false}\n >\n <Popover.Target>\n <Button\n radius=\"md\"\n variant=\"filled\"\n leftSection={<CalendarDays size={14} />}\n rightSection={\n value ? (\n <ActionIcon\n component=\"div\"\n radius=\"md\"\n variant=\"subtle\"\n onClick={(event) => handleClear(event)}\n >\n <X size={12} />\n </ActionIcon>\n ) : open ? (\n <ChevronUp size={12} />\n ) : (\n <ChevronDown size={12} />\n )\n }\n size=\"sm\"\n onClick={() => setOpen((o) => !o)}\n styles={{\n root: {\n border: `1px solid ${barBorder}`,\n backgroundColor: barSurface,\n color: barTextActive,\n fontWeight: 400,\n fontSize: \"0.8125rem\",\n },\n }}\n >\n {buttonLabel}\n </Button>\n </Popover.Target>\n\n <Popover.Dropdown p=\"xs\">\n <DatePicker value={dateValue} onChange={handleChange} size=\"sm\" />\n </Popover.Dropdown>\n </Popover>\n );\n};\n","import { useEffect } from \"react\";\nimport type { ColumnDef, useReactTable } from \"@tanstack/react-table\";\nimport { useDataTable } from \"../../hooks/useDataTable\";\nimport { SimpleDataTable } from \"./SimpleDataTable\";\nimport { Flex, Group, Paper } from \"@mantine/core\";\nimport { SearchInput } from \"./SearchInput\";\nimport { FilterSelect } from \"./FilterSelect\";\nimport { FilterDate } from \"./FilterDate\";\nimport { BottomPagination } from \"./BottomPagination\";\nimport type {\n DataTableConfig,\n ITableFilterConfig,\n ServerTableState,\n TableHeaderStyle,\n} from \"../../interfaces\";\n\ninterface DataTableProps<TData> {\n /** Data to display in the table (current page, already paginated by server) */\n data: TData[];\n /** Columns to display in the table */\n columns: ColumnDef<TData>[];\n /** Configuration for the table */\n config?: Partial<DataTableConfig>;\n /** Dynamic filters (selects, dates, etc.) */\n filters?: ITableFilterConfig[];\n /** Total row count from server (used for pagination) */\n totalRowCount?: number;\n /** Called when table state changes (page, search, filters, sort). Use to call your API. */\n onStateChange?: (state: ServerTableState) => void;\n /** Whether the table is loading (shows skeleton) */\n loading?: boolean;\n /** Whether to enable row selection */\n enableRowCheck?: boolean;\n /** Called when row selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? } */\n headerBgColor?: string | TableHeaderStyle;\n /** Column actions to display per row */\n columnActions?: (row: TData) => React.ReactNode;\n /** List menu actions to display per row */\n listMenuActions?: (\n row: TData,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void;\n /** Called when a row is hovered */\n onRowHover?: (row: TData) => void;\n /** Empty state to display when no data is available */\n emptyState?: React.ReactNode;\n /** Table instance */\n table?: ReturnType<typeof useReactTable<TData>>;\n /** Custom Header component */\n CustomHeader?: React.ReactNode;\n /** Whether to show the search input */\n showSearchInput?: boolean;\n /** Whether to show the bottom pagination */\n showBottomPagination?: boolean;\n /** Height of the table */\n tableHeight?: number;\n}\n\nexport const DataTable = <TData,>({\n showSearchInput = true,\n showBottomPagination = true,\n data,\n columns,\n config,\n filters,\n totalRowCount,\n onStateChange,\n loading = false,\n enableRowCheck: canCheck = false,\n onSelectionChange,\n headerBgColor,\n columnActions,\n listMenuActions,\n onRowClick,\n onRowHover,\n emptyState,\n table: ExternalTable,\n CustomHeader,\n tableHeight = 600,\n}: DataTableProps<TData>) => {\n const {\n table: internalTable,\n globalFilter,\n setGlobalFilter,\n columnFilters,\n setColumnFilter,\n config: mergedConfig,\n selectedRows,\n } = useDataTable({\n data,\n columns,\n config,\n enableRowSelection: canCheck,\n totalRowCount,\n onStateChange,\n });\n\n const table = ExternalTable ?? internalTable;\n\n useEffect(() => {\n if (canCheck && onSelectionChange) {\n onSelectionChange(selectedRows);\n }\n }, [canCheck, onSelectionChange, selectedRows]);\n\n const getFilterValue = (columnId: string) =>\n (columnFilters.find((f) => f.id === columnId)?.value as string | null) ??\n null;\n\n return (\n <Flex direction=\"column\" gap=\"md\">\n <Flex justify=\"space-between\" align=\"center\">\n <Group gap=\"md\" wrap=\"wrap\">\n {showSearchInput && mergedConfig.enableGlobalFilter && (\n <SearchInput\n value={globalFilter}\n onChange={setGlobalFilter}\n placeholder={mergedConfig.searchPlaceholder}\n />\n )}\n {filters?.map((f) =>\n f.type === \"date\" ? (\n <FilterDate\n key={f.columnId}\n columnId={f.columnId}\n value={getFilterValue(f.columnId)}\n onChange={setColumnFilter}\n placeholder={f.placeholder}\n />\n ) : (\n <FilterSelect\n key={f.columnId}\n columnId={f.columnId}\n options={f.options ?? []}\n onChange={setColumnFilter}\n placeholder={f.placeholder ?? \"Todos\"}\n searchable={f.searchable}\n />\n ),\n )}\n </Group>\n {CustomHeader}\n </Flex>\n <Paper withBorder radius=\"md\" style={{ overflow: \"hidden\" }}>\n <SimpleDataTable\n tableHeight={tableHeight}\n onRowClick={onRowClick}\n onRowHover={onRowHover}\n table={table}\n canCheck={canCheck}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n headerBgColor={headerBgColor}\n loading={loading}\n skeletonRowCount={mergedConfig.defaultPageSize}\n emptyState={emptyState}\n />\n {showBottomPagination && (\n <BottomPagination\n total={totalRowCount ?? 0}\n pageSize={table.getState().pagination.pageSize}\n pageIndex={table.getState().pagination.pageIndex}\n onPageSizeChange={(value) => table.setPageSize(value)}\n onPageIndexChange={(value) =>\n table.setPagination({\n pageIndex: value,\n pageSize: table.getState().pagination.pageSize,\n })\n }\n />\n )}\n </Paper>\n </Flex>\n );\n};\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { DataTable } from \"./table/DataTable\";\nimport type { ColumnDef, useReactTable } from \"@tanstack/react-table\";\nimport type { ITableFilterConfig } from \"../interfaces/filters.interface\";\nimport type {\n DataTableConfig,\n ServerTableState,\n TableHeaderStyle,\n} from \"../interfaces/datatable.interface\";\nimport type { TableQueryParams } from \"../queries/types\";\nimport { useState, useCallback } from \"react\";\nimport { Flex, Title } from \"@mantine/core\";\n\n/** Shape that the query must return for TablePage to work correctly. */\nexport interface PaginatedResponse<TRow> {\n data: TRow[];\n total: number;\n}\n\ninterface TablePageProps<TRow> {\n /**\n * Factory that receives the current pagination/filter params and returns\n * the query options. Called every time the table state changes.\n */\n getQueryOptions: (\n params: TableQueryParams,\n ) => UseQueryOptions<PaginatedResponse<TRow>>;\n /**\n * Title of the table\n */\n title?: string;\n\n /**\n * Columns of the table\n */\n columns: ColumnDef<TRow>[];\n /**\n * Filters of the table\n */\n filters?: ITableFilterConfig[];\n /**\n * Whether the table is loading externally\n */\n isLoadingExternal?: boolean;\n /**\n * Called when a row is clicked\n */\n onRowClick?: (row: TRow) => void;\n /**\n * Called when a row is hovered\n */\n onRowHover?: (row: TRow) => void;\n /**\n * Empty state of the table\n */\n emptyState?: React.ReactNode;\n /**\n * Table instance\n */\n table?: ReturnType<typeof useReactTable<TRow>>;\n /**\n * Whether to enable row selection\n */\n enableRowSelection?: boolean;\n /**\n * Header style: color string (legacy) or { bgColor, textColor, fontWeight?, fontSize?, padding? }\n */\n headerBgColor?: TableHeaderStyle;\n /**\n * Column actions to display per row\n */\n columnActions?: (row: TRow) => React.ReactNode;\n /**\n * List menu actions to display per row\n */\n listMenuActions?: (\n row: TRow,\n ) => { label: string; onClick: () => void; Icon?: React.ElementType }[];\n /**\n * Called when row selection changes\n */\n onSelectionChange?: (selectedRows: TRow[]) => void;\n /**\n * Configuration for the table\n */\n config?: Partial<DataTableConfig>;\n /**\n * Custom Header component\n */\n CustomHeader?: React.ReactNode;\n /**\n * Whether to show the search input\n */\n showSearchInput?: boolean;\n /**\n * Whether to show the bottom pagination\n */\n showBottomPagination?: boolean;\n /**\n * Height of the table\n */\n tableHeight?: number;\n}\n\nexport const TablePage = <TRow,>({\n getQueryOptions,\n title,\n columns,\n filters,\n isLoadingExternal,\n onRowClick,\n onRowHover,\n emptyState,\n table,\n enableRowSelection,\n headerBgColor,\n columnActions,\n listMenuActions,\n onSelectionChange,\n config,\n CustomHeader,\n showSearchInput = true,\n showBottomPagination = true,\n tableHeight = 600,\n}: TablePageProps<TRow>) => {\n const [tableParams, setTableParams] = useState<TableQueryParams>({\n skip: 0,\n limit: 10,\n query: undefined,\n });\n\n const handleStateChange = useCallback((state: ServerTableState) => {\n setTableParams({\n skip: state.pageIndex * state.pageSize,\n limit: state.pageSize,\n query: state.globalFilter || undefined,\n columnFilters:\n state.columnFilters.length > 0 ? state.columnFilters : undefined,\n });\n }, []);\n\n const { data, isLoading } = useQuery(getQueryOptions(tableParams));\n\n return (\n <Flex direction=\"column\" gap=\"sm\">\n {title && <Title order={1}>{title}</Title>}\n <DataTable<TRow>\n showBottomPagination={showBottomPagination}\n tableHeight={tableHeight}\n emptyState={emptyState}\n showSearchInput={showSearchInput}\n table={table}\n onRowClick={(row) => onRowClick?.(row)}\n onRowHover={(row) => onRowHover?.(row)}\n totalRowCount={data?.total}\n data={data?.data ?? []}\n loading={isLoading || isLoadingExternal}\n columns={columns}\n filters={filters}\n onStateChange={handleStateChange}\n enableRowCheck={enableRowSelection}\n headerBgColor={headerBgColor}\n columnActions={columnActions}\n listMenuActions={listMenuActions}\n onSelectionChange={onSelectionChange}\n config={config}\n CustomHeader={CustomHeader}\n />\n </Flex>\n );\n};\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport { Button, Card, Container, Flex, Paper, Title } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport type { IField, IButton } from \"../interfaces/form.interface\";\nimport { FormGenerator, type FormInstance } from \"./form/FormGenerator\";\n\ninterface FormPagePropsBase<TData, TVariables = unknown> {\n fields: IField[];\n buttons: IButton[];\n mutationOptions: UseMutationOptions<TData, Error, TVariables>;\n typeOfForm: \"create\" | \"edit\";\n dataKey: string;\n loading: boolean;\n cardWidth?: number | string;\n onSuccess?: (data: TData) => void;\n setData?: (data: TData) => void;\n navigateAway?: boolean;\n showBackButton?: boolean;\n /**\n * Callback when the user clicks \"Regresar\". Provide your router's go-back logic here.\n * @example React Router: () => navigate(-1)\n * @example TanStack Router: () => router.history.back()\n * @example TanStack Start: () => navigate({ to: '..' })\n */\n onGoBack?: () => void;\n /**\n * Optional icon for the back button. Pass your own icon component so the lib stays router/UI-agnostic.\n * @example <ArrowLeft /> from lucide-react\n */\n backButtonIcon?: ReactNode;\n onFormRef?: (form: FormInstance) => void;\n}\n\ninterface FormPagePropsWithFiles<TData, TVariables = unknown>\n extends FormPagePropsBase<TData, TVariables> {\n hasFiles: true;\n buildVariables?: (values: FormData) => TVariables;\n}\n\ninterface FormPagePropsWithoutFiles<TData, TVariables = unknown>\n extends FormPagePropsBase<TData, TVariables> {\n hasFiles?: false;\n buildVariables?: (values: Record<string, unknown>) => TVariables;\n}\n\ntype FormPageProps<TData, TVariables = unknown> =\n | FormPagePropsWithFiles<TData, TVariables>\n | FormPagePropsWithoutFiles<TData, TVariables>;\n\nexport const FormPage = <TData, TVariables = unknown>({\n fields,\n buttons,\n mutationOptions,\n buildVariables,\n typeOfForm,\n dataKey,\n loading,\n cardWidth,\n hasFiles,\n onSuccess,\n setData,\n navigateAway = true,\n showBackButton = true,\n onGoBack,\n backButtonIcon,\n onFormRef,\n}: FormPageProps<TData, TVariables>): React.ReactNode => {\n const showBack = showBackButton && onGoBack != null;\n\n const mutation = useMutation(mutationOptions);\n\n return (\n <>\n {showBack && (\n <Flex justify={\"start\"}>\n <Button\n leftSection={backButtonIcon}\n variant=\"transparent\"\n mx={20}\n mt={10}\n onClick={onGoBack}\n >\n Regresar a {dataKey}\n </Button>\n </Flex>\n )}\n <Flex justify={\"center\"} align={\"center\"} w={\"100%\"}>\n <Paper w={cardWidth ?? 500} my={-10}>\n <Flex direction={\"column\"}>\n <Title order={1} my={10}>\n {typeOfForm === \"create\" ? \"Crear\" : \"Editar\"} {dataKey}\n </Title>\n <Card withBorder>\n <FormGenerator<TData, TVariables>\n typeOfForm={typeOfForm}\n name={dataKey}\n loading={loading}\n fields={fields}\n buttons={buttons}\n mutation={mutation}\n buildVariables={\n buildVariables as\n | ((\n values: Record<string, unknown> | FormData,\n ) => TVariables)\n | undefined\n }\n hasFiles={hasFiles}\n onSuccess={onSuccess}\n setData={setData}\n navigateAway={navigateAway}\n onFormRef={onFormRef}\n />\n </Card>\n </Flex>\n </Paper>\n </Flex>\n </>\n );\n};\n"]}