barcode_scanner/lib/components/stock_picking_card_component.dart
mandreshope d09d8ace8c feat: Implements visual status for pickings
Introduces an `isDone` extension property for stock picking records to simplify status checks.

Enhances the `StockPickingCard` to visually represent the picking's completion status with a distinct icon and color (green for 'done', grey for 'in progress'), improving clarity at a glance. Information row values are now consistently uppercased.

Conditionally displays scan-related actions (QuickActionComponent and FloatingActionButton) in the reception details page, making them available only when the picking is not yet completed. This guides users by preventing interactions on finished operations.
2025-07-30 10:49:51 +03:00

115 lines
3.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:e_scan/themes/app_theme.dart';
import 'package:flutter/material.dart';
class StockPickingCard extends StatelessWidget {
const StockPickingCard({
super.key,
required this.reference,
required this.from,
required this.to,
required this.contact,
required this.origin,
required this.status,
required this.isDone,
this.margin,
});
final bool isDone;
final String? reference;
final String? from;
final String? to;
final String? contact;
final String? origin;
final String? status;
final EdgeInsetsGeometry? margin;
@override
Widget build(BuildContext context) {
return Card(
elevation: 3,
color: AppTheme.of(context).primaryBackground,
margin: margin ?? const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
const Icon(Icons.receipt_long, color: Colors.blue),
const SizedBox(width: 8),
Expanded(
child: Text(
reference ?? 'Référence inconnue',
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 12),
_infoStateRow(isDone, "Statut", status),
_infoRow(Icons.call_made, "De", from),
_infoRow(Icons.call_received, "Vers", to),
_infoRow(Icons.person, "Contact", contact),
_infoRow(Icons.insert_drive_file, "Document dorigine", origin),
],
),
),
);
}
Widget _infoStateRow(bool isDone, String label, String? value) {
var color = Colors.grey[700];
var icon = Icons.refresh;
if (isDone) {
icon = Icons.check_circle;
color = Colors.green;
}
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Row(
children: [
Icon(icon, size: 20, color: color),
const SizedBox(width: 8),
Text(
"$label : ",
style: TextStyle(fontWeight: FontWeight.bold, color: color),
),
Expanded(
child: Text(
(value ?? "-").toUpperCase(),
style: TextStyle(color: color, fontWeight: FontWeight.bold),
),
),
],
),
);
}
Widget _infoRow(IconData icon, String label, String? value) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Row(
children: [
Icon(icon, size: 20, color: Colors.grey[700]),
const SizedBox(width: 8),
Text(
"$label : ",
style: const TextStyle(fontWeight: FontWeight.w600),
),
Expanded(
child: Text(
(value ?? "-").toUpperCase(),
style: const TextStyle(color: Colors.black87),
),
),
],
),
);
}
}