ADD new frontend
This commit is contained in:
371
frontend/src/utils/constants.ts
Normal file
371
frontend/src/utils/constants.ts
Normal file
@@ -0,0 +1,371 @@
|
||||
/**
|
||||
* Application constants and configuration values
|
||||
*/
|
||||
|
||||
// Application metadata
|
||||
export const APP_INFO = {
|
||||
name: 'Bakery IA',
|
||||
version: '1.0.0',
|
||||
description: 'Sistema inteligente de gestión para panaderías',
|
||||
author: 'Bakery IA Team',
|
||||
support_email: 'support@bakeryia.com',
|
||||
website: 'https://bakeryia.com',
|
||||
} as const;
|
||||
|
||||
// API configuration
|
||||
export const API_CONFIG = {
|
||||
base_url: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api/v1',
|
||||
timeout: 30000,
|
||||
retry_attempts: 3,
|
||||
retry_delay: 1000,
|
||||
} as const;
|
||||
|
||||
// Authentication
|
||||
export const AUTH_CONFIG = {
|
||||
token_key: 'access_token',
|
||||
refresh_token_key: 'refresh_token',
|
||||
user_data_key: 'user_data',
|
||||
tenant_id_key: 'tenant_id',
|
||||
session_timeout: 24 * 60 * 60 * 1000, // 24 hours
|
||||
refresh_threshold: 5 * 60 * 1000, // 5 minutes before expiry
|
||||
} as const;
|
||||
|
||||
// Pagination defaults
|
||||
export const PAGINATION = {
|
||||
default_page_size: 20,
|
||||
max_page_size: 100,
|
||||
page_size_options: [10, 20, 50, 100],
|
||||
} as const;
|
||||
|
||||
// Date and time formats
|
||||
export const DATE_FORMATS = {
|
||||
display: 'dd/MM/yyyy',
|
||||
display_with_time: 'dd/MM/yyyy HH:mm',
|
||||
iso: 'yyyy-MM-dd',
|
||||
iso_with_time: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
||||
time_only: 'HH:mm',
|
||||
month_year: 'MM/yyyy',
|
||||
full_date: 'EEEE, dd MMMM yyyy',
|
||||
} as const;
|
||||
|
||||
// Spanish locale settings
|
||||
export const LOCALE_SETTINGS = {
|
||||
locale: 'es-ES',
|
||||
timezone: 'Europe/Madrid',
|
||||
currency: 'EUR',
|
||||
date_separator: '/',
|
||||
decimal_separator: ',',
|
||||
thousand_separator: '.',
|
||||
} as const;
|
||||
|
||||
// Business hours
|
||||
export const BUSINESS_HOURS = {
|
||||
default_open: '06:00',
|
||||
default_close: '20:00',
|
||||
days_of_week: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo'],
|
||||
work_days: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
|
||||
} as const;
|
||||
|
||||
// Units of measure
|
||||
export const UNITS_OF_MEASURE = {
|
||||
weight: {
|
||||
kg: { label: 'Kilogramo', symbol: 'kg', factor: 1000 },
|
||||
g: { label: 'Gramo', symbol: 'g', factor: 1 },
|
||||
lb: { label: 'Libra', symbol: 'lb', factor: 453.592 },
|
||||
oz: { label: 'Onza', symbol: 'oz', factor: 28.3495 },
|
||||
},
|
||||
volume: {
|
||||
l: { label: 'Litro', symbol: 'l', factor: 1000 },
|
||||
ml: { label: 'Mililitro', symbol: 'ml', factor: 1 },
|
||||
cup: { label: 'Taza', symbol: 'taza', factor: 240 },
|
||||
tbsp: { label: 'Cucharada', symbol: 'cda', factor: 15 },
|
||||
tsp: { label: 'Cucharadita', symbol: 'cdta', factor: 5 },
|
||||
},
|
||||
count: {
|
||||
piece: { label: 'Pieza', symbol: 'pz', factor: 1 },
|
||||
dozen: { label: 'Docena', symbol: 'doc', factor: 12 },
|
||||
package: { label: 'Paquete', symbol: 'paq', factor: 1 },
|
||||
bag: { label: 'Bolsa', symbol: 'bolsa', factor: 1 },
|
||||
box: { label: 'Caja', symbol: 'caja', factor: 1 },
|
||||
},
|
||||
} as const;
|
||||
|
||||
// Temperature units
|
||||
export const TEMPERATURE_UNITS = {
|
||||
celsius: { label: 'Celsius', symbol: '°C' },
|
||||
fahrenheit: { label: 'Fahrenheit', symbol: '°F' },
|
||||
} as const;
|
||||
|
||||
// Product categories
|
||||
export const PRODUCT_CATEGORIES = {
|
||||
bread: {
|
||||
label: 'Pan',
|
||||
subcategories: ['Pan blanco', 'Pan integral', 'Pan de centeno', 'Pan especial'],
|
||||
},
|
||||
pastries: {
|
||||
label: 'Bollería',
|
||||
subcategories: ['Croissants', 'Magdalenas', 'Donuts', 'Ensaimadas'],
|
||||
},
|
||||
cakes: {
|
||||
label: 'Tartas',
|
||||
subcategories: ['Tartas de cumpleaños', 'Tartas de boda', 'Cheesecakes', 'Tartas de frutas'],
|
||||
},
|
||||
cookies: {
|
||||
label: 'Galletas',
|
||||
subcategories: ['Galletas caseras', 'Galletas decoradas', 'Galletas integrales'],
|
||||
},
|
||||
seasonal: {
|
||||
label: 'Productos estacionales',
|
||||
subcategories: ['Roscón de Reyes', 'Torrijas', 'Polvorones', 'Turrones'],
|
||||
},
|
||||
} as const;
|
||||
|
||||
// Ingredient categories
|
||||
export const INGREDIENT_CATEGORIES = {
|
||||
flours: {
|
||||
label: 'Harinas',
|
||||
items: ['Harina de trigo', 'Harina integral', 'Harina de centeno', 'Harina de maíz'],
|
||||
},
|
||||
sugars: {
|
||||
label: 'Azúcares',
|
||||
items: ['Azúcar blanco', 'Azúcar moreno', 'Azúcar glass', 'Miel'],
|
||||
},
|
||||
fats: {
|
||||
label: 'Grasas',
|
||||
items: ['Mantequilla', 'Margarina', 'Aceite de oliva', 'Aceite de girasol'],
|
||||
},
|
||||
dairy: {
|
||||
label: 'Lácteos',
|
||||
items: ['Leche', 'Nata', 'Queso', 'Yogur'],
|
||||
},
|
||||
eggs: {
|
||||
label: 'Huevos',
|
||||
items: ['Huevos frescos', 'Clara de huevo', 'Yema de huevo'],
|
||||
},
|
||||
leavening: {
|
||||
label: 'Levaduras',
|
||||
items: ['Levadura fresca', 'Levadura seca', 'Levadura química', 'Bicarbonato'],
|
||||
},
|
||||
spices: {
|
||||
label: 'Especias',
|
||||
items: ['Canela', 'Vainilla', 'Anís', 'Cardamomo'],
|
||||
},
|
||||
additives: {
|
||||
label: 'Aditivos',
|
||||
items: ['Conservantes', 'Colorantes', 'Aromas', 'Mejorantes'],
|
||||
},
|
||||
} as const;
|
||||
|
||||
// Quality statuses
|
||||
export const QUALITY_STATUSES = [
|
||||
{ value: 'excellent', label: 'Excelente', color: '#22c55e' },
|
||||
{ value: 'good', label: 'Bueno', color: '#84cc16' },
|
||||
{ value: 'fair', label: 'Regular', color: '#eab308' },
|
||||
{ value: 'poor', label: 'Malo', color: '#f97316' },
|
||||
{ value: 'damaged', label: 'Dañado', color: '#ef4444' },
|
||||
{ value: 'expired', label: 'Caducado', color: '#dc2626' },
|
||||
{ value: 'quarantine', label: 'Cuarentena', color: '#8b5cf6' },
|
||||
] as const;
|
||||
|
||||
// Alert severities
|
||||
export const ALERT_SEVERITIES = [
|
||||
{ value: 'low', label: 'Baja', color: '#6b7280' },
|
||||
{ value: 'medium', label: 'Media', color: '#f59e0b' },
|
||||
{ value: 'high', label: 'Alta', color: '#f97316' },
|
||||
{ value: 'critical', label: 'Crítica', color: '#dc2626' },
|
||||
] as const;
|
||||
|
||||
// Order statuses
|
||||
export const ORDER_STATUSES = [
|
||||
{ value: 'pending', label: 'Pendiente', color: '#6b7280' },
|
||||
{ value: 'confirmed', label: 'Confirmado', color: '#3b82f6' },
|
||||
{ value: 'in_preparation', label: 'En preparación', color: '#f59e0b' },
|
||||
{ value: 'ready', label: 'Listo', color: '#10b981' },
|
||||
{ value: 'delivered', label: 'Entregado', color: '#22c55e' },
|
||||
{ value: 'cancelled', label: 'Cancelado', color: '#ef4444' },
|
||||
] as const;
|
||||
|
||||
// Production statuses
|
||||
export const PRODUCTION_STATUSES = [
|
||||
{ value: 'planned', label: 'Planificado', color: '#6b7280' },
|
||||
{ value: 'ready_to_start', label: 'Listo para iniciar', color: '#3b82f6' },
|
||||
{ value: 'in_progress', label: 'En progreso', color: '#f59e0b' },
|
||||
{ value: 'quality_check', label: 'Control de calidad', color: '#8b5cf6' },
|
||||
{ value: 'completed', label: 'Completado', color: '#22c55e' },
|
||||
{ value: 'cancelled', label: 'Cancelado', color: '#ef4444' },
|
||||
{ value: 'on_hold', label: 'En pausa', color: '#f97316' },
|
||||
{ value: 'failed', label: 'Fallido', color: '#dc2626' },
|
||||
] as const;
|
||||
|
||||
// Payment methods
|
||||
export const PAYMENT_METHODS = [
|
||||
{ value: 'cash', label: 'Efectivo', icon: '💵' },
|
||||
{ value: 'card', label: 'Tarjeta', icon: '💳' },
|
||||
{ value: 'digital_wallet', label: 'Wallet digital', icon: '📱' },
|
||||
{ value: 'bank_transfer', label: 'Transferencia', icon: '🏦' },
|
||||
{ value: 'check', label: 'Cheque', icon: '📝' },
|
||||
{ value: 'store_credit', label: 'Crédito tienda', icon: '🎫' },
|
||||
] as const;
|
||||
|
||||
// Weather conditions
|
||||
export const WEATHER_CONDITIONS = [
|
||||
{ value: 'sunny', label: 'Soleado', icon: '☀️', impact: 'positive' },
|
||||
{ value: 'cloudy', label: 'Nublado', icon: '☁️', impact: 'neutral' },
|
||||
{ value: 'rainy', label: 'Lluvioso', icon: '🌧️', impact: 'negative' },
|
||||
{ value: 'stormy', label: 'Tormentoso', icon: '⛈️', impact: 'negative' },
|
||||
{ value: 'snowy', label: 'Nevado', icon: '❄️', impact: 'negative' },
|
||||
{ value: 'foggy', label: 'Con niebla', icon: '🌫️', impact: 'negative' },
|
||||
{ value: 'windy', label: 'Ventoso', icon: '💨', impact: 'neutral' },
|
||||
] as const;
|
||||
|
||||
// File upload limits
|
||||
export const FILE_UPLOAD = {
|
||||
max_size: 10 * 1024 * 1024, // 10MB
|
||||
allowed_types: {
|
||||
images: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
|
||||
documents: ['application/pdf', 'text/csv', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
|
||||
all: ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'application/pdf', 'text/csv', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
|
||||
},
|
||||
max_files: 5,
|
||||
} as const;
|
||||
|
||||
// Notification settings
|
||||
export const NOTIFICATION_SETTINGS = {
|
||||
default_duration: 5000,
|
||||
max_notifications: 10,
|
||||
positions: ['top-right', 'top-left', 'bottom-right', 'bottom-left'],
|
||||
types: ['success', 'error', 'warning', 'info'],
|
||||
} as const;
|
||||
|
||||
// Chart colors
|
||||
export const CHART_COLORS = {
|
||||
primary: ['#3b82f6', '#1d4ed8', '#1e40af', '#1e3a8a'],
|
||||
success: ['#22c55e', '#16a34a', '#15803d', '#166534'],
|
||||
warning: ['#f59e0b', '#d97706', '#b45309', '#92400e'],
|
||||
error: ['#ef4444', '#dc2626', '#b91c1c', '#991b1b'],
|
||||
neutral: ['#6b7280', '#4b5563', '#374151', '#1f2937'],
|
||||
rainbow: [
|
||||
'#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6',
|
||||
'#06b6d4', '#84cc16', '#f97316', '#ec4899', '#6366f1',
|
||||
],
|
||||
} as const;
|
||||
|
||||
// Breakpoints for responsive design
|
||||
export const BREAKPOINTS = {
|
||||
xs: '320px',
|
||||
sm: '640px',
|
||||
md: '768px',
|
||||
lg: '1024px',
|
||||
xl: '1280px',
|
||||
'2xl': '1536px',
|
||||
} as const;
|
||||
|
||||
// Z-index layers
|
||||
export const Z_INDEX = {
|
||||
base: 0,
|
||||
dropdown: 10,
|
||||
sticky: 20,
|
||||
fixed: 30,
|
||||
overlay: 40,
|
||||
modal: 50,
|
||||
popover: 60,
|
||||
tooltip: 70,
|
||||
toast: 80,
|
||||
loading: 90,
|
||||
maximum: 100,
|
||||
} as const;
|
||||
|
||||
// Animation durations
|
||||
export const ANIMATION_DURATION = {
|
||||
fast: '150ms',
|
||||
normal: '250ms',
|
||||
slow: '350ms',
|
||||
} as const;
|
||||
|
||||
// Border radius values
|
||||
export const BORDER_RADIUS = {
|
||||
none: '0',
|
||||
sm: '0.25rem',
|
||||
base: '0.375rem',
|
||||
md: '0.5rem',
|
||||
lg: '0.75rem',
|
||||
xl: '1rem',
|
||||
full: '9999px',
|
||||
} as const;
|
||||
|
||||
// Shadow values
|
||||
export const SHADOWS = {
|
||||
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
|
||||
base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
|
||||
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
|
||||
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
|
||||
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
||||
} as const;
|
||||
|
||||
// Local storage keys
|
||||
export const STORAGE_KEYS = {
|
||||
theme: 'app_theme',
|
||||
language: 'app_language',
|
||||
sidebar_collapsed: 'sidebar_collapsed',
|
||||
user_preferences: 'user_preferences',
|
||||
recent_searches: 'recent_searches',
|
||||
draft_forms: 'draft_forms',
|
||||
tutorial_completed: 'tutorial_completed',
|
||||
} as const;
|
||||
|
||||
// Regular expressions
|
||||
export const REGEX_PATTERNS = {
|
||||
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
||||
phone_spain: /^[6789]\d{8}$/,
|
||||
postal_code_spain: /^[0-5]\d{4}$/,
|
||||
alphanumeric: /^[a-zA-Z0-9]+$/,
|
||||
numbers_only: /^\d+$/,
|
||||
letters_only: /^[a-zA-ZáéíóúüñÁÉÍÓÚÜÑ\s]+$/,
|
||||
strong_password: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
|
||||
url: /^https?:\/\/([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/,
|
||||
slug: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
|
||||
hex_color: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
|
||||
} as const;
|
||||
|
||||
// Error codes
|
||||
export const ERROR_CODES = {
|
||||
NETWORK_ERROR: 'NETWORK_ERROR',
|
||||
AUTHENTICATION_FAILED: 'AUTH_001',
|
||||
UNAUTHORIZED: 'AUTH_002',
|
||||
FORBIDDEN: 'AUTH_003',
|
||||
VALIDATION_ERROR: 'VAL_001',
|
||||
NOT_FOUND: 'NOT_FOUND',
|
||||
SERVER_ERROR: 'SERVER_ERROR',
|
||||
RATE_LIMITED: 'RATE_LIMITED',
|
||||
MAINTENANCE_MODE: 'MAINTENANCE',
|
||||
} as const;
|
||||
|
||||
// Success messages
|
||||
export const SUCCESS_MESSAGES = {
|
||||
SAVED: 'Guardado correctamente',
|
||||
CREATED: 'Creado correctamente',
|
||||
UPDATED: 'Actualizado correctamente',
|
||||
DELETED: 'Eliminado correctamente',
|
||||
SENT: 'Enviado correctamente',
|
||||
IMPORTED: 'Importado correctamente',
|
||||
EXPORTED: 'Exportado correctamente',
|
||||
LOGGED_IN: 'Sesión iniciada',
|
||||
LOGGED_OUT: 'Sesión cerrada',
|
||||
} as const;
|
||||
|
||||
// Error messages
|
||||
export const ERROR_MESSAGES = {
|
||||
REQUIRED_FIELD: 'Este campo es obligatorio',
|
||||
INVALID_EMAIL: 'Email no válido',
|
||||
INVALID_PHONE: 'Teléfono no válido',
|
||||
WEAK_PASSWORD: 'La contraseña debe ser más segura',
|
||||
PASSWORDS_NOT_MATCH: 'Las contraseñas no coinciden',
|
||||
NETWORK_ERROR: 'Error de conexión',
|
||||
SERVER_ERROR: 'Error del servidor',
|
||||
UNAUTHORIZED: 'No autorizado',
|
||||
FORBIDDEN: 'Acceso denegado',
|
||||
NOT_FOUND: 'No encontrado',
|
||||
VALIDATION_ERROR: 'Error de validación',
|
||||
FILE_TOO_LARGE: 'Archivo demasiado grande',
|
||||
INVALID_FILE_TYPE: 'Tipo de archivo no válido',
|
||||
} as const;
|
||||
Reference in New Issue
Block a user