first commit
This commit is contained in:
186
app/lib/presentation/widgets/counter_grid.dart
Normal file
186
app/lib/presentation/widgets/counter_grid.dart
Normal file
@@ -0,0 +1,186 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../domain/entities/counter.dart';
|
||||
|
||||
/// Zähler-Grid wie in Lua CreateLoadingStockStartView etc.
|
||||
class CounterGrid extends StatelessWidget {
|
||||
final List<CounterGroup> groups;
|
||||
final bool showDifferences;
|
||||
|
||||
const CounterGrid({
|
||||
super.key,
|
||||
required this.groups,
|
||||
this.showDifferences = false,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: groups.map((group) => _buildGroup(context, group)).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildGroup(BuildContext context, CounterGroup group) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: _getGroupColor(group.title),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
// Titel
|
||||
Container(
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Text(
|
||||
group.title,
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// Zähler
|
||||
Container(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Row(
|
||||
children: group.counters.map((counter) {
|
||||
return Expanded(
|
||||
child: _buildCounterCell(context, counter),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCounterCell(BuildContext context, ObjectCounter counter) {
|
||||
final color = counter.isOver
|
||||
? Colors.red.shade100
|
||||
: counter.isComplete
|
||||
? Colors.green.shade100
|
||||
: Colors.white;
|
||||
|
||||
return Container(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 2),
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
counter.label,
|
||||
style: const TextStyle(
|
||||
fontSize: 11,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'${counter.currentCount}',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: counter.isOver ? Colors.red : Colors.black87,
|
||||
),
|
||||
),
|
||||
if (showDifferences && counter.targetCount > 0) ...[
|
||||
const SizedBox(height: 2),
|
||||
Text(
|
||||
'${counter.difference > 0 ? "+" : ""}${counter.difference}',
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
color: counter.difference == 0
|
||||
? Colors.green
|
||||
: counter.difference > 0
|
||||
? Colors.orange
|
||||
: Colors.red,
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Color _getGroupColor(String title) {
|
||||
switch (title.toLowerCase()) {
|
||||
case 'bestand fzg':
|
||||
return const Color(0xFFA4D4F0); // Hellblau wie in Lua
|
||||
case 'beladezähler':
|
||||
case 'hadag':
|
||||
case 'sst':
|
||||
case 'cr':
|
||||
return Colors.grey.shade200;
|
||||
default:
|
||||
return Colors.grey.shade200;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Vereinfachte Zähler-Anzeige für eine Zeile
|
||||
class CounterRow extends StatelessWidget {
|
||||
final String label;
|
||||
final int count;
|
||||
final Color? backgroundColor;
|
||||
final VoidCallback? onTap;
|
||||
|
||||
const CounterRow({
|
||||
super.key,
|
||||
required this.label,
|
||||
required this.count,
|
||||
this.backgroundColor,
|
||||
this.onTap,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor ?? Colors.grey.shade100,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
border: Border.all(color: Colors.grey.shade300),
|
||||
),
|
||||
child: Text(
|
||||
'$count',
|
||||
style: const TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user