158 lines
4.9 KiB
Dart
158 lines
4.9 KiB
Dart
|
import 'package:ambito/src/entity/cart/cart_element.dart';
|
||
|
import 'package:ambito/src/entity/entities.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
|
||
|
|
||
|
import '../../packages/ambito_theme/ambito_theme.dart';
|
||
|
|
||
|
class CartDataSource extends DataGridSource {
|
||
|
CartDataSource(
|
||
|
{required List<CartElement> cartElements, required this.context}) {
|
||
|
dataGridRows = cartElements
|
||
|
.map<DataGridRow>(
|
||
|
(dataGridRow) => DataGridRow(
|
||
|
cells: [
|
||
|
DataGridCell<String>(
|
||
|
columnName: 'name',
|
||
|
value: dataGridRow.name,
|
||
|
),
|
||
|
DataGridCell<String>(
|
||
|
columnName: 'amount',
|
||
|
value: dataGridRow.amount,
|
||
|
),
|
||
|
DataGridCell<List<IdValue>>(
|
||
|
columnName: 'provider',
|
||
|
value: dataGridRow.provider,
|
||
|
),
|
||
|
DataGridCell<String>(
|
||
|
columnName: 'price',
|
||
|
value: dataGridRow.price.toString(),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
)
|
||
|
.toList();
|
||
|
}
|
||
|
|
||
|
final BuildContext context;
|
||
|
|
||
|
List<DataGridRow> dataGridRows = [];
|
||
|
|
||
|
@override
|
||
|
List<DataGridRow> get rows => dataGridRows;
|
||
|
|
||
|
@override
|
||
|
DataGridRowAdapter? buildRow(DataGridRow row) {
|
||
|
final AmbitoTheme theme = getTheme(context);
|
||
|
|
||
|
double completePrice = double.tryParse(row
|
||
|
.getCells()
|
||
|
.where((cell) => cell.columnName == 'price')
|
||
|
.first
|
||
|
.value
|
||
|
.toString() ??
|
||
|
'0.0') ??
|
||
|
0;
|
||
|
|
||
|
int amount = int.tryParse(row
|
||
|
.getCells()
|
||
|
.where((cell) => cell.columnName == 'amount')
|
||
|
.first
|
||
|
.value
|
||
|
.toString() ??
|
||
|
'0') ??
|
||
|
0;
|
||
|
|
||
|
if (amount > 1) {
|
||
|
completePrice = completePrice * amount;
|
||
|
}
|
||
|
|
||
|
return DataGridRowAdapter(
|
||
|
cells: row.getCells().map<Widget>(
|
||
|
(dataGridCell) {
|
||
|
if (dataGridCell.columnName == 'provider') {
|
||
|
final providerString =
|
||
|
dataGridCell.value.map((ele) => ele.value).toList().join(', ');
|
||
|
return Container(
|
||
|
alignment: Alignment.centerLeft,
|
||
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||
|
child: Text(
|
||
|
providerString,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
style: theme.bodyMedium.copyWith(
|
||
|
color: theme.currentColorScheme.primary,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (dataGridCell.columnName == 'price') {
|
||
|
final priceString = amount == 1
|
||
|
? '${dataGridCell.value ?? '0'}€'
|
||
|
: '${completePrice.toStringAsFixed(2)}€ (${dataGridCell.value ?? '0'}€ pro Stk.)';
|
||
|
return Container(
|
||
|
alignment: Alignment.centerLeft,
|
||
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||
|
child: Text(
|
||
|
priceString,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
style: theme.bodyMedium.copyWith(
|
||
|
color: theme.currentColorScheme.primary,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
if (dataGridCell.columnName == 'amount') {
|
||
|
return Container(
|
||
|
alignment: Alignment.centerLeft,
|
||
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||
|
child: Row(
|
||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||
|
children: [
|
||
|
IconButton(
|
||
|
icon: Icon(
|
||
|
Icons.remove,
|
||
|
color: Theme.of(context).colorScheme.secondary,
|
||
|
),
|
||
|
padding:
|
||
|
EdgeInsets.symmetric(vertical: 4.0, horizontal: 18.0),
|
||
|
iconSize: 16.0,
|
||
|
color: Theme.of(context).primaryColor,
|
||
|
onPressed: () {},
|
||
|
),
|
||
|
Text(
|
||
|
dataGridCell.value,
|
||
|
textAlign: TextAlign.center,
|
||
|
style: theme.bodyMedium,
|
||
|
),
|
||
|
IconButton(
|
||
|
icon: Icon(
|
||
|
Icons.add,
|
||
|
color: Theme.of(context).colorScheme.secondary,
|
||
|
),
|
||
|
padding:
|
||
|
EdgeInsets.symmetric(vertical: 4.0, horizontal: 18.0),
|
||
|
iconSize: 16.0,
|
||
|
color: Theme.of(context).primaryColor,
|
||
|
onPressed: () {},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
return Container(
|
||
|
alignment: Alignment.centerLeft,
|
||
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||
|
child: Text(
|
||
|
dataGridCell.value.toString(),
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
style: theme.bodyMedium.copyWith(
|
||
|
color: theme.currentColorScheme.primary,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
},
|
||
|
).toList());
|
||
|
}
|
||
|
}
|