Add supplier and imporve inventory frontend
This commit is contained in:
166
frontend/src/utils/enumHelpers.ts
Normal file
166
frontend/src/utils/enumHelpers.ts
Normal file
@@ -0,0 +1,166 @@
|
||||
// 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<T extends Record<string, string | number>>(
|
||||
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<T>(
|
||||
enumObject: Record<string, T>,
|
||||
value: string | number
|
||||
): T | undefined {
|
||||
return Object.values(enumObject).find(enumValue => enumValue === value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility to validate enum value
|
||||
*/
|
||||
export function isValidEnumValue<T>(
|
||||
enumObject: Record<string, T>,
|
||||
value: unknown
|
||||
): value is T {
|
||||
return Object.values(enumObject).includes(value as T);
|
||||
}
|
||||
Reference in New Issue
Block a user