v
This commit is contained in:
@@ -1,13 +1,16 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flux/features/tickets/models/ticket_model.dart';
|
||||
import 'package:flux/features/tickets/data/ticket_repository.dart';
|
||||
import 'package:flux/features/tracking/data/tracking_repository.dart';
|
||||
import 'package:flux/features/tracking/models/tracking_model.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'ticket_list_state.dart';
|
||||
|
||||
class TicketListCubit extends Cubit<TicketListState> {
|
||||
final TicketRepository _repository = GetIt.I.get<TicketRepository>();
|
||||
final TrackingRepository _trackingRepository = GetIt.I
|
||||
.get<TrackingRepository>();
|
||||
static const int _limit = 20; // Paginazione a blocchi di 20
|
||||
|
||||
TicketListCubit() : super(const TicketListState()) {
|
||||
@@ -95,4 +98,64 @@ class TicketListCubit extends Cubit<TicketListState> {
|
||||
void selectAll(List<TicketModel> tickets) {
|
||||
emit(state.copyWith(selectedTickets: tickets.toSet()));
|
||||
}
|
||||
|
||||
Future<void> closeTicketsBulk({
|
||||
required List<String> ticketIds,
|
||||
Map<String, bool>? loanReturns,
|
||||
}) async {
|
||||
// 1. Escludiamo i ticket per cui NON è stato restituito il muletto
|
||||
if (loanReturns != null) {
|
||||
for (final map in loanReturns.entries) {
|
||||
if (!map.value) {
|
||||
ticketIds.remove(map.key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Se non c'è più nulla da chiudere (es. ha rifiutato tutto), usciamo
|
||||
if (ticketIds.isEmpty) {
|
||||
clearSelection();
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Prepariamo i ticket per il DB
|
||||
final List<TicketModel> ticketsToUpdate = [];
|
||||
for (final ticketId in ticketIds) {
|
||||
final ticket = state.tickets
|
||||
.firstWhere((ticket) => ticket.id == ticketId)
|
||||
.copyWith(ticketStatus: TicketStatus.closed);
|
||||
ticketsToUpdate.add(ticket);
|
||||
}
|
||||
|
||||
// 3. Salviamo su DB (in background)
|
||||
for (final ticket in ticketsToUpdate) {
|
||||
await _repository.updateTicket(ticket);
|
||||
await _trackingRepository.logQuickEvent(
|
||||
companyId: ticket.companyId,
|
||||
message: 'Ticket chiuso - Riconsegnato',
|
||||
type: TrackingType.statusChange,
|
||||
parentId: ticket.id!,
|
||||
parentType: TrackingParentType.ticket,
|
||||
);
|
||||
}
|
||||
|
||||
// 4. LA MAGIA: AGGIORNAMENTO LOCALE ISTANTANEO
|
||||
final updatedTickets = state.tickets.map((t) {
|
||||
if (ticketIds.contains(t.id)) {
|
||||
return t.copyWith(ticketStatus: TicketStatus.closed);
|
||||
}
|
||||
return t;
|
||||
}).toList();
|
||||
|
||||
// 5. Emettiamo il nuovo stato aggiornato e puliamo la selezione in un colpo solo
|
||||
emit(
|
||||
state.copyWith(
|
||||
tickets: updatedTickets,
|
||||
selectedTickets: {}, // Equivalente di clearSelection()
|
||||
),
|
||||
);
|
||||
|
||||
// Opzionale: Se vuoi comunque riallinearti al server in modo silenzioso dopo l'animazione
|
||||
// loadTickets(refresh: true);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user