# Toast Notification System - Implementation Guide ## Overview A modern, consistent toast notification system has been implemented across the entire application using Toastr.js. This provides better UX for validation errors, success messages, warnings, and informational messages. ## Features ✅ **Automatic Display**: TempData messages and ModelState errors automatically show as toast notifications ✅ **Consistent API**: Easy-to-use helper methods for controllers ✅ **Multiple Types**: Success, Error, Warning, and Info notifications ✅ **Accessible**: ARIA-compliant and keyboard accessible ✅ **Responsive**: Works on desktop, tablet, and mobile ✅ **Themeable**: Integrated with Bootstrap 5 dark/light themes --- ## For Controllers - Setting Toast Messages ### Option 1: Using Extension Methods (Recommended) ```csharp using PowderCoating.Web.Helpers; public class MyController : Controller { public IActionResult Create(MyDto dto) { if (ModelState.IsValid) { // ... save logic ... this.ToastSuccess("Item created successfully!"); return RedirectToAction(nameof(Index)); } // Validation errors are automatically shown as toasts return View(dto); } public IActionResult Delete(int id) { try { // ... delete logic ... this.ToastSuccess("Item deleted successfully!"); } catch (Exception ex) { this.ToastError($"Failed to delete item: {ex.Message}"); } return RedirectToAction(nameof(Index)); } } ``` ### Option 2: Using TempData Directly ```csharp using PowderCoating.Web.Helpers; // Success TempData.Success("Operation completed successfully!"); // Error TempData.Error("An error occurred while processing your request."); // Warning TempData.Warning("This action cannot be undone."); // Info TempData.Info("Your changes have been saved as a draft."); ``` ### Option 3: Traditional TempData (Still Supported) ```csharp // Still works - will be displayed as toasts TempData["Success"] = "Item saved!"; TempData["Error"] = "Something went wrong."; TempData["Warning"] = "Please review the changes."; TempData["Info"] = "New feature available!"; ``` --- ## For Views - Replacing Old Validation Summaries ### Old Way (Still Works) ```html
``` ### New Way (Recommended) ```html @* Simple inline indicator - errors show as toasts automatically *@ @* Or use nothing - ModelState errors auto-show as toasts! *@ ``` ### Field-Level Validation (Unchanged) ```html @* Field-level validation still works the same *@ ``` --- ## For JavaScript - Manual Toast Display ### Basic Usage ```javascript // Success showSuccess('Changes saved successfully!'); // Error showError('Failed to load data.'); // Warning showWarning('Your session will expire in 5 minutes.'); // Info showInfo('A new version is available.'); ``` ### With Custom Titles ```javascript showSuccess('Profile updated!', 'Success'); showError('Connection lost.', 'Network Error'); showWarning('Unsaved changes detected.', 'Warning'); showInfo('New messages available.', 'Notification'); ``` ### Validation Errors ```javascript // Single error showValidationErrors(['Email is required']); // Multiple errors showValidationErrors([ 'Email is required', 'Password must be at least 8 characters', 'Terms and conditions must be accepted' ]); ``` ### Clear All Toasts ```javascript clearAllToasts(); ``` --- ## Configuration Toast behavior is configured in `/wwwroot/js/toast-notifications.js`: ```javascript toastr.options = { "closeButton": true, // Show close button "newestOnTop": true, // New toasts appear on top "progressBar": true, // Show countdown progress bar "positionClass": "toast-top-right", // Position on screen "preventDuplicates": true, // Prevent duplicate messages "timeOut": "5000", // Auto-close after 5 seconds "extendedTimeOut": "1000", // Extended timeout on hover // ... more options }; ``` ### Available Positions - `toast-top-right` (default) - `toast-top-left` - `toast-bottom-right` - `toast-bottom-left` - `toast-top-center` - `toast-bottom-center` - `toast-top-full-width` - `toast-bottom-full-width` --- ## Migration Guide ### 1. Update Controllers **Before:** ```csharp TempData["Success"] = "Item created!"; ``` **After:** ```csharp using PowderCoating.Web.Helpers; this.ToastSuccess("Item created!"); ``` ### 2. Update Views **Before:** ```html @if (TempData["Success"] != null) {
@TempData["Success"]
}
``` **After:** ```html @* Messages automatically show as toasts - no view code needed! *@ @* Optional: Simple validation indicator *@ ``` ### 3. JavaScript AJAX Callbacks **Before:** ```javascript if (result.success) { alert('Saved!'); } ``` **After:** ```javascript if (result.success) { showSuccess('Saved successfully!'); } ``` --- ## Examples by Scenario ### CRUD Operations ```csharp // Create this.ToastSuccess($"'{entity.Name}' created successfully!"); // Update this.ToastSuccess($"'{entity.Name}' updated successfully!"); // Delete this.ToastSuccess($"'{entity.Name}' deleted successfully!"); // Soft Delete this.ToastWarning($"'{entity.Name}' moved to trash."); ``` ### Validation Failures ```csharp // ModelState errors show automatically as toasts // Just return the view if (!ModelState.IsValid) { return View(dto); } ``` ### Business Logic Errors ```csharp if (customer.CurrentBalance > 0) { this.ToastError("Cannot delete customer with outstanding balance."); return RedirectToAction(nameof(Details), new { id }); } ``` ### Warnings ```csharp if (item.StockLevel < item.ReorderPoint) { this.ToastWarning($"Low stock alert: {item.Name} needs reordering."); } ``` ### Info Messages ```csharp if (newFeaturesAvailable) { this.ToastInfo("New features are available! Check the dashboard."); } ``` --- ## Styling & Theming Toast notifications automatically adapt to Bootstrap 5 dark/light themes. Colors are derived from: - **Success**: `--bs-success` (green) - **Error**: `--bs-danger` (red) - **Warning**: `--bs-warning` (yellow/orange) - **Info**: `--bs-info` (blue) --- ## Accessibility ✅ Toast notifications include proper ARIA attributes ✅ Keyboard accessible (close with ESC key) ✅ Screen reader friendly ✅ Respects `prefers-reduced-motion` for animations --- ## Best Practices ### ✅ DO - Use success toasts for completed actions - Use error toasts for failures and validation issues - Use warning toasts for important information requiring attention - Use info toasts for helpful tips and non-critical updates - Keep messages concise (1-2 sentences max) - Use action-specific messages ("Customer 'Acme Corp' created successfully") ### ❌ DON'T - Don't use toasts for critical errors requiring user action (use modals) - Don't use toasts for form field validation (use inline validation) - Don't chain multiple toasts for the same action - Don't use vague messages ("Success!" - what succeeded?) - Don't use toasts for loading states (use spinners) --- ## Troubleshooting ### Toast not appearing? 1. Check browser console for JavaScript errors 2. Verify Toastr library is loaded: Check `` for `toastr.min.css` and `toastr.min.js` 3. Verify toast-notifications.js is loaded after Toastr 4. Check that TempData keys are correct: "Success", "Error", "Warning", "Info" ### Toast appears twice? - Check that you're not manually displaying AND using TempData - Verify the page isn't being loaded twice ### Styling issues? - Check for CSS conflicts with custom styles - Verify Bootstrap 5 is loaded - Check browser console for CSS errors --- ## Files Modified/Created ### New Files - `/wwwroot/lib/toastr/` - Toastr library files (via LibMan) - `/wwwroot/js/toast-notifications.js` - Toast notification system - `/Helpers/ToastHelper.cs` - C# helper methods - `/Views/Shared/_ValidationSummary.cshtml` - Modern validation summary partial ### Modified Files - `/libman.json` - Added Toastr library - `/Views/Shared/_Layout.cshtml` - Added Toastr references and TempData containers --- ## Support & Feedback For questions or issues with the toast notification system, please contact the development team or create an issue in the project repository.