-
Notifications
You must be signed in to change notification settings - Fork 5
/
cabins_table.dart
81 lines (77 loc) · 3.16 KB
/
cabins_table.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import 'package:cabin_booking/model/cabin.dart';
import 'package:cabin_booking/model/cabin_manager.dart';
import 'package:cabin_booking/model/date_range.dart';
import 'package:cabin_booking/utils/misc.dart';
import 'package:cabin_booking/utils/datetime.dart';
import 'package:cabin_booking/widgets/cabin/cabin_dialog.dart';
import 'package:cabin_booking/widgets/item/items_table.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart';
class CabinsTable extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<CabinManager>(
builder: (context, cabinManager, child) {
final appLocalizations = AppLocalizations.of(context);
return ItemsTable(
itemTitle: (row) => '${row.item.number}',
itemIcon: Icons.sensor_door,
itemHeaderLabel: appLocalizations.cabin,
emptyMessage: appLocalizations.noCabinsMessage,
onEditPressed: (selectedRows) async {
final selectedCabin = selectedRows.first;
final editedCabin = await showDialog<Cabin>(
context: context,
builder: (context) => CabinDialog(cabin: selectedCabin.item),
);
if (editedCabin != null) {
cabinManager.modifyCabin(editedCabin);
}
},
onEmptyPressed: (selectedIds) =>
cabinManager.emptyCabinsByIds(selectedIds),
onEmptyTitle: appLocalizations.emptyCabinTitle,
onRemovePressed: (selectedIds) =>
cabinManager.removeCabinsByIds(selectedIds),
onRemoveTitle: appLocalizations.deleteCabinTitle,
rows: [
for (final cabin in cabinManager.cabins)
ItemsTableRow<Cabin>(
item: cabin,
bookingsCount: cabin.bookings.length,
recurringBookingsCount:
cabin.generatedBookingsFromRecurring.length,
occupiedDuration: cabin.occupiedDuration(),
occupiedDurationPerWeek: fillEmptyKeyValues(
cabin.occupiedDurationPerWeek(
DateRange(
startDate: DateTime.now().subtract(
const Duration(days: 365),
),
endDate: DateTime.now(),
),
),
keys: DateRange.rangeDateTimeList(
firstWeekDate(
DateTime.now().subtract(const Duration(days: 365)),
),
firstWeekDate(DateTime.now()),
interval: const Duration(days: DateTime.daysPerWeek),
),
ifAbsent: () => const Duration(),
),
mostOccupiedTimeRanges: compactizeRange<TimeOfDay>(
cabin.mostOccupiedTimeRange(),
nextValue: (timeOfDay) => timeOfDay.replacing(
hour: (timeOfDay.hour + 1) % TimeOfDay.hoursPerDay,
),
inclusive: true,
),
),
],
);
},
);
}
}