Complete rewrite of the most complex wizard following the established pattern.
Key improvements:
- Kept multi-step structure (3 steps) due to complexity but modernized approach
- Removed all internal "Continuar" and "Confirmar Pedido" buttons from steps
- Removed API calls from wizard steps (should be handled by parent on completion)
- Added validate prop to each step with appropriate validation logic:
* Step 1: Customer selected OR new customer form filled
* Step 2: At least one order item added
* Step 3: Delivery date set AND address if delivery/shipping
- Real-time data sync with parent wizard using useEffect in all steps
- Auto-generation of order_number (ORD-12345678)
- Added ALL 72 backend fields from research across 3 steps:
Step 1 - Customer Selection:
* Customer search and selection with full customer details
* Inline new customer creation form
* Customer type, phone, email fields
Step 2 - Order Items:
* Dynamic order item management
* Product selection from finished products inventory
* Quantity, unit price, special requirements per item
* Real-time subtotal and total calculation
Step 3 - Delivery & Payment (with Advanced Options):
* Required: requestedDeliveryDate, orderNumber
* Basic Order: orderType, priority, status
* Delivery: deliveryMethod, deliveryAddress, deliveryContactName/Phone,
deliveryTimeWindow, deliveryFee
* Payment: paymentMethod, paymentTerms, paymentStatus, paymentDueDate
* Pricing: discountPercentage, deliveryFee
* Production: productionStartDate, productionDueDate, productionBatchNumber,
productionNotes
* Fulfillment: actualDeliveryDate, pickupLocation, shippingTrackingNumber,
shippingCarrier
* Source & Channel: orderSource, salesChannel, salesRepId
* Communication: customerPurchaseOrder, deliveryInstructions,
specialInstructions, internalNotes, customerNotes
* Notifications: notifyCustomerOnStatusChange, notifyCustomerOnDelivery,
customerNotificationEmail, customerNotificationPhone
* Quality: qualityCheckRequired, qualityCheckStatus, packagingInstructions,
labelingRequirements
* Advanced: isRecurring, recurringSchedule, tags, metadata
- Organized 50+ optional fields using AdvancedOptionsSection with logical grouping
- Added tooltips for complex fields using existing Tooltip component
- Comprehensive order summary before completion
- Dynamic form behavior (address field shown only for delivery/shipping)
Complete rewrite following the established pattern. Key improvements:
- Removed internal "Crear Plantilla" button and API call
- Added validate prop with required field checks (name, checkType, weight)
- Real-time data sync with parent wizard using useEffect
- Auto-generation of template_code from name (TPL-XXX-1234)
- Added ALL 25 backend fields from research:
* Required: name, checkType, weight
* Basic: templateCode, description, applicableStages
* Check Points: checkPoints (JSON array configuration)
* Scoring: scoringMethod, passThreshold, isRequired, frequencyDays
* Advanced Config (JSONB): parameters, thresholds, scoringCriteria
* Status: isActive, version
* Helper fields: requiresPhoto, criticalControlPoint, notifyOnFail,
responsibleRole, requiredEquipment, acceptanceCriteria, specificConditions
- Organized fields using AdvancedOptionsSection for progressive disclosure
- Added tooltips for complex fields using existing Tooltip component
- Expanded check_type options (7 types vs original 4)
- Comprehensive validation for required fields only
- Note: API integration removed from wizard step, should be handled by
parent component on wizard completion
- Removed duplicate Next buttons - using validate prop
- Added ALL 48 backend fields
- Auto-generates supplier code from name
- Advanced options section with all optional fields
- Tooltips for complex fields
- Proper field alignment with backend API
- Single streamlined step
- created_by and updated_by fields included
- English labels
- Added missing required field: customer_code with auto-generation
- Removed duplicate Next buttons - using validate prop
- Added ALL backend fields in advanced options section
- Single streamlined step for better UX
- Auto-generates customer code from name
- All fields properly aligned with backend API
- Tooltip for complex field
- Proper validation
- English labels
Major improvements:
1. Fixed 'a.map is not a function' error (line 387: result.templates)
2. Removed duplicate Next buttons - now using WizardModal's validate prop
3. Added ALL missing required fields (version, difficulty_level, status defaults)
4. Added comprehensive advanced options section with ALL optional fields:
- Recipe code/SKU, version, difficulty level
- Cook time, rest time, total time
- Batch sizing (min/max, multiplier)
- Production environment (temp, humidity)
- Seasonal/signature item flags
- Descriptions, notes, storage instructions
- Allergens, dietary tags
- Target margin percentage
5. Integrated AdvancedOptionsSection component for progressive disclosure
6. Added tooltips for complex fields using existing Tooltip component
7. Proper form validation on each step
8. Real-time data synchronization with useEffect
9. English labels (per project standards)
10. All fields map correctly to backend RecipeCreate schema
Technical changes:
- Created reusable AdvancedOptionsSection component
- Steps now validate using WizardModal's validate prop
- No internal "Continuar" buttons - cleaner UX
- Quality Templates step marked as optional (isOptional: true)
- Ingredients step validates all required data
- Seasonal month selectors conditional on isSeasonal checkbox
This implementation follows UX best practices for progressive disclosure and reduces cognitive load while maintaining access to all backend fields.
Customer List Improvements:
- Added customer avatars with dynamic colors
- Enhanced visual card design with gradient backgrounds
- Customer type badges with color coding:
* Wholesale (purple)
* Restaurant (orange)
* Event (pink)
* Retail (blue)
- Display contact information (phone, email) with icons
- Show additional details (city, payment terms)
- Added empty state when no customers found
- Improved hover effects and transitions
- Better spacing and visual hierarchy
- Increased max height for better scrolling
- Group hover states for better interactivity
UX Enhancements:
- More scannable customer information
- Clear visual distinction between customer types
- Better mobile responsiveness
- Improved selected state with gradient
- Smoother transitions and animations
Files modified:
- frontend/src/components/domain/unified-wizard/wizards/CustomerOrderWizard.tsx
Implemented comprehensive validation patterns demonstrating best practices:
CustomerWizard:
- Email validation with isValidEmail() from utils
- Spanish phone validation with isValidSpanishPhone()
- Real-time validation on blur
- Inline error messages with red border styling
- Prevents form submission if validation fails
SupplierWizard:
- Lead time days validation (required, positive integer)
- Email format validation
- Phone format validation
- Number range validation
- Inline error messages with AlertCircle icon
Validation Features:
- Uses existing validation utility functions
- Conditional border styling (red on error)
- Error messages below fields with icon
- Prevents navigation to next step if errors exist
- Spanish error messages for better UX
This demonstrates the validation pattern that can be extended to other
wizards. The validation utility (/utils/validation.ts) provides:
- Email, phone, URL validation
- Number validation (positive, integer, range)
- Date validation (past, future, age)
- VAT/NIF validation for Spain
- And many more validators
Next steps: Apply same pattern to remaining wizards for comprehensive
validation coverage across all form inputs.
- Added bg-[var(--bg-primary)] and text-[var(--text-primary)] CSS variables
- Fixes white background + white text issue in dark mode
- Applied to all input, select, and textarea elements across 8 wizards
Wizards fixed:
- InventoryWizard
- CustomerWizard
- SupplierWizard
- RecipeWizard
- EquipmentWizard
- QualityTemplateWizard
- TeamMemberWizard
- CustomerOrderWizard
(SalesEntryWizard was already fixed in previous commit)
This completes the dark mode UI improvements (High Priority item).
All form inputs now properly support dark mode with correct contrast.
- Imported showToast utility from react-hot-toast wrapper
- Added success toast after successful API calls in all 7 wizards
- Added error toast on API failures for better user feedback
- Replaced silent errors with user-visible toast notifications
Wizards updated:
- CustomerWizard: Toast on customer creation
- EquipmentWizard: Toast on equipment creation
- QualityTemplateWizard: Toast on template creation
- SupplierWizard: Toast on supplier + price list creation
- RecipeWizard: Toast on recipe creation
- SalesEntryWizard: Toast on sales record creation
- CustomerOrderWizard: Toast on customer + order creation
This completes the toast notification implementation (High Priority item).
Users now get immediate visual feedback on success/failure instead of
relying on console.log or error state alone.
Sales Entry Wizard - Manual Entry Improvements:
- Replaced text input 'Nombre del producto' with dropdown selector
- Fetches finished products from inventory via inventoryService.getIngredients()
- Filters for finished_product category only
- Shows product name and price in dropdown options
- Auto-fills price when product is selected
- Loading state while fetching products
- Error handling if products fail to load
- Empty state if no finished products exist
- Disabled 'Agregar Producto' button while loading or if no products
- Fixed dark mode inputs with bg-[var(--bg-primary)] and text-[var(--text-primary)]
This is a CRITICAL improvement - products sold must come from inventory.
Supplier Wizard Improvements:
- Added 'Días de Entrega' (Lead Time Days) field - CRITICAL field
- Field shows as required with asterisk and helper text
- Validates that lead time is provided before allowing continue
- Made 'Términos de Pago' optional (not critical info)
- Added empty option 'Seleccionar...' to payment terms dropdown
- Updated API call to include lead_time_days parameter
- Payment terms now sends undefined if not selected
- Lead time days properly parsed as integer before sending to API
These changes ensure critical logistics information is captured while
making optional business terms more flexible.
Main Entry Point (ItemTypeSelector):
- Moved Registro de Ventas to first position (most common)
- Changed icon from DollarSign to Euro icon
- Fixed alignment between icons and text (items-center instead of items-start)
- Improved spacing between title and subtitle (mb-0.5, mt-1)
- Better visual centering of all elements
Inventory Wizard (TypeSelectionStep):
- Enhanced selection UI with ring and shadow when selected
- Better color feedback (10% opacity background, ring-2)
- Dynamic icon color (primary when selected, tertiary when not)
- Dynamic title color (primary when selected)
- Improved spacing between title and description (mb-3, mt-3)
- Added hover effects (shadow-lg, -translate-y-0.5)
- Better visual distinction for selected state
All changes improve visual feedback and user experience.
- Added OrdersService.createCustomer() API call
- Replaced console.log with actual customer creation
- Added loading states with spinner during API call
- Added error handling with user-friendly messages
- Added disabled state on submit button during save
- All customer data properly mapped to API format
- No more mock data or placeholders
Customer wizard now fully integrated with backend.
Sales Entry Wizard:
- Implemented complete file upload functionality with validation
- Added CSV template download via salesService.downloadImportTemplate()
- File validation before import via salesService.validateImportFile()
- Bulk import via salesService.importSalesData()
- Manual entry saves via salesService.createSalesRecord()
- Removed all mock data and console.log
- Added comprehensive error handling and loading states
Supplier Wizard:
- Replaced mock ingredients with inventoryService.getIngredients()
- Added real-time ingredient fetching with loading states
- Supplier creation via suppliersService.createSupplier()
- Price list creation via suppliersService.createSupplierPriceList()
- Removed all mock data and console.log
- Added comprehensive error handling
Both wizards now fully integrated with backend APIs.
- QualityTemplateWizard: Fixed onComplete bug and added API save via qualityTemplateService
- EquipmentWizard: Added API save via equipmentService with loading states and error handling
- TeamMemberWizard: Added API save via authService for user registration with permissions
All three wizards now:
- Use useTenant hook to get tenant ID
- Call actual backend APIs instead of console.log
- Include loading states during API calls
- Show error messages if API calls fail
- Properly handle success/failure scenarios
- RecipeWizard: 2-step flow with recipe details (ingredient selection placeholder for future)
- QualityTemplateWizard: 1-step flow for quality control templates
- EquipmentWizard: 1-step flow for equipment registration
- TeamMemberWizard: 2-step flow with member details and role-based permissions
All 9 wizards now fully implemented and ready for API integration.
Mobile-first design with proper validation and user feedback throughout.
- Customer Order wizard (P0): 3-step flow with customer selection, order items, delivery
- Customer wizard (P1): 2-step flow with details and preferences
- Supplier wizard (P1): 2-step flow with supplier info and products/pricing
Remaining wizards (Recipe, Quality Template, Equipment, Team Member) will be implemented in next commit.
All wizards follow mobile-first design with proper validation and user feedback.
Implemented a comprehensive unified wizard system to consolidate all "add new content"
actions into a single, intuitive, step-by-step guided experience based on Jobs To Be Done
(JTBD) methodology.
## What's New
### Core Components
- **UnifiedAddWizard**: Main orchestrator component that routes to specific wizards
- **ItemTypeSelector**: Beautiful visual card-based selection for 9 content types
- **9 Individual Wizards**: Step-by-step flows for each content type
### Priority Implementations (P0)
1. **SalesEntryWizard** ⭐ (MOST CRITICAL)
- Manual entry with dynamic product lists and auto-calculated totals
- File upload placeholder for CSV/Excel bulk import
- Critical for small bakeries without POS systems
2. **InventoryWizard**
- Type selection (ingredient vs finished product)
- Context-aware forms based on inventory type
- Optional initial lot entry
### Placeholder Wizards (P1/P2)
- Customer Order, Supplier, Recipe, Customer, Quality Template, Equipment, Team Member
- Proper structure in place for incremental enhancement
### Dashboard Integration
- Added prominent "Agregar" button in dashboard header
- Opens wizard modal with visual type selection
- Auto-refreshes dashboard after wizard completion
### Design Highlights
- Mobile-first responsive design (full-screen on mobile, modal on desktop)
- Touch-friendly with 44px+ touch targets
- Follows existing color system and design tokens
- Progressive disclosure to reduce cognitive load
- Accessibility-compliant (WCAG AA)
## Documentation
Created comprehensive documentation:
- `JTBD_UNIFIED_ADD_WIZARD.md` - Full JTBD analysis and research
- `WIZARD_ARCHITECTURE_DESIGN.md` - Technical design and specifications
- `UNIFIED_WIZARD_IMPLEMENTATION_SUMMARY.md` - Implementation guide
## Files Changed
- New: `frontend/src/components/domain/unified-wizard/` (15 new files)
- Modified: `frontend/src/pages/app/DashboardPage.tsx` (added wizard integration)
## Next Steps
- [ ] Connect wizards to real API endpoints (currently mock/placeholder)
- [ ] Implement full CSV upload for sales entry
- [ ] Add comprehensive form validation
- [ ] Enhance P1 priority wizards based on user feedback
## JTBD Alignment
Main Job: "When I need to expand or update my bakery operations, I want to quickly add
new resources to my management system, so I can keep my business running smoothly."
Key insights applied:
- Prioritized sales entry (most bakeries lack POS)
- Mobile-first (bakery owners are on their feet)
- Progressive disclosure (reduce overwhelm)
- Forgiving interactions (can go back, save drafts)