
Introduces an `isDraft` property to `StockPickingRecordEntity` to mark receptions with local modifications. Automatically sets a reception to draft status when a product's quantity is incremented via scanning. Displays a 'Brouillon' chip on reception cards to provide visual feedback for draft operations. Ensures reception details are refreshed after scanning to reflect the updated draft status and provides immediate error feedback when no product is found during a scan.
113 lines
4.4 KiB
Dart
113 lines
4.4 KiB
Dart
import 'package:e_scan/backend/objectbox/entities/stock_picking/stock_picking_record_entity.dart';
|
|
import 'package:e_scan/components/components.dart';
|
|
import 'package:e_scan/pages/operation/reception/reception_page_model.dart';
|
|
import 'package:e_scan/router/go_secure_router_builder.dart';
|
|
import 'package:e_scan/themes/app_theme.dart';
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class ReceptionPage extends ConsumerStatefulWidget {
|
|
const ReceptionPage({super.key});
|
|
|
|
@override
|
|
ConsumerState<ReceptionPage> createState() => _ReceptionPageState();
|
|
}
|
|
|
|
class _ReceptionPageState extends ConsumerState<ReceptionPage> {
|
|
final globalKey = GlobalKey<ScaffoldState>();
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
SchedulerBinding.instance.addPostFrameCallback((_) {
|
|
ref.read(receptionPageModelProvider.notifier).getUserConnected();
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: AppTheme.of(context).primaryBackground,
|
|
key: globalKey,
|
|
drawer: DrawerComponent(isOperationExpanded: true),
|
|
appBar: MainAppbarComponent(
|
|
scaffoledKey: globalKey,
|
|
title: "Réceptions",
|
|
subTitle: "Opérations d'Entrepôt",
|
|
),
|
|
body: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
|
child: ListView(
|
|
children: [
|
|
const SizedBox(height: 16),
|
|
QuickActionComponent(
|
|
onTapAdd: () {},
|
|
onTapScan: () {},
|
|
onTapSearch: () {},
|
|
),
|
|
const SizedBox(height: 16),
|
|
Consumer(
|
|
builder: (_, WidgetRef ref, _) {
|
|
final state = ref.watch(receptionPageModelProvider);
|
|
if (state.loadingReceptions) {
|
|
return Center(child: LoadingProgressComponent());
|
|
}
|
|
return Column(
|
|
spacing: 10,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
// Text(
|
|
// 'Réceptions',
|
|
// style: AppTheme.of(
|
|
// context,
|
|
// ).bodyMedium.copyWith(fontWeight: FontWeight.bold),
|
|
// ),
|
|
state.receptions.isEmpty == true
|
|
? Text('No data')
|
|
: ListView.builder(
|
|
physics: NeverScrollableScrollPhysics(),
|
|
primary: true,
|
|
shrinkWrap: true,
|
|
itemCount: state.receptions.length,
|
|
itemBuilder: (context, index) {
|
|
final reception = state.receptions[index];
|
|
return GestureDetector(
|
|
onTap: () {
|
|
final id = reception.id;
|
|
ReceptionDetailsRoute(
|
|
receptionId: id,
|
|
).push(context);
|
|
},
|
|
child: StockPickingCard(
|
|
isDraft: reception.isDraft == true,
|
|
margin: EdgeInsets.symmetric(
|
|
horizontal: 5,
|
|
vertical: 5,
|
|
),
|
|
isDone: reception.isDone == true,
|
|
reference: reception.name ?? '',
|
|
from:
|
|
reception.locationId.target?.completeName,
|
|
to: reception
|
|
.locationDestId
|
|
.target
|
|
?.completeName,
|
|
contact:
|
|
reception.partnerId.target?.displayName,
|
|
origin: reception.origin,
|
|
status: reception.state,
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|