193 lines
5.1 KiB
Markdown
193 lines
5.1 KiB
Markdown
# Team Manager Validation - Complete ✅
|
|
|
|
## Overview
|
|
Added validation to ensure each shift manager can only be assigned to one team at a time.
|
|
|
|
---
|
|
|
|
## Features Implemented
|
|
|
|
### 1. Manager Availability Check ✅
|
|
|
|
**Create Team Page:**
|
|
- Validates that selected manager doesn't already have a team
|
|
- Shows error message if manager is already assigned
|
|
- Displays team assignments in dropdown options
|
|
- Prevents form submission if validation fails
|
|
|
|
**Edit Team Page:**
|
|
- Validates only if manager is being changed
|
|
- Allows keeping the same manager (no validation needed)
|
|
- Shows error message if new manager is already assigned
|
|
- Displays team assignments in dropdown options
|
|
|
|
---
|
|
|
|
## Implementation Details
|
|
|
|
### New API Endpoint
|
|
**`GET /api/admin/managers-with-teams`**
|
|
- Returns all active managers with their team assignments
|
|
- Includes team data for validation
|
|
- Used by both create and edit forms
|
|
|
|
### Validation Logic
|
|
|
|
**Create Team:**
|
|
```typescript
|
|
// Check if selected manager already has a team
|
|
const selectedManager = managers.find(m => m.id === formData.shiftManagerId)
|
|
if (selectedManager && selectedManager.teams && selectedManager.teams.length > 0) {
|
|
setError(`This manager is already assigned to: ${selectedManager.teams.map(t => t.name).join(", ")}`)
|
|
return
|
|
}
|
|
```
|
|
|
|
**Edit Team:**
|
|
```typescript
|
|
// Only check if manager changed
|
|
if (formData.shiftManagerId !== originalManagerId) {
|
|
const selectedManager = managers.find(m => m.id === formData.shiftManagerId)
|
|
if (selectedManager && selectedManager.teams && selectedManager.teams.length > 0) {
|
|
setError(`This manager is already assigned to: ${selectedManager.teams.map(t => t.name).join(", ")}`)
|
|
return
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## User Experience
|
|
|
|
### Visual Indicators
|
|
|
|
**Dropdown Options:**
|
|
- Shows manager name and employee number
|
|
- Displays existing team assignments inline
|
|
- Example: "John Smith (SM001) - Already assigned to: Red Team"
|
|
|
|
**Error Messages:**
|
|
- Red alert box appears when validation fails
|
|
- Clear message indicating which team(s) the manager is assigned to
|
|
- Error clears when user changes selection
|
|
|
|
**Form Behavior:**
|
|
- Submit button disabled during loading
|
|
- Error prevents form submission
|
|
- User must select a different manager to proceed
|
|
|
|
---
|
|
|
|
## Files Modified
|
|
|
|
### Pages
|
|
1. ✅ `app/admin/teams/create/page.tsx`
|
|
- Added manager validation
|
|
- Added error state
|
|
- Enhanced dropdown with team info
|
|
|
|
2. ✅ `app/admin/teams/[id]/page.tsx`
|
|
- Added manager validation (only on change)
|
|
- Added error state
|
|
- Enhanced dropdown with team info
|
|
- Tracks original manager ID
|
|
|
|
### API Routes
|
|
1. ✅ `app/api/admin/managers-with-teams/route.ts` (NEW)
|
|
- Returns managers with team relationships
|
|
- Filters active managers only
|
|
- Ordered by employee number
|
|
|
|
---
|
|
|
|
## Validation Rules
|
|
|
|
### One Manager Per Team
|
|
- ✅ Each team must have exactly one shift manager
|
|
- ✅ Each shift manager can only manage one team
|
|
- ✅ Validation happens before form submission
|
|
- ✅ Clear error messages guide the user
|
|
|
|
### Edit Behavior
|
|
- ✅ Can keep the same manager (no validation)
|
|
- ✅ Can change to unassigned manager (allowed)
|
|
- ✅ Cannot change to manager with existing team (blocked)
|
|
|
|
---
|
|
|
|
## Testing Scenarios
|
|
|
|
### Create Team
|
|
1. ✅ Select manager without team → Success
|
|
2. ✅ Select manager with team → Error shown
|
|
3. ✅ Change selection after error → Error clears
|
|
4. ✅ Submit with valid manager → Team created
|
|
|
|
### Edit Team
|
|
1. ✅ Keep same manager → Success (no validation)
|
|
2. ✅ Change to unassigned manager → Success
|
|
3. ✅ Change to manager with team → Error shown
|
|
4. ✅ Change back to original → Success
|
|
|
|
### Dropdown Display
|
|
1. ✅ Managers without teams show normally
|
|
2. ✅ Managers with teams show assignment info
|
|
3. ✅ Current team's manager doesn't show warning (edit only)
|
|
|
|
---
|
|
|
|
## Error Messages
|
|
|
|
### Format
|
|
```
|
|
This manager is already assigned to: [Team Name(s)]
|
|
```
|
|
|
|
### Examples
|
|
- "This manager is already assigned to: Red Team"
|
|
- "This manager is already assigned to: Blue Team, Green Team"
|
|
|
|
---
|
|
|
|
## Benefits
|
|
|
|
### Data Integrity
|
|
- Prevents duplicate team assignments
|
|
- Ensures one-to-one manager-team relationship
|
|
- Validates before database operation
|
|
|
|
### User Experience
|
|
- Clear visual feedback
|
|
- Helpful error messages
|
|
- Prevents invalid submissions
|
|
- Shows team assignments in dropdown
|
|
|
|
### System Reliability
|
|
- Client-side validation (fast feedback)
|
|
- Can add server-side validation for extra safety
|
|
- Consistent validation logic
|
|
|
|
---
|
|
|
|
## Future Enhancements
|
|
|
|
### Possible Additions
|
|
- [ ] Server-side validation in API route
|
|
- [ ] Show available managers count
|
|
- [ ] Filter dropdown to show only available managers
|
|
- [ ] Bulk team assignment interface
|
|
- [ ] Manager reassignment workflow
|
|
- [ ] Team history tracking
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
✅ **Validation implemented for team manager assignments**
|
|
✅ **One manager per team rule enforced**
|
|
✅ **Clear error messages and visual feedback**
|
|
✅ **Works in both create and edit forms**
|
|
✅ **New API endpoint for manager data with teams**
|
|
|
|
The system now ensures that each shift manager can only be assigned to one team at a time, preventing conflicts and maintaining data integrity!
|