Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 88 additions & 1 deletion lib/features/tasks/presentation/widgets/assign_users_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,16 @@ class _AssignUsersDialogState extends State<AssignUsersDialog>
late Animation<double> _fadeAnimation;
late Animation<Offset> _slideAnimation;

// Sauvegarder l'état initial pour permettre l'annulation
late List<String> _initialAssignedUsers;

@override
void initState() {
super.initState();

// Sauvegarder l'état initial des assignations
_initialAssignedUsers = List<String>.from(widget.task.assignedTo);

_loadUsers();

// Animations d'entrée
Expand Down Expand Up @@ -96,12 +103,81 @@ class _AssignUsersDialogState extends State<AssignUsersDialog>
});
}

/// Annule toutes les modifications et restaure l'état initial
Future<void> _cancelChanges() async {
try {
final provider = context.read<TaskProvider>();
final currentTask = provider.allTasks.firstWhere(
(t) => t.id == widget.task.id,
);
final currentAssignedUsers = currentTask.assignedTo;

// Trouver les utilisateurs à retirer (qui ont été ajoutés)
final usersToRemove = currentAssignedUsers
.where((userId) => !_initialAssignedUsers.contains(userId))
.toList();

// Trouver les utilisateurs à rajouter (qui ont été retirés)
final usersToAdd = _initialAssignedUsers
.where((userId) => !currentAssignedUsers.contains(userId))
.toList();

// Effectuer les modifications pour restaurer l'état initial
for (final userId in usersToRemove) {
await provider.unassignUserFromTask(widget.task.id, userId);
}

for (final userId in usersToAdd) {
await provider.assignUserToTask(widget.task.id, userId);
}

if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
const Icon(Icons.undo, color: Colors.white),
const SizedBox(width: 12),
const Expanded(
child: Text(
'Modifications annulées',
style: TextStyle(fontWeight: FontWeight.w600),
),
),
],
),
backgroundColor: AppColors.getOnSurface(context).withOpacity(0.8),
duration: const Duration(seconds: 2),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
);

// Fermer le dialog après avoir annulé
Navigator.of(context).pop();
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Erreur lors de l\'annulation: $e'),
backgroundColor: AppColors.error,
),
);
}
}
}

Future<void> _toggleUserAssignment(String userId, bool isAssigned) async {
try {
final provider = context.read<TaskProvider>();
if (isAssigned) {
// L'utilisateur EST déjà assigné → on le RETIRE
await provider.unassignUserFromTask(widget.task.id, userId);
} else {
// L'utilisateur N'EST PAS assigné → on l'AJOUTE
await provider.assignUserToTask(widget.task.id, userId);
}

Expand Down Expand Up @@ -562,6 +638,17 @@ class _AssignUsersDialogState extends State<AssignUsersDialog>
),
),
),
// Bouton Annuler - Restaure l'état initial
TextButton(
onPressed: _cancelChanges,
style: TextButton.styleFrom(
foregroundColor: AppColors.getOnSurface(context).withOpacity(0.7),
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
),
child: const Text('Annuler'),
),
const SizedBox(width: 8),
// Bouton Modifier - Ferme le dialog (changements déjà appliqués)
ElevatedButton(
onPressed: () => Navigator.of(context).pop(),
style: ElevatedButton.styleFrom(
Expand All @@ -572,7 +659,7 @@ class _AssignUsersDialogState extends State<AssignUsersDialog>
borderRadius: BorderRadius.circular(12),
),
),
child: const Text('Terminé'),
child: const Text('Modifier'),
),
],
),
Expand Down
11 changes: 9 additions & 2 deletions lib/features/tasks/presentation/widgets/task_modal.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,22 @@ class _TaskModalState extends State<TaskModal> {
}

if (_isEditing) {
// Modifier la tâche existante
final updatedTask = widget.task!.copyWith(
// Récupérer la tâche actuelle depuis le provider pour avoir les assignations à jour
final currentTask = taskProvider.allTasks.firstWhere(
(t) => t.id == widget.task!.id,
orElse: () => widget.task!,
);

// Modifier la tâche existante en gardant les assignations actuelles
final updatedTask = currentTask.copyWith(
title: _titleController.text.trim(),
description: _descriptionController.text.trim(),
priority: _selectedPriority,
dueDate: _selectedDueDate,
tags: _selectedTags,
);
print('📝 TaskModal - Modification tâche: ${updatedTask.id}');
print(' - assignedTo conservé: ${updatedTask.assignedTo}');
taskProvider.updateTask(updatedTask);
} else {
// Créer une nouvelle tâche avec ownerId et ownerName
Expand Down