2021-10-22 23:08:09 +00:00
|
|
|
import 'package:diameter/components/detail.dart';
|
|
|
|
import 'package:diameter/components/dialogs.dart';
|
2021-11-09 00:17:35 +00:00
|
|
|
import 'package:diameter/components/forms.dart';
|
2021-10-22 23:08:09 +00:00
|
|
|
import 'package:diameter/config.dart';
|
2021-11-24 23:19:27 +00:00
|
|
|
import 'package:diameter/models/log_bolus.dart';
|
2021-10-22 23:08:09 +00:00
|
|
|
import 'package:diameter/models/log_entry.dart';
|
2021-11-24 23:19:27 +00:00
|
|
|
import 'package:diameter/models/log_event.dart';
|
|
|
|
import 'package:diameter/models/log_meal.dart';
|
2021-10-22 23:08:09 +00:00
|
|
|
import 'package:diameter/navigation.dart';
|
2021-11-24 23:19:27 +00:00
|
|
|
import 'package:diameter/screens/log/log_entry/log_bolus_detail.dart';
|
|
|
|
import 'package:diameter/screens/log/log_entry/log_bolus_list.dart';
|
|
|
|
import 'package:diameter/screens/log/log_entry/log_event_list.dart';
|
|
|
|
import 'package:diameter/screens/log/log_entry/log_event_detail.dart';
|
|
|
|
import 'package:diameter/screens/log/log_entry/log_meal_detail.dart';
|
|
|
|
import 'package:diameter/screens/log/log_entry/log_meal_list.dart';
|
2021-11-09 00:17:35 +00:00
|
|
|
import 'package:diameter/settings.dart';
|
|
|
|
import 'package:diameter/utils/date_time_utils.dart';
|
|
|
|
import 'package:diameter/utils/utils.dart';
|
2021-10-22 23:08:09 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
class LogEntryScreen extends StatefulWidget {
|
|
|
|
static const String routeName = '/log-entry';
|
2021-11-07 20:13:28 +00:00
|
|
|
final int id;
|
|
|
|
|
|
|
|
const LogEntryScreen({Key? key, this.id = 0}) : super(key: key);
|
2021-10-22 23:08:09 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
_LogEntryScreenState createState() => _LogEntryScreenState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _LogEntryScreenState extends State<LogEntryScreen> {
|
2021-11-07 20:13:28 +00:00
|
|
|
LogEntry? _logEntry;
|
2021-11-24 23:19:27 +00:00
|
|
|
List<LogMeal> _logMeals = [];
|
|
|
|
List<LogEvent> _logEvents = [];
|
|
|
|
List<LogBolus> _logBoli = [];
|
2021-11-07 20:13:28 +00:00
|
|
|
bool _isNew = true;
|
|
|
|
bool _isSaving = false;
|
|
|
|
|
2021-10-22 23:08:09 +00:00
|
|
|
final GlobalKey<FormState> logEntryForm = GlobalKey<FormState>();
|
|
|
|
|
2021-11-09 00:17:35 +00:00
|
|
|
DateTime _time = DateTime.now();
|
|
|
|
|
|
|
|
final _timeController = TextEditingController(text: '');
|
|
|
|
final _dateController = TextEditingController(text: '');
|
|
|
|
final _mgPerDlController = TextEditingController(text: '');
|
|
|
|
final _mmolPerLController = TextEditingController(text: '');
|
|
|
|
final _bolusGlucoseController = TextEditingController(text: '');
|
|
|
|
final _delayedBolusRateController = TextEditingController(text: '');
|
|
|
|
final _delayedBolusDurationController = TextEditingController(text: '');
|
|
|
|
final _notesController = TextEditingController(text: '');
|
|
|
|
|
2021-10-22 23:08:09 +00:00
|
|
|
late FloatingActionButton addMealButton;
|
2021-11-24 23:19:27 +00:00
|
|
|
late FloatingActionButton addBolusButton;
|
2021-10-22 23:08:09 +00:00
|
|
|
late FloatingActionButton addEventButton;
|
|
|
|
late IconButton refreshButton;
|
|
|
|
late IconButton closeButton;
|
2021-10-27 19:00:28 +00:00
|
|
|
late DetailBottomRow detailBottomRow;
|
2021-10-22 23:08:09 +00:00
|
|
|
|
2021-10-27 19:00:28 +00:00
|
|
|
FloatingActionButton? actionButton;
|
|
|
|
List<Widget> appBarActions = [];
|
|
|
|
DetailBottomRow? bottomNav;
|
|
|
|
|
2021-11-07 20:13:28 +00:00
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
|
|
|
|
reload();
|
|
|
|
|
|
|
|
addMealButton = FloatingActionButton(
|
|
|
|
onPressed: handleAddNewMeal,
|
|
|
|
child: const Icon(Icons.add),
|
|
|
|
);
|
|
|
|
|
2021-11-24 23:19:27 +00:00
|
|
|
addBolusButton = FloatingActionButton(
|
|
|
|
onPressed: handleAddNewBolus,
|
|
|
|
child: const Icon(Icons.add),
|
|
|
|
);
|
|
|
|
|
2021-11-07 20:13:28 +00:00
|
|
|
addEventButton = FloatingActionButton(
|
|
|
|
onPressed: handleAddNewEvent,
|
|
|
|
child: const Icon(Icons.add),
|
|
|
|
);
|
|
|
|
|
|
|
|
refreshButton = IconButton(
|
|
|
|
icon: const Icon(Icons.refresh),
|
|
|
|
onPressed: reload,
|
|
|
|
);
|
|
|
|
|
|
|
|
closeButton = IconButton(
|
|
|
|
onPressed: handleCancelAction,
|
|
|
|
icon: const Icon(Icons.close),
|
|
|
|
);
|
|
|
|
|
|
|
|
detailBottomRow = DetailBottomRow(
|
|
|
|
onCancel: handleCancelAction,
|
|
|
|
onSave: _isSaving ? null : handleSaveAction,
|
|
|
|
);
|
|
|
|
|
|
|
|
actionButton = null;
|
|
|
|
appBarActions = [closeButton];
|
|
|
|
bottomNav = detailBottomRow;
|
2021-11-09 00:17:35 +00:00
|
|
|
|
|
|
|
if (_logEntry != null) {
|
|
|
|
_time = _logEntry!.time;
|
|
|
|
_mgPerDlController.text = (_logEntry!.mgPerDl ?? '').toString();
|
|
|
|
_mmolPerLController.text = (_logEntry!.mmolPerL ?? '').toString();
|
|
|
|
_bolusGlucoseController.text = (_logEntry!.bolusGlucose ?? '').toString();
|
|
|
|
_delayedBolusRateController.text =
|
|
|
|
(_logEntry!.delayedBolusRate ?? '').toString();
|
|
|
|
_delayedBolusDurationController.text =
|
|
|
|
(_logEntry!.delayedBolusDuration ?? '').toString();
|
|
|
|
_notesController.text = _logEntry!.notes ?? '';
|
|
|
|
}
|
|
|
|
|
|
|
|
updateTime();
|
2021-11-07 20:13:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void reload({String? message}) {
|
|
|
|
if (widget.id != 0) {
|
2021-10-22 23:08:09 +00:00
|
|
|
setState(() {
|
2021-11-07 20:13:28 +00:00
|
|
|
_logEntry = LogEntry.get(widget.id);
|
2021-11-24 23:19:27 +00:00
|
|
|
_logMeals = _logEntry?.meals ?? [];
|
|
|
|
_logEvents = _logEntry?.events ?? [];
|
|
|
|
_logBoli = _logEntry?.boli ?? [];
|
2021-10-22 23:08:09 +00:00
|
|
|
});
|
2021-11-07 20:13:28 +00:00
|
|
|
_isNew = _logEntry == null;
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
2021-11-07 20:13:28 +00:00
|
|
|
|
|
|
|
setState(() {
|
|
|
|
if (message != null) {
|
|
|
|
var snackBar = SnackBar(
|
|
|
|
content: Text(message),
|
|
|
|
duration: const Duration(seconds: 2),
|
|
|
|
);
|
|
|
|
ScaffoldMessenger.of(context)
|
|
|
|
..removeCurrentSnackBar()
|
|
|
|
..showSnackBar(snackBar);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-11-09 00:17:35 +00:00
|
|
|
void updateTime() {
|
|
|
|
_timeController.text = DateTimeUtils.displayTime(_time);
|
|
|
|
_dateController.text = DateTimeUtils.displayDate(_time);
|
2021-11-07 20:13:28 +00:00
|
|
|
}
|
|
|
|
|
2021-11-09 00:17:35 +00:00
|
|
|
void convertBetweenMgPerDlAndMmolPerL({GlucoseMeasurement? calculateFrom}) {
|
|
|
|
int? mgPerDl;
|
|
|
|
double? mmolPerL;
|
|
|
|
|
|
|
|
if (calculateFrom != GlucoseMeasurement.mmolPerL &&
|
|
|
|
_mgPerDlController.text != '') {
|
|
|
|
mgPerDl = int.tryParse(_mgPerDlController.text);
|
|
|
|
}
|
|
|
|
if (calculateFrom != GlucoseMeasurement.mgPerDl &&
|
|
|
|
_mmolPerLController.text != '') {
|
|
|
|
mmolPerL = double.tryParse(_mmolPerLController.text);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mgPerDl != null && mmolPerL == null) {
|
|
|
|
setState(() {
|
|
|
|
_mmolPerLController.text =
|
|
|
|
Utils.convertMgPerDlToMmolPerL(mgPerDl!).toString();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (mmolPerL != null && mgPerDl == null) {
|
|
|
|
setState(() {
|
|
|
|
_mgPerDlController.text =
|
|
|
|
Utils.convertMmolPerLToMgPerDl(mmolPerL!).toString();
|
|
|
|
});
|
|
|
|
}
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleSaveAction() async {
|
2021-10-27 19:00:28 +00:00
|
|
|
setState(() {
|
|
|
|
_isSaving = true;
|
|
|
|
});
|
2021-10-22 23:08:09 +00:00
|
|
|
if (logEntryForm.currentState!.validate()) {
|
2021-11-07 20:13:28 +00:00
|
|
|
LogEntry.put(LogEntry(
|
|
|
|
id: widget.id,
|
2021-11-09 00:17:35 +00:00
|
|
|
time: _time,
|
|
|
|
mgPerDl: int.tryParse(_mgPerDlController.text),
|
|
|
|
mmolPerL: double.tryParse(_mmolPerLController.text),
|
|
|
|
bolusGlucose: double.tryParse(_bolusGlucoseController.text),
|
2021-11-07 20:13:28 +00:00
|
|
|
delayedBolusDuration:
|
2021-11-09 00:17:35 +00:00
|
|
|
int.tryParse(_delayedBolusDurationController.text),
|
|
|
|
delayedBolusRate: double.tryParse(_delayedBolusRateController.text),
|
|
|
|
notes: _notesController.text,
|
2021-11-07 20:13:28 +00:00
|
|
|
));
|
2021-10-22 23:08:09 +00:00
|
|
|
Navigator.pushReplacementNamed(context, '/log',
|
2021-11-07 20:13:28 +00:00
|
|
|
arguments: '${_isNew ? 'New' : ''} Log Entry Saved');
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
2021-10-27 19:00:28 +00:00
|
|
|
setState(() {
|
|
|
|
_isSaving = false;
|
|
|
|
});
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleCancelAction() {
|
|
|
|
if (showConfirmationDialogOnCancel &&
|
2021-11-07 20:13:28 +00:00
|
|
|
((_isNew &&
|
2021-11-09 00:17:35 +00:00
|
|
|
(int.tryParse(_mgPerDlController.text) != null ||
|
|
|
|
double.tryParse(_mmolPerLController.text) != null ||
|
|
|
|
double.tryParse(_bolusGlucoseController.text) != null ||
|
|
|
|
int.tryParse(_delayedBolusDurationController.text) !=
|
2021-10-22 23:08:09 +00:00
|
|
|
null ||
|
2021-11-09 00:17:35 +00:00
|
|
|
double.tryParse(_delayedBolusRateController.text) != null ||
|
|
|
|
_notesController.text != '')) ||
|
2021-11-07 20:13:28 +00:00
|
|
|
(!_isNew &&
|
2021-11-09 00:17:35 +00:00
|
|
|
(int.tryParse(_mgPerDlController.text) != _logEntry!.mgPerDl ||
|
|
|
|
double.tryParse(_mmolPerLController.text) !=
|
2021-11-07 20:13:28 +00:00
|
|
|
_logEntry!.mmolPerL ||
|
2021-11-09 00:17:35 +00:00
|
|
|
double.tryParse(_bolusGlucoseController.text) !=
|
2021-11-07 20:13:28 +00:00
|
|
|
_logEntry!.bolusGlucose ||
|
2021-11-09 00:17:35 +00:00
|
|
|
int.tryParse(_delayedBolusDurationController.text) !=
|
2021-11-07 20:13:28 +00:00
|
|
|
_logEntry!.delayedBolusDuration ||
|
2021-11-09 00:17:35 +00:00
|
|
|
double.tryParse(_delayedBolusRateController.text) !=
|
2021-11-07 20:13:28 +00:00
|
|
|
_logEntry!.delayedBolusRate ||
|
2021-11-09 00:17:35 +00:00
|
|
|
_notesController.text != (_logEntry!.notes ?? ''))))) {
|
2021-10-22 23:08:09 +00:00
|
|
|
Dialogs.showCancelConfirmationDialog(
|
|
|
|
context: context,
|
2021-11-07 20:13:28 +00:00
|
|
|
isNew: _isNew,
|
2021-10-22 23:08:09 +00:00
|
|
|
onSave: handleSaveAction,
|
|
|
|
onDiscard: (context) => Navigator.pushReplacementNamed(context, '/log'),
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
Navigator.pushReplacementNamed(context, '/log',
|
2021-11-07 20:13:28 +00:00
|
|
|
arguments: '${_isNew ? 'New' : ''} Log Entry Saved');
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-09 00:17:35 +00:00
|
|
|
void handleAddNewMeal() async {
|
|
|
|
Navigator.push(
|
|
|
|
context,
|
|
|
|
MaterialPageRoute(
|
|
|
|
builder: (context) {
|
2021-11-24 23:19:27 +00:00
|
|
|
return LogMealDetailScreen(logEntryId: _logEntry!.id);
|
|
|
|
},
|
|
|
|
),
|
|
|
|
).then((message) => reload(message: message));
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleAddNewBolus() async {
|
|
|
|
Navigator.push(
|
|
|
|
context,
|
|
|
|
MaterialPageRoute(
|
|
|
|
builder: (context) {
|
|
|
|
return LogBolusDetailScreen(logEntryId: _logEntry!.id);
|
2021-11-09 00:17:35 +00:00
|
|
|
},
|
|
|
|
),
|
|
|
|
).then((message) => reload(message: message));
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleAddNewEvent() async {
|
|
|
|
Navigator.push(
|
|
|
|
context,
|
|
|
|
MaterialPageRoute(
|
|
|
|
builder: (context) {
|
2021-11-24 23:19:27 +00:00
|
|
|
return LogEventDetailScreen(logEntryId: _logEntry!.id);
|
2021-11-09 00:17:35 +00:00
|
|
|
},
|
|
|
|
),
|
|
|
|
).then((message) => reload(message: message));
|
|
|
|
}
|
|
|
|
|
2021-10-22 23:08:09 +00:00
|
|
|
void renderTabButtons(index) {
|
2021-11-07 20:13:28 +00:00
|
|
|
if (_logEntry != null) {
|
2021-10-22 23:08:09 +00:00
|
|
|
setState(() {
|
|
|
|
switch (index) {
|
|
|
|
case 1:
|
|
|
|
actionButton = addMealButton;
|
|
|
|
appBarActions = [refreshButton, closeButton];
|
2021-10-27 19:00:28 +00:00
|
|
|
bottomNav = null;
|
2021-10-22 23:08:09 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2021-11-24 23:19:27 +00:00
|
|
|
actionButton = addBolusButton;
|
|
|
|
appBarActions = [refreshButton, closeButton];
|
|
|
|
bottomNav = null;
|
|
|
|
break;
|
|
|
|
case 3:
|
2021-10-22 23:08:09 +00:00
|
|
|
actionButton = addEventButton;
|
|
|
|
appBarActions = [refreshButton, closeButton];
|
2021-10-27 19:00:28 +00:00
|
|
|
bottomNav = null;
|
2021-10-22 23:08:09 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
actionButton = null;
|
|
|
|
appBarActions = [closeButton];
|
2021-10-27 19:00:28 +00:00
|
|
|
bottomNav = detailBottomRow;
|
2021-10-22 23:08:09 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return DefaultTabController(
|
2021-11-24 23:19:27 +00:00
|
|
|
length: _isNew ? 1 : 4,
|
2021-10-22 23:08:09 +00:00
|
|
|
child: Builder(builder: (BuildContext context) {
|
|
|
|
final TabController tabController = DefaultTabController.of(context)!;
|
|
|
|
tabController.addListener(() {
|
2021-11-07 20:13:28 +00:00
|
|
|
renderTabButtons(tabController.index);
|
2021-10-22 23:08:09 +00:00
|
|
|
});
|
2021-10-25 23:11:58 +00:00
|
|
|
List<Widget> tabs = [
|
2021-11-09 00:17:35 +00:00
|
|
|
SingleChildScrollView(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
|
|
children: <Widget>[
|
|
|
|
FormWrapper(
|
|
|
|
formState: logEntryForm,
|
|
|
|
fields: [
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.only(right: 5),
|
|
|
|
child: DateTimeFormField(
|
|
|
|
date: _time,
|
|
|
|
label: 'Date',
|
|
|
|
controller: _dateController,
|
|
|
|
onChanged: (newTime) {
|
|
|
|
if (newTime != null) {
|
|
|
|
setState(() {
|
|
|
|
_time = DateTime(
|
|
|
|
newTime.year,
|
|
|
|
newTime.month,
|
|
|
|
newTime.day,
|
|
|
|
_time.hour,
|
|
|
|
_time.minute);
|
|
|
|
});
|
|
|
|
updateTime();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Expanded(
|
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.only(left: 5),
|
|
|
|
child: TimeOfDayFormField(
|
|
|
|
time: TimeOfDay.fromDateTime(_time),
|
|
|
|
label: 'Time',
|
|
|
|
controller: _timeController,
|
|
|
|
onChanged: (newTime) {
|
|
|
|
if (newTime != null) {
|
|
|
|
setState(() {
|
|
|
|
_time = DateTime(
|
|
|
|
_time.year,
|
|
|
|
_time.month,
|
|
|
|
_time.day,
|
|
|
|
newTime.hour,
|
|
|
|
newTime.minute);
|
|
|
|
});
|
|
|
|
updateTime();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
glucoseMeasurement == GlucoseMeasurement.mgPerDl ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.both ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.bothForDetail
|
|
|
|
? Expanded(
|
|
|
|
child: TextFormField(
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'mg/dl',
|
|
|
|
suffixText: 'mg/dl',
|
|
|
|
),
|
|
|
|
controller: _mgPerDlController,
|
|
|
|
onChanged: (_) =>
|
|
|
|
convertBetweenMgPerDlAndMmolPerL(
|
|
|
|
calculateFrom:
|
|
|
|
GlucoseMeasurement.mgPerDl),
|
|
|
|
keyboardType:
|
|
|
|
const TextInputType.numberWithOptions(),
|
|
|
|
validator: (value) {
|
|
|
|
if (value!.trim().isEmpty &&
|
|
|
|
_mmolPerLController.text
|
|
|
|
.trim()
|
|
|
|
.isEmpty) {
|
|
|
|
return 'How many mg/dl or mmol/l does the rate make up for?';
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
),
|
|
|
|
)
|
|
|
|
: Container(),
|
|
|
|
glucoseDisplayMode == GlucoseDisplayMode.both ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.bothForDetail
|
|
|
|
? IconButton(
|
|
|
|
onPressed: () =>
|
|
|
|
convertBetweenMgPerDlAndMmolPerL(
|
|
|
|
calculateFrom:
|
|
|
|
GlucoseMeasurement.mmolPerL),
|
|
|
|
icon: const Icon(Icons.calculate),
|
|
|
|
)
|
|
|
|
: Container(),
|
|
|
|
glucoseMeasurement == GlucoseMeasurement.mmolPerL ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.both ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.bothForDetail
|
|
|
|
? Expanded(
|
|
|
|
child: TextFormField(
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'mmol/l',
|
|
|
|
suffixText: 'mmol/l',
|
|
|
|
),
|
|
|
|
controller: _mmolPerLController,
|
|
|
|
onChanged: (_) =>
|
|
|
|
convertBetweenMgPerDlAndMmolPerL(
|
|
|
|
calculateFrom:
|
|
|
|
GlucoseMeasurement.mmolPerL),
|
|
|
|
keyboardType:
|
|
|
|
const TextInputType.numberWithOptions(
|
|
|
|
decimal: true),
|
|
|
|
validator: (value) {
|
|
|
|
if (value!.trim().isEmpty &&
|
|
|
|
_mgPerDlController.text
|
|
|
|
.trim()
|
|
|
|
.isEmpty) {
|
|
|
|
return 'How many mg/dl or mmol/l does rhe rate make up for?';
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
),
|
|
|
|
)
|
|
|
|
: Container(),
|
|
|
|
glucoseDisplayMode == GlucoseDisplayMode.both ||
|
|
|
|
glucoseDisplayMode ==
|
|
|
|
GlucoseDisplayMode.bothForDetail
|
|
|
|
? IconButton(
|
|
|
|
onPressed: () =>
|
|
|
|
convertBetweenMgPerDlAndMmolPerL(
|
|
|
|
calculateFrom:
|
|
|
|
GlucoseMeasurement.mgPerDl),
|
|
|
|
icon: const Icon(Icons.calculate),
|
|
|
|
)
|
|
|
|
: Container(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
TextFormField(
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'Bolus Units',
|
|
|
|
suffixText: 'U',
|
|
|
|
),
|
|
|
|
controller: _bolusGlucoseController,
|
|
|
|
keyboardType: const TextInputType.numberWithOptions(
|
|
|
|
decimal: true),
|
|
|
|
),
|
|
|
|
// ignore: todo
|
|
|
|
// TODO: change field functionality according to time format
|
|
|
|
TextFormField(
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'Delayed Bolus Duration',
|
|
|
|
suffixText: ' min',
|
|
|
|
),
|
|
|
|
controller: _delayedBolusDurationController,
|
|
|
|
keyboardType: TextInputType.number,
|
|
|
|
),
|
|
|
|
TextFormField(
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'Delayed Bolus Units',
|
|
|
|
),
|
|
|
|
controller: _delayedBolusRateController,
|
|
|
|
keyboardType: const TextInputType.numberWithOptions(
|
|
|
|
decimal: true),
|
|
|
|
),
|
|
|
|
TextFormField(
|
|
|
|
controller: _notesController,
|
|
|
|
decoration: const InputDecoration(
|
|
|
|
labelText: 'Notes',
|
|
|
|
alignLabelWithHint: true,
|
|
|
|
),
|
|
|
|
keyboardType: TextInputType.multiline,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
]),
|
|
|
|
),
|
2021-10-25 23:11:58 +00:00
|
|
|
];
|
|
|
|
|
2021-11-07 20:13:28 +00:00
|
|
|
if (!_isNew) {
|
2021-11-24 23:19:27 +00:00
|
|
|
tabs.add(LogMealListScreen(
|
|
|
|
logEntry: _logEntry!, logMeals: _logMeals, reload: reload));
|
|
|
|
tabs.add(LogBolusListScreen(
|
|
|
|
logEntry: _logEntry!, logBoli: _logBoli, reload: reload));
|
|
|
|
tabs.add(LogEventListScreen(
|
|
|
|
logEntry: _logEntry!, logEvents: _logEvents, reload: reload));
|
2021-10-25 23:11:58 +00:00
|
|
|
}
|
|
|
|
|
2021-10-22 23:08:09 +00:00
|
|
|
return Scaffold(
|
|
|
|
appBar: AppBar(
|
2021-11-07 20:13:28 +00:00
|
|
|
title: Text(_isNew ? 'New Log Entry' : 'Edit Log Entry'),
|
|
|
|
bottom: _isNew
|
2021-10-22 23:08:09 +00:00
|
|
|
? PreferredSize(child: Container(), preferredSize: Size.zero)
|
|
|
|
: const TabBar(
|
|
|
|
tabs: [
|
|
|
|
Tab(text: 'GENERAL'),
|
|
|
|
Tab(text: 'MEALS'),
|
2021-11-24 23:19:27 +00:00
|
|
|
Tab(text: 'BOLI'),
|
2021-10-22 23:08:09 +00:00
|
|
|
Tab(text: 'EVENTS'),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
actions: appBarActions,
|
|
|
|
),
|
|
|
|
drawer: const Navigation(currentLocation: LogEntryScreen.routeName),
|
|
|
|
body: TabBarView(
|
2021-10-25 23:11:58 +00:00
|
|
|
children: tabs,
|
2021-10-22 23:08:09 +00:00
|
|
|
),
|
2021-10-27 19:00:28 +00:00
|
|
|
bottomNavigationBar: bottomNav,
|
2021-10-22 23:08:09 +00:00
|
|
|
floatingActionButton: actionButton,
|
2021-11-09 00:17:35 +00:00
|
|
|
floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
|
2021-10-22 23:08:09 +00:00
|
|
|
);
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|