Frontend JavaScript detection is highly recommended for better UX, with server-side validation as backup.
Location: ChangeRequestController::detectChanges()
┌─────────────────────────────────────────────────┐
│ Frontend (JavaScript) │
│ - Real-time change detection │
│ - Visual feedback for users │
│ - Change summary before submission │
└─────────────────────────────────────────────────┘
↓ submits
┌─────────────────────────────────────────────────┐
│ Backend (Controller) │
│ - Receives form data │
│ - Performs server-side validation │
│ - Saves to database │
└─────────────────────────────────────────────────┘
File: resources/views/change-requests/create.blade.php (needs to be created)
Features:
```javascript
const originalValues = {
activityTitle: '{{ $parentMemo->activity_title }}',
memoDate: '{{ $parentMemo->memo_date ?? $parentMemo->date_to }}',
participants: {}, // JSON parsed
budget: {}, // JSON parsed
// ... etc
};
```
```javascript
$('input, select, textarea').on('change', function() {
const changes = detectChanges();
displayChangeSummary(changes);
});
```
- Show which fields changed
- Highlight changed fields
- Warn about significant changes (e.g., quarter change)
Why keep it?
Current Implementation:
ChangeRequestController::detectChanges() ✅ Keep as-is
Not Recommended
Functional but poor UX
Best of both worlds
Complexity: Medium (2-4 hours)
Required Skills:
Challenges:
```javascript
function getQuarter(date) {
const month = new Date(date).getMonth() + 1;
if (month <= 3) return 'Q1';
if (month <= 6) return 'Q2';
if (month <= 9) return 'Q3';
return 'Q4';
}
```
```javascript
function compareBudgets(before, after) {
return JSON.stringify(before) !== JSON.stringify(after);
}
```
```javascript
function detectParticipantChanges(before, after) {
const keysBefore = Object.keys(before);
const keysAfter = Object.keys(after);
// Check additions/removals
if (keysBefore.length !== keysAfter.length) return true;
// Check details for each participant
for (let key of keysBefore) {
if (!after[key]) return true; // Removed
if (before[key].participant_days !== after[key].participant_days) {
return true; // Days changed
}
}
return false;
}
```
- Server-side detection is working
- No breaking changes needed
- Show users what will change before submission
- Improve UX significantly
- About 4-6 hours of development
- Start with server-side (working now)
- Add frontend enhancement incrementally
- Best of both worlds
// change-request-tracker.js
class ChangeRequestTracker {
constructor(originalData) {
this.original = originalData;
this.current = {};
}
detectChanges() {
return {
title: this.compareField('activity_title'),
dates: this.compareDates(),
participants: this.compareParticipants(),
budget: this.compareBudget()
};
}
compareField(fieldName) {
return this.original[fieldName] !== this.current[fieldName];
}
compareDates() {
// Quarter logic here
const originalQuarter = this.getQuarter(this.original.date_to);
const currentQuarter = this.getQuarter(this.current.date_to);
return {
changed: originalQuarter !== currentQuarter,
stayedInQuarter: originalQuarter === currentQuarter
};
}
}
// Usage
const tracker = new ChangeRequestTracker({{ json_encode($parentMemo) }});
Recommendation: Keep server-side detection as primary, add frontend for UX.
Keep current server-side implementation ✅
Add optional frontend enhancement ⭐ (Recommended for better UX)