// frontend/src/utils/enumHelpers.ts /** * Utilities for working with enums and translations */ import { useTranslation } from 'react-i18next'; import type { SelectOption } from '../components/ui/Select'; import { SupplierType, SupplierStatus, PaymentTerms, PurchaseOrderStatus, DeliveryStatus, QualityRating, DeliveryRating, InvoiceStatus, type EnumOption } from '../api/types/suppliers'; /** * Generic function to convert enum to select options with i18n translations */ export function enumToSelectOptions>( enumObject: T, translationKey: string, t: (key: string) => string, options?: { includeDescription?: boolean; descriptionKey?: string; sortAlphabetically?: boolean; } ): SelectOption[] { const selectOptions = Object.entries(enumObject).map(([key, value]) => ({ value, label: t(`${translationKey}.${value}`), ...(options?.includeDescription && options?.descriptionKey && { description: t(`${options.descriptionKey}.${value}`) }) })); if (options?.sortAlphabetically) { selectOptions.sort((a, b) => a.label.localeCompare(b.label)); } return selectOptions; } /** * Hook for supplier enum utilities */ export function useSupplierEnums() { const { t } = useTranslation('suppliers'); return { // Supplier Type getSupplierTypeOptions: (): SelectOption[] => enumToSelectOptions(SupplierType, 'types', t, { includeDescription: true, descriptionKey: 'descriptions' }), getSupplierTypeLabel: (type: SupplierType): string => { if (!type) return 'Tipo no definido'; return t(`types.${type}`); }, // Supplier Status getSupplierStatusOptions: (): SelectOption[] => enumToSelectOptions(SupplierStatus, 'status', t), getSupplierStatusLabel: (status: SupplierStatus): string => { if (!status) return 'Estado no definido'; return t(`status.${status}`); }, // Payment Terms getPaymentTermsOptions: (): SelectOption[] => enumToSelectOptions(PaymentTerms, 'payment_terms', t, { includeDescription: true, descriptionKey: 'descriptions' }), getPaymentTermsLabel: (terms: PaymentTerms): string => { if (!terms) return 'Sin términos definidos'; return t(`payment_terms.${terms}`); }, // Purchase Order Status getPurchaseOrderStatusOptions: (): SelectOption[] => enumToSelectOptions(PurchaseOrderStatus, 'purchase_order_status', t), getPurchaseOrderStatusLabel: (status: PurchaseOrderStatus): string => { if (!status) return 'Estado no definido'; return t(`purchase_order_status.${status}`); }, // Delivery Status getDeliveryStatusOptions: (): SelectOption[] => enumToSelectOptions(DeliveryStatus, 'delivery_status', t), getDeliveryStatusLabel: (status: DeliveryStatus): string => { if (!status) return 'Estado no definido'; return t(`delivery_status.${status}`); }, // Quality Rating getQualityRatingOptions: (): SelectOption[] => enumToSelectOptions(QualityRating, 'quality_rating', t, { includeDescription: true, descriptionKey: 'descriptions' }), getQualityRatingLabel: (rating: QualityRating): string => { if (rating === undefined || rating === null) return 'Sin calificación'; return t(`quality_rating.${rating}`); }, // Delivery Rating getDeliveryRatingOptions: (): SelectOption[] => enumToSelectOptions(DeliveryRating, 'delivery_rating', t, { includeDescription: true, descriptionKey: 'descriptions' }), getDeliveryRatingLabel: (rating: DeliveryRating): string => { if (rating === undefined || rating === null) return 'Sin calificación'; return t(`delivery_rating.${rating}`); }, // Invoice Status getInvoiceStatusOptions: (): SelectOption[] => enumToSelectOptions(InvoiceStatus, 'invoice_status', t), getInvoiceStatusLabel: (status: InvoiceStatus): string => { if (!status) return 'Estado no definido'; return t(`invoice_status.${status}`); }, // Field Labels getFieldLabel: (field: string): string => t(`labels.${field}`), getFieldDescription: (field: string): string => t(`descriptions.${field}`) }; } /** * Utility to get enum value from select option value */ export function getEnumFromValue( enumObject: Record, value: string | number ): T | undefined { return Object.values(enumObject).find(enumValue => enumValue === value); } /** * Utility to validate enum value */ export function isValidEnumValue( enumObject: Record, value: unknown ): value is T { return Object.values(enumObject).includes(value as T); }