Refactor StoreBloc to Cubit and Fix Staff Assignment UI (#1)
Convertito StoreBloc in StoreCubit per coerenza con il resto del progetto. Sistemata la logica di assegnazione dipendenti nel modal dei negozi. Utilizzato il doppio BlocBuilder per garantire la reattività tra StaffCubit e StoreCubit. Reviewed-on: http://catelliub.zapto.org:3000/brontomark/flux/pulls/1 Co-authored-by: Mark M2 Macbook <marco@catelli.it> Co-committed-by: Mark M2 Macbook <marco@catelli.it>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flux/features/master_data/store/bloc/store_bloc.dart';
|
||||
import 'package:flux/features/master_data/store/bloc/store_cubit.dart';
|
||||
import 'package:flux/features/master_data/store/models/store_model.dart';
|
||||
import 'package:flux/core/blocs/session/session_bloc.dart';
|
||||
import 'package:flux/core/theme/theme.dart';
|
||||
@@ -76,7 +76,7 @@ class _CreateStoreScreenState extends State<CreateStoreScreen> {
|
||||
provincia: _provinciaController.text.trim().toUpperCase(),
|
||||
);
|
||||
|
||||
context.read<StoreBloc>().add(CreateStoreRequested(store: store));
|
||||
context.read<StoreCubit>().createStore(store);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ class _CreateStoreScreenState extends State<CreateStoreScreen> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('Il tuo primo Negozio')),
|
||||
body: BlocConsumer<StoreBloc, StoreState>(
|
||||
body: BlocConsumer<StoreCubit, StoreState>(
|
||||
listener: (context, state) {
|
||||
if (state.status == StoreStatus.success) {
|
||||
context.read<SessionBloc>().add(AppStarted());
|
||||
|
||||
@@ -4,7 +4,7 @@ import 'package:flux/core/blocs/session/session_bloc.dart';
|
||||
import 'package:flux/core/theme/theme.dart';
|
||||
import 'package:flux/core/widgets/flux_text_field.dart';
|
||||
import 'package:flux/features/master_data/staff/blocs/staff_cubit.dart';
|
||||
import 'package:flux/features/master_data/store/bloc/store_bloc.dart';
|
||||
import 'package:flux/features/master_data/store/bloc/store_cubit.dart';
|
||||
import 'package:flux/features/master_data/store/models/store_model.dart';
|
||||
|
||||
class StoresScreen extends StatefulWidget {
|
||||
@@ -19,7 +19,7 @@ class _StoresScreenState extends State<StoresScreen> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
// Carichiamo i negozi e anche lo staff (per poterlo assegnare)
|
||||
context.read<StoreBloc>().add(LoadStoresRequested());
|
||||
context.read<StoreCubit>().loadStores();
|
||||
context.read<StaffCubit>().loadAllStaff();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ class _StoresScreenState extends State<StoresScreen> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text("I Tuoi Negozi")),
|
||||
body: BlocBuilder<StoreBloc, StoreState>(
|
||||
body: BlocBuilder<StoreCubit, StoreState>(
|
||||
builder: (context, state) {
|
||||
if (state.status == StoreStatus.loading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
@@ -90,10 +90,10 @@ class _StoresScreenState extends State<StoresScreen> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
// Mostra quanti dipendenti ci sono (usando lo StaffCubit)
|
||||
BlocBuilder<StaffCubit, StaffState>(
|
||||
builder: (context, staffState) {
|
||||
BlocBuilder<StoreCubit, StoreState>(
|
||||
builder: (context, storeState) {
|
||||
final staffCount =
|
||||
staffState.storesByStaff[store.id]?.length ?? 0;
|
||||
storeState.staffByStore[store.id]?.length ?? 0;
|
||||
return ActionChip(
|
||||
avatar: const Icon(Icons.people, size: 16),
|
||||
label: Text("$staffCount Dipendenti"),
|
||||
@@ -119,42 +119,52 @@ class _StoresScreenState extends State<StoresScreen> {
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (context) => BlocBuilder<StaffCubit, StaffState>(
|
||||
builder: (context, state) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text("Personale di ${store.nome}", style: context.titleLarge),
|
||||
const SizedBox(height: 16),
|
||||
// Lista di TUTTO lo staff dell'azienda con checkbox
|
||||
...state.allStaff.map((person) {
|
||||
final bool isAssigned =
|
||||
state.storesByStaff[store.id!]?.any(
|
||||
(s) => s.id == person.id,
|
||||
) ??
|
||||
false;
|
||||
// 1. Prendi TUTTI i dipendenti
|
||||
builder: (context, staffState) {
|
||||
return BlocBuilder<StoreCubit, StoreState>(
|
||||
// 2. Prendi le ASSEGNAZIONI
|
||||
builder: (context, storeState) {
|
||||
final assignedToThisStore =
|
||||
storeState.staffByStore[store.id!] ?? [];
|
||||
|
||||
return CheckboxListTile(
|
||||
title: Text(person.name),
|
||||
value: isAssigned,
|
||||
onChanged: (selected) {
|
||||
if (selected == true) {
|
||||
context.read<StaffCubit>().assignMemberToStore(
|
||||
person.id!,
|
||||
store.id!,
|
||||
);
|
||||
} else {
|
||||
context.read<StaffCubit>().removeMemberFromStore(
|
||||
person.id!,
|
||||
store.id!,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
"Personale di ${store.nome}",
|
||||
style: context.titleLarge,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
...staffState.allStaff.map((person) {
|
||||
// La spunta deve dipendere dallo StoreCubit!
|
||||
final bool isAssigned = assignedToThisStore.any(
|
||||
(s) => s.id == person.id,
|
||||
);
|
||||
|
||||
return CheckboxListTile(
|
||||
title: Text(person.name),
|
||||
value: isAssigned,
|
||||
onChanged: (selected) {
|
||||
if (selected == true) {
|
||||
context.read<StoreCubit>().assignStaffToStore(
|
||||
store.id!,
|
||||
person.id!,
|
||||
);
|
||||
} else {
|
||||
context.read<StoreCubit>().removeStaffFromStore(
|
||||
person.id!,
|
||||
store.id!,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
@@ -279,9 +289,7 @@ class _StoresScreenState extends State<StoresScreen> {
|
||||
);
|
||||
|
||||
// Chiamata al Bloc per il salvataggio
|
||||
context.read<StoreBloc>().add(
|
||||
CreateStoreRequested(store: storeData),
|
||||
);
|
||||
context.read<StoreCubit>().createStore(storeData);
|
||||
|
||||
Navigator.pop(context);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user